签到天数: 2146 天 [LV.Master]伴坛终老
|
, y* c# V( X% F6 X4 W4 jARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000* q$ b8 J" a5 L& V/ H9 W
0 S- M5 Z( M `- Y s6 s
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
+ X3 F g5 ?: L' ~1 D- u( ]9 }) z, g! }4 H2 i6 I
Kingcom's website:http://aerie.wingdreams.net- @. v9 ~% l: `& w6 f$ v, g0 T W/ w
: P/ i; ~) X* ?+ Z
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得+ u4 h: Q4 [% a# f3 ^! K. A
7 }$ c) u7 p* v, n
更新版本可去http://buildbot.orphis.net/armips获得
k4 I) V. o! B0 G4 d/ r$ p- k# X8 v/ j& ^# h4 k
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
7 ?( |3 l# C" i( G" G& ]. Z# G D
- ~) B( ?2 Q& O5 [ ^9 RARMIPS命令行用法:
+ Q9 [9 U- `8 z* `+ l. q% O8 j* [1 u3 S6 A& S
Usage: armips [optional parameters] <FILE>' \7 U* @8 Y2 L
, T ]: L: p+ \! D Y) x
Optional parameters:; {. X. a0 W1 D, R# H+ Z
-temp <TEMP> Output temporary assembly data to <TEMP> file
( } u! Z! w! |0 [ -sym <SYM> Output symbol data in the sym format to <SYM> file% w9 T+ V+ B* Y) v% `8 E6 W
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file, O/ n3 ?% j9 u1 S
-root <ROOT> Use <ROOT> as working directory during execution
3 ?! Z+ q! J4 ]+ t -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code6 J Q& [( u- y3 A( [& {
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code" f3 z% J9 k2 C4 i6 z
-erroronwarning Treat all warnings like errors' S; }9 @& S% j3 ~
0 \2 q" r$ R; O5 h. J* O
File arguments:
8 j5 ?/ q6 r5 b9 w5 S# i <FILE> Main assembly code file* z) n% [! \- D8 e3 Q1 g. }
2 n+ v& w. R8 @, W" X7 S( ]-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件( C! |9 K+ ]" \
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba3 [* d+ w5 m% `- z* U; A; \
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp, S$ x) F# r. R! I! \6 t9 r
-root <ROOT>参数是指定执行期间要使用的工作目录0 H- y4 ?: c N) i5 @; ~4 j
-equ <NAME> <VAL>参数用法不明
! I$ ?5 v! {% O7 f& z8 ^% P-strequ <NAME> <VAL>参数用法不明
/ a' R r N9 p" P-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
# C2 q& Z( ~2 V/ A Y: J8 S5 l% c
: u* u$ v, s. ^ Y<FILE>是汇编代码文件,可用记事本之类编辑
m6 |) N4 ~5 n# h/ i3 m# V3 f9 d8 `
注释说明:8 {, m2 T. \! D4 R+ ~* I4 t
注释可在单行指令后面“;”和“//”添加
0 z$ a+ C& P2 m) I9 D" w! G“/* */”式也接受
; [; B: U4 g w& Q3 H; `7 \. k% Y: W, b* Z1 m& L! {& B
例子:
\% x1 P: Z2 G4 M.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
( }! O) Y/ l$ o& I1 w5 p8 {4 d8 U
.close;/*关闭文件*/ b# L* \1 N- ~2 L- W2 v9 L
! n' P2 c8 H& r. ~* H/ u* p H
标签说明:* o6 A" v+ A9 y/ |; \3 x& E# p) _/ ?
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。3 \+ |6 X- W1 j3 @/ r$ P
* ?6 w4 y1 W5 k, u7 L8 j* H
数值说明:
9 K5 w- d9 O1 b ? ?0 f“0xA”和“0Ah”是16进制数值: d7 c1 N9 w( U: a: E* Z
“0o12”和“12o”是8进制数值
- z v/ L! C9 c4 W5 w& |! I; |$ m“1010b”和“0b1010”是2进制数值( b1 s' F+ }" r1 |6 o7 H; m" Y4 Z
& u6 D/ i2 M3 V; u: b
equ说明:# `. k& U! _( K/ Z `: W" b. t
格式:text equ value6 n. S' }% h5 m* G" q% j# e
说明:用一个text代替value9 Z5 N% [( }3 v& \
例子:9 O1 F* t( j6 ~7 t8 N9 ^
address1 equ 0x12345678
+ n* V- v2 U& ?- m& rldr r0,=address1* l6 V$ i; q6 j" |
.pool3 J( {' S1 }5 X( |+ P; j2 r' p; l
) j/ l% ~& f" {
函数说明:! ~# ~7 ^: M: n/ E) b% M
2 b- [( R0 U! `8 z.open函数:
# b+ H- S% j; p格式:4 L) Z4 ?* A6 P( r9 I
.open "ROM FileName",offset
$ ?0 v8 \9 w6 L. O1 k.open "Old FileName","New FileName",offset
% V6 b6 L. g* P9 S5 A说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。0 n. K% i( M2 }! ?8 H1 L
Z' p9 V2 `3 ~: v. e7 P
例子:
: w& K8 `- E: s$ t8 S.open "1234.gba",0x08000000
& V; q3 I R) o
9 I! d; Z7 H! `# }.close函数和.closefile函数:" D, o9 |5 o& D. \( u
格式:
- T ^9 k; y& Z2 E$ R$ Z3 l% b.close/ S" x" q+ r A* i
.closefile
* ]* ]. b4 T6 r说明:关闭文件。7 J! z6 p- @3 }4 Z) l
" [( ?) S3 ?- u$ Z8 N6 E0 O
.org函数和.orga函数:/ o V7 b. G/ {, y7 J
格式:
# P: a' i, Q) ~4 u8 k.org RamAddress A, ^- q0 S; U' v
.orga FileAddress2 y' y; n! a* C
说明:6 ^, K3 f! F/ @3 }3 t1 G! ?% K
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
# J1 s9 O1 B4 v1 s; t) B3 i; l
.orga函数可指定ROM文件的输出地址。! U$ A4 w7 u7 r7 Q
# k o4 e1 F% |9 @
.create函数和.createfile函数
9 ~9 N; w+ I! Z" C3 t, B; m$ b格式:
9 C& R* Z) H: y2 C+ p.create "FileName",offset
, {9 S! v5 }" F: |; [ L.createfile "FileName",offset
/ g: V: k- a" u( S1 [3 O: f说明:创建一个文件,如果文件是存在,他会覆盖掉。
( b" _2 C V, m6 s- H# C1 [2 m3 s/ e6 L' j% R, W# X5 \
.area函数7 S. }; c1 U7 |
格式:) Y7 C* R3 y Y% d5 s6 i$ B2 ^4 g
.area SizeEquation[,fill]; u: h- E& ]& ? c
.endarea' T* e% G6 m7 o$ S3 ^
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败* Q2 J% w9 O& |. A- m
. ]: @- e, X( c4 k3 w
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据7 G% [$ c- P$ L$ N3 t
org 0x100
: a- ~( B9 ]$ |& w$ s q5 A m.area 0x8: A0 Y3 ? i# Y4 w& |8 X ]: z
byte 0x5,0x6,0x7,0x86 ]' u/ \' }- u+ B W* R2 f; {4 ]' ]
.endarea
0 n% h N) y3 M! w0 ]6 g; v ]' P! z% D e2 U
.align函数/ r0 v1 I X' W& W' h
格式:.align num
% B- c! ^8 X2 `3 k. v/ e说明:写零字节,num为零字节数量,用16进制表示。8 U7 d. x2 Q: T" Q, l
$ u+ _- i6 G' E7 y.pool函数
9 c. ]; Z, ]0 Q" V3 v格式:.pool3 t# [0 w3 r# ?! t2 |* k, m
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
% s3 E) O9 u2 Z, a. P2 o# U* v例子:
- V1 P3 e4 |, G# K5 gldr r0,=0x12345678;
) z0 P4 h! V7 r- O2 V( V6 E....! c y9 l" M/ I
.pool. @4 J1 J, I- }8 x
/ D9 d# t$ T2 x8 d/ ].fill函数! }5 C0 B7 ] |8 q
格式:
5 b* H0 S' a0 Q; F.fill length[,value]! f* o- E" U, k: L3 h3 D& x
defs length[,value] r& y1 y+ X4 F- g) g6 y5 C( b7 _
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。0 n) s, v, E" a) I# f
2 Y' _% I& v9 s+ J% o
.skip函数:
4 b; {5 c7 R0 v ]" c @7 E5 i" I格式:.skip length* C* z5 w) ?9 Z% F e
说明:跳过指定长度单字节数值,length用16进制表示。
" k; R9 n0 e& {: Q# y
; d, F! u- }4 x# g写单字节:
3 E5 J; W/ B& | d9 N, r0 M.byte value[,...]
3 p% L; s0 q% K+ m.db value[,...]
6 K# x6 ^) x" Y.ascii value[,...]' |" l( X# ] p& }, ?2 b+ P1 T
.asciiz value[,...]$ ]9 K% r: J$ N+ c0 ]
dcb value[,...]8 s- X5 v: n! e: V3 E3 j0 ^2 H
$ c9 E5 \( B2 ?4 D9 |
写双字节:# }# n/ F0 i) {1 r/ |# w% }
.halfword value[,...], w% m2 e+ }2 @' _
.dh value[,...]
, {; s5 `( n2 w7 m' y4 D4 Ldcw value[,...], H7 Q4 l# H: [- x" B
2 F1 B p* A3 O# M& h) v8 H R写四字节:
- v6 l6 F* N H& G.word value[,...]% ]9 P: h/ e( n) _. `% Q3 G8 }9 x
.dw value[,...]
$ V* F1 p7 \! F e# pdcd value[,...]
) a; J" e W7 w3 Q- R% L$ ]2 n( ~9 k1 t( {/ J) d
写doublewords:
# J# D, ~. V+ N: n& K.doubleword value[,...]
8 S# f0 r' J( U: T.dd value[,...]
9 T) j, j. T" @* h4 xdcq value[,...]
6 }) }$ P4 q% m* @$ M6 ?# U. G. G6 p; _
写浮点数:
1 f+ E8 Y5 I O7 Q.float value[,...]4 K( J, A! T0 U+ X0 y: t$ k# j
.double value[,...]/ `3 e! @$ |# f
8 K9 P( b- i% j8 }1 p9 Q
ARM的ARM模式和THUMB模式定义:; y# ?' M( N/ v% x+ M+ n9 t9 p
.arm|ARM模式% N, x, V5 P* C( x
.thumb|thumb模式
5 E" @% v1 ]! J# O* b! ^, \ ^ A8 \8 b' k
设置架构:: ^" r$ d. `5 V2 n4 @
.psx|PlayStation 1(MIPS R3000)2 R! i" ~. J0 g9 |7 Y
.ps2|PlayStation 2(EmotionEngine)
. P# S9 Y8 s% s. M.psp|PlayStation Portable(Allegrex)* q: P2 }4 W [* z/ w1 L6 W" g* X9 y
.n64|Nintendo 64(MIPS R4000)3 n9 X) d4 A2 r+ y4 I! m$ y
.rsp|Nintendo 64(RSP)! C9 _0 r4 E, t' |4 R7 u" d& Q* `: j
.gba|GameBoy Advance(ARM7,默认是thumb模式)8 F! M. }+ C& }5 ?) T
.nds|Nintendo DS(ARM9,默认是ARM模式)( y7 u8 \* ]/ H" O% E! c
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
( r( D1 D6 }9 N P.arm.big|5 S# x! t6 P/ }! L! T' | @1 ~
.arm.little|3 u. r @% e/ J& a$ z" ]
) C! L T& E3 g$ Z: `常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
4 K( p: O. z6 l0 r/ ^, L. ~ o0 ^ |
|