签到天数: 1773 天 [LV.Master]伴坛终老
|
* ?( C& N2 v7 IARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
- }: x# Y9 ]: v. `
5 d/ Y8 }6 k$ YARMIPS assembler作者是Kingcom,目前发展到0.9版本( r* Y7 W. H3 t: ?
8 d R5 `( \6 P g- }1 @! \& m' qKingcom's website:http://aerie.wingdreams.net
i- W5 V5 |1 M# ?! Z' n/ s; m; |* b5 w/ F# ?
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得* E4 f' ~. W5 E6 j. \
# z: }3 P/ o) E7 Y
更新版本可去http://buildbot.orphis.net/armips获得0 m, A4 U2 _0 d1 u( z6 c2 u% M2 r
2 K5 l9 e/ I5 n; J, s! o% NARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
2 k& [. ]& Z( u2 T( W: n) u: W( y" v# }3 K
ARMIPS命令行用法:- ~4 A" w! p3 g6 P" I e
* x& R6 Y: H5 G# Q/ w/ w
Usage: armips [optional parameters] <FILE>1 z9 U$ c1 X) D7 L" Q9 @9 ?& C% N
2 f9 t4 s& I* J, S8 i: ZOptional parameters:
8 \) m: `3 X0 `8 C, @ -temp <TEMP> Output temporary assembly data to <TEMP> file
* A; p T* D% K1 G. D* F& I* u -sym <SYM> Output symbol data in the sym format to <SYM> file+ s3 T/ l! I- q6 y
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
/ S% t) {( E/ X -root <ROOT> Use <ROOT> as working directory during execution
8 [* Q7 f; F2 r) Q+ M& j -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
+ w/ Y# q, [# Q, y- i# L% G. Y -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
$ s& M* l: i! X4 B -erroronwarning Treat all warnings like errors6 \5 @6 ?, W+ t1 o" s" E
' e! _. v! l. z0 X7 F
File arguments:4 z& h1 [) Y* N( U) R' P* k3 `
<FILE> Main assembly code file
; q; |$ G8 H+ B, U/ t# Y# w1 J
% [5 ]! R' E8 G: ]-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
5 H. n& h3 O* `-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba* m" h. X2 Q0 J
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
$ Q2 C9 H0 W9 L1 h! A. n-root <ROOT>参数是指定执行期间要使用的工作目录
7 d* G- H! S* r* s-equ <NAME> <VAL>参数用法不明8 n, N. a# O" S+ y
-strequ <NAME> <VAL>参数用法不明
+ }: f2 u. n. M5 l/ E! V-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译) f8 z2 s5 ]( Y
6 w. t( Q" w% x- c+ d" k" p
<FILE>是汇编代码文件,可用记事本之类编辑/ R$ R+ p T/ }7 c
; w& {+ Q7 g+ b g- h) P
注释说明:4 s4 j* v7 \$ p6 `9 b
注释可在单行指令后面“;”和“//”添加. X3 D0 ], P+ I& D1 t7 f3 X
“/* */”式也接受3 |0 G, k5 O6 M% Z8 {8 O
. T5 M* ~% g& W8 j5 Z例子:/ E" z; z- n6 d1 {. H# ] H
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
" N. P$ g' \& u+ O5 i
! e& K8 ]% B; N$ y.close;/*关闭文件*/
( D. E r" }7 k( Y" Q' K. F, b, G
3 o6 K" ?9 s! r. B, @% b4 Q) b标签说明:
y, M. f# G% \5 P. P6 N; J标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。2 k- k( V' A J/ q' s
' r; z3 N; t) i$ i数值说明:9 ^' o/ p k% Y; b
“0xA”和“0Ah”是16进制数值
6 H" \. Q0 s" J* L“0o12”和“12o”是8进制数值
4 N" u [0 h1 I“1010b”和“0b1010”是2进制数值1 {$ m; ?# |7 ~8 n% ~* I! S
; u( T: r" Q7 W' [& a3 Oequ说明:
5 b, p) @: e ?4 H; Y格式:text equ value( Z- Q. e: Y& f$ Y; U. n. y+ F# r% M
说明:用一个text代替value5 O( `# |8 B( T v( i$ g
例子:
7 p1 a4 B6 O' W) T) O. G3 Laddress1 equ 0x12345678
$ `1 W& `4 Q, l. ~. \7 qldr r0,=address1
$ o4 c. ^; m! y: C, x.pool
( J0 A" W, Y3 t0 y" j( `; B4 l6 N1 A$ i# u
函数说明:
4 g4 |# k0 t1 v# Q" S* }* V
I8 I/ }' v% ?, ~7 U2 W; G.open函数:3 L3 O9 s- e/ W5 `* l4 [0 Y
格式:
0 \7 O" l' T! n' w9 a.open "ROM FileName",offset0 \. k1 V* k# f/ q
.open "Old FileName","New FileName",offset% U" Q7 u( y- Y/ g0 @- ^
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
5 H, r# R! v, T. Z) r& b
) p7 W0 D% } u, |( Z0 G1 G例子:
6 [! W( }& f" U C" n! O.open "1234.gba",0x08000000$ _# u) A( Z. i4 R
, {) F4 j; f: E7 }.close函数和.closefile函数:+ A$ d$ B2 S* r2 `! ~
格式:
# W/ E5 v( b3 S8 ^2 d' P.close
* M1 y) E$ d# @4 Q. l.closefile
: q: j7 j" p# H% i3 H7 \+ j说明:关闭文件。( A# r& c$ @; `% Y
6 L6 b9 e7 y. |- d7 P0 \# D* F8 B.org函数和.orga函数:3 b0 `! [8 F) C
格式:1 b2 p7 G7 f8 `( a
.org RamAddress
# D1 E5 ]; K0 z1 }; Z5 e6 g.orga FileAddress
4 p3 r. I# B& V' Z) K9 V说明:# N* C8 T- |( U- A7 Y
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
2 {& `8 X$ G5 }9 }" G' r
0 Z% K/ m) ^: S2 h1 y+ a.orga函数可指定ROM文件的输出地址。; d) n. h# \: c. m
: I; x. k5 d6 Y9 R.create函数和.createfile函数! @8 t" S2 J7 X1 B+ Q9 M1 J
格式:
% N9 K$ g) D& O! C.create "FileName",offset
9 k w7 R8 ^8 R5 D, Q.createfile "FileName",offset( C# `0 o2 Z- ]( c# O* l9 n; h
说明:创建一个文件,如果文件是存在,他会覆盖掉。
* Q: U+ X9 b8 t7 a( b
# _8 j/ g9 j P( V* ^. u.area函数: N; ^ [$ P2 f) j) f
格式:
4 O2 C) N+ C( J. z p! }4 U$ m: B.area SizeEquation[,fill]
. Q- Q" G2 n, y.endarea; V, _% W. f( D0 A1 s; `
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败6 A e+ y9 J( y$ d
9 _& `( ?: y* y例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
- o% a% s) F/ k, forg 0x100; [* ~7 B) v9 ^% ^
.area 0x8( j" [4 `( S5 ~- [
byte 0x5,0x6,0x7,0x8
9 p; t U! ?1 b& c0 R4 u, i.endarea' Q+ _& e2 y% [4 V3 ]# P& {' S
3 g& p0 _9 p; U" S( N1 Y; S9 I
.align函数# l, b; N: O( V/ a4 ~# e' s
格式:.align num$ y3 H7 M; T' K, O
说明:写零字节,num为零字节数量,用16进制表示。
/ j7 N4 U) I: t2 N- S9 ] F
1 `3 R. J5 l+ d% u& K6 c.pool函数
# _2 d! C1 m5 `0 G, r7 B. K5 d格式:.pool- M* j6 i" [; \2 L& A6 k' Z$ G: F
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
1 N+ W$ o% B9 R1 Y例子:0 D( J, O, J9 f0 k8 T
ldr r0,=0x12345678;7 t+ ]0 S) c( ]( X2 H; ^5 q
....
' F0 D2 u" V5 P. E.pool
( L$ F! }" k r& ?. ]: P0 t' w- W% i$ t5 M( L! H
.fill函数1 q0 H/ \8 U% t. K4 _* }" Y& D
格式:
- N, e `# E5 K3 h2 E( l8 k.fill length[,value]
5 A6 L4 a0 h' N6 D `2 c. E9 Tdefs length[,value]
# ~& h: p! T& s2 s* H! _说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
5 V) w" {" K% t: t; s
* |& l. t4 J; C8 F K+ a! A3 J$ B.skip函数:' r# ^& H5 H1 X7 g# `
格式:.skip length
& {5 z* ]) V9 f B0 }. l8 R说明:跳过指定长度单字节数值,length用16进制表示。- e: F/ U% y! e0 z
: z* _+ V; ?8 B9 U4 r( q写单字节:( Y! M/ G. t( N0 f/ E
.byte value[,...]9 L0 s' ~. V! p6 h2 R
.db value[,...]) d5 U. G; ?5 \( T: o
.ascii value[,...]
; l1 i" S. H Y. s$ i& }7 \.asciiz value[,...]+ N8 N1 C6 h: K
dcb value[,...]
+ x' s3 z" T% s
2 [# x7 _" C% U0 k9 h5 H. g写双字节:
) T G( D( O& c2 t.halfword value[,...]
* z6 d! T1 ]1 Z) f! P" @- z.dh value[,...]
- T+ W: Z( h2 I, wdcw value[,...]
/ N9 p2 r; ~( D. L& |/ \$ v. q# B: P: B- Q$ X m, q
写四字节:3 k! v) V. F4 ~1 Z' E
.word value[,...]) V0 T: |8 k. ^. z. n1 v6 s. y
.dw value[,...]
1 f- V+ @4 }7 K& K3 K0 c( cdcd value[,...]
6 G" } C) C1 y% n" P. Q
' R2 w: P8 \0 ]* R) K$ k写doublewords:
# `, y' [" ^* M4 n.doubleword value[,...]5 ~% }+ g: Z7 a% b$ n$ F* t2 V1 E
.dd value[,...]
7 `6 ^' q) m# @0 q( U% p7 ^dcq value[,...]. {9 X7 h7 T" k0 H+ G& W
" J& X. K- U7 @5 {
写浮点数:
8 q1 Q# Z5 P" c3 w( J.float value[,...]$ J9 F- w) Y) y
.double value[,...]- K% A6 b+ ~, p3 X
. D5 h- ^2 m2 [* q. V
ARM的ARM模式和THUMB模式定义:
% E( I8 J. {6 x# N.arm|ARM模式
, r+ d2 g! g9 N1 m4 t) R.thumb|thumb模式7 e1 v5 C; ]2 |2 d8 x( d8 s5 u: T
5 J; h0 x: n6 Z; C7 C1 d: T设置架构:3 q& H" @) X& D
.psx|PlayStation 1(MIPS R3000)8 J" X# G/ y9 V7 r8 `) [
.ps2|PlayStation 2(EmotionEngine)
9 `1 H# \# M# s0 u; D$ }& p8 l.psp|PlayStation Portable(Allegrex)
3 H+ {# `+ t2 z& ~: }9 V.n64|Nintendo 64(MIPS R4000)
0 j9 c8 I/ g4 \! W.rsp|Nintendo 64(RSP)
3 R: C% }4 v& K2 T.gba|GameBoy Advance(ARM7,默认是thumb模式) H* ~! h3 t1 x0 p7 c
.nds|Nintendo DS(ARM9,默认是ARM模式)6 ^; r6 W' s6 V' [' X0 ~* |3 Y# |
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
; v v* u# G! u* h' C: {; R.arm.big|
4 u( L3 m: r% K6 c2 A.arm.little|& X" g) ^% I: ]: D \/ G
0 l, p0 V& v/ I% @& D) A0 @! Z
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。% x% k0 h- g4 l
|
|