签到天数: 2140 天 [LV.Master]伴坛终老
|
' l, v- K" N" O1 VARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
0 V$ _0 V. v& D I
2 C! ~2 }, H, p( CARMIPS assembler作者是Kingcom,目前发展到0.9版本2 @5 s o9 l) u8 M! \" E1 |2 N
' f5 V, J0 |2 \ g0 \9 r
Kingcom's website:http://aerie.wingdreams.net3 R0 |& P. x+ t9 |5 O3 {
; Z7 q- y# w' p2 k4 g% n& aARMIPS assembler源代码可去https://github.com/Kingcom/armips获得# p" M7 O' Q4 W
% Y5 d! N; [' W! |7 ]) h
更新版本可去http://buildbot.orphis.net/armips获得
7 h) H9 ]* y9 F; ? H# X3 X# l( c8 F' p) e
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。1 H1 `# P& ^6 Q y5 N
5 p% }5 ^2 F; H2 b/ h+ l1 g
ARMIPS命令行用法:! t' ?* U3 Y; C* e
/ t0 f; r. k. J
Usage: armips [optional parameters] <FILE>
* b, G6 v2 A- y+ R0 [" N( K/ w) m1 K# o* n
Optional parameters:
% i" D9 V8 b! ~ -temp <TEMP> Output temporary assembly data to <TEMP> file
! @2 s/ [& A n) h% f -sym <SYM> Output symbol data in the sym format to <SYM> file/ l" T/ ]0 @! U# _- L2 C
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file2 l, Q9 v5 r, }$ V* z5 ]
-root <ROOT> Use <ROOT> as working directory during execution
! k- j7 O0 b8 |2 l! L2 @! S -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
. _/ L, O2 K! P) p4 x -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
( f6 a% }; v. D7 e -erroronwarning Treat all warnings like errors
5 T; R! [$ L( G. X/ k( w+ a- K
& ^. C; c7 a0 u" Z. u' M" L, \- xFile arguments:+ I% y- E! F: c& h; U6 Q
<FILE> Main assembly code file
3 {" }" \2 n% d: I8 I' b3 ^* ^5 d$ Z$ r
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件1 P6 h8 h4 ` e; ?5 m" E. {, K* V
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba7 B0 l4 S, C- v
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
2 q7 U5 h, _" p, y4 e$ ^-root <ROOT>参数是指定执行期间要使用的工作目录' ^0 b5 z* t$ u7 [
-equ <NAME> <VAL>参数用法不明
/ ?: M8 Y# T/ I2 x! X* b" m& T-strequ <NAME> <VAL>参数用法不明
) u* @: R5 j5 T' p( K, Z3 T-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译" S! I; r/ |) c3 b2 l' a3 g1 }4 P
* ]4 `7 o+ C& U/ r/ ^1 ? ~3 q<FILE>是汇编代码文件,可用记事本之类编辑
$ _: w8 Q0 R- s4 y( \/ A, V
8 }" h, n* V5 f4 K注释说明:
4 C* n/ }5 B+ S3 S注释可在单行指令后面“;”和“//”添加
9 Y, I* t4 I' _$ e- U- K H“/* */”式也接受2 @ R- e+ L: k A- c2 Y3 K8 G
1 Z/ v6 M1 c! G# e
例子:) N" A1 U% ~" k$ [- b$ B
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
: b7 v% q' J! G1 i
$ `% y8 L, P$ Y% ^.close;/*关闭文件*/
/ }' m# V3 O% P4 t" R/ {4 B7 S- z( u' k6 d' L/ ^! u+ w3 a2 p
标签说明:
: _0 s, ^ P6 ]& U/ F% d5 E6 J标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。4 p) X1 t* S9 I) K
, e7 W) S: \ T. D
数值说明:
, z/ Q: ]& w) S# M2 w) C C“0xA”和“0Ah”是16进制数值
2 B. a( S* |" o h“0o12”和“12o”是8进制数值1 y- c* \1 [- g# V" M- t% ?
“1010b”和“0b1010”是2进制数值
1 i! l1 V0 C0 v/ u7 y: y! h2 t9 h& \; p# J
equ说明:
. c5 f; X; k# N; v3 ~: g7 \, [格式:text equ value
- | S" Y, |9 `- [说明:用一个text代替value
5 G) k ^$ D' ?+ O1 W例子:
* p4 @8 [+ L( C5 |3 Q* Daddress1 equ 0x12345678
+ ]0 v- j& ?1 O* n. ?ldr r0,=address1
! Z; t! R }3 c* Q/ }, Q' B& C.pool
, ~6 ^ T/ }2 N- l" o# f; l; E5 D; o
函数说明:4 a ~- x- f3 o- ] Z/ @. j1 n
0 d6 F p' I6 a" {6 v4 D
.open函数:! X% S. {* `' J9 ?
格式:
. Q. x T: S4 |8 h7 ].open "ROM FileName",offset
( |- z/ E c3 C.open "Old FileName","New FileName",offset
( P! X% W/ v. `$ L说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
& u1 M- P& c; g: Z9 q% j$ u- F
例子:
5 k" b# p% G! k" D+ y b.open "1234.gba",0x08000000
; Y2 T) c. l \( R4 ]3 Y0 c
# Y/ [/ j, u' e0 g.close函数和.closefile函数:
8 a/ `( K, _* }* c0 J% L% s格式:8 Y, p: c: x5 S9 r& W
.close
) }' N1 l% _3 |( r' C3 d$ j4 _.closefile
1 p/ ~6 P. l8 U0 _- e说明:关闭文件。
0 w, J. W" C8 z* _+ M
" ^8 |1 A+ E6 u' u0 i; M.org函数和.orga函数:
+ @" i4 f/ v% c格式:
( i |# B2 Y2 Y! s.org RamAddress. L6 t6 _$ d* X8 e
.orga FileAddress
* a8 l* U8 A( [$ Q! B说明:# p7 i" d5 w; E# g* _' R$ W& @* i
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
1 o3 X2 C- [, D! u1 ~3 x. U6 s, w4 I8 C' l
.orga函数可指定ROM文件的输出地址。* E" C( s% v( x/ r) z
) `! R, o; W& }9 t y3 ~.create函数和.createfile函数' D6 H L( H- v1 f4 Q- r1 m$ L4 R
格式:
4 L. `7 ?* q3 ]/ d.create "FileName",offset
. }5 N( ]! z W, u.createfile "FileName",offset3 L! w: h& _, I* _3 n1 J
说明:创建一个文件,如果文件是存在,他会覆盖掉。
0 B1 g' [7 ]; m: }4 X$ s6 E6 e% x! ^( h* J" H, e( h
.area函数
8 i% p' y4 {$ }( c/ k格式:
' G, T8 r2 i/ V7 ].area SizeEquation[,fill]
0 ?$ y5 e# z: X.endarea
5 ~) ^; V0 v2 `+ k说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败- Z; E5 M4 x; ^: B5 ?
. c: m/ k; c9 @, ?0 _+ S @例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
' T" T' X7 ^* P$ Y7 Eorg 0x100! u0 C2 G: U5 R7 a- y+ }
.area 0x89 U& e( l1 Y0 ~+ F+ P& \5 G* u
byte 0x5,0x6,0x7,0x8
9 O2 W/ G. u3 m( L* H.endarea4 O: c$ ]' u( W* D+ [2 I, t
7 F( O! f# |( g.align函数
4 | z4 y% T b格式:.align num
6 C1 _& K0 u* c6 Y说明:写零字节,num为零字节数量,用16进制表示。
5 ^* P, I1 Z* K$ c, b4 _5 c1 y
2 f! j1 T# Q9 P7 s.pool函数* L0 r' R& S, D y- b4 L
格式:.pool& V. u( I2 v; l* f, N/ o
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。) c; {4 F5 H2 N0 W$ [7 k
例子:3 k, Z" o3 b( @: O* k
ldr r0,=0x12345678;8 U9 y7 s8 D3 h" W. w
....4 x: \- v/ B9 q
.pool
6 Y" h) J( p0 t- Q3 n6 t/ n1 G$ M1 C* r, }
.fill函数$ }0 S- V* p8 M9 B* b5 S
格式:$ @# Q+ r& {, X5 S% h
.fill length[,value]
& \/ w# Q, G+ }8 |" M; R/ W4 Cdefs length[,value]
) c2 L3 r8 ~; }# }0 h说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。# A" a7 i6 l) P8 i9 [+ ]$ w
4 G/ t4 e* j f" Y.skip函数:1 \+ u5 S; e, `5 N- B9 l
格式:.skip length, \6 D; R8 D. t4 S& u
说明:跳过指定长度单字节数值,length用16进制表示。
8 `1 [0 f! H! Y* e& U: Y B6 r
! Y* o& w: s7 A/ P+ e5 p写单字节:: R' n/ y6 j- _( f
.byte value[,...]4 [* L7 j6 m4 X7 v7 q O
.db value[,...]" n1 u3 C, v Q- c' W* b
.ascii value[,...]
- @7 B( t R" d6 S! P.asciiz value[,...]6 l2 S' d8 i/ ?3 ?+ h
dcb value[,...] v8 y. M2 a. U( l* \/ b
8 P/ P- f7 T4 e) w* A写双字节:1 ], K/ V' b4 L9 y9 |; m9 w
.halfword value[,...]
# i! M* \) N* J. j! ?.dh value[,...]. g! \& {, v0 d' v/ h" j5 `- [& i( y; T
dcw value[,...]
# g% @) T! e: _- E8 R6 b8 p: F9 o+ g" B5 C
写四字节:% E' c6 S; J% A7 Z- k* ~
.word value[,...]. Q1 k( v6 j% w( }! S* n6 _$ ]
.dw value[,...]$ }& a5 J2 Y% v3 d" m/ E6 a7 ?
dcd value[,...]! m- t' m9 I& ~* z9 a+ Y( s* n
8 C; O" j8 H( D1 j3 l
写doublewords:
8 v" a( O- w& v% S; |' ?.doubleword value[,...]
9 g' f/ s+ B* J6 o0 [4 Q) q; C.dd value[,...]
. s( e+ v2 i! }* ?; X# i( Q+ ]; {$ Wdcq value[,...]0 F0 J' S: n+ d$ a. Q& i$ N) b
+ |" _4 t" }( E7 B- L: i4 M写浮点数:
2 V) V, N0 u3 r* j% a) x1 L8 N.float value[,...] \. e/ I. O- b* v7 G/ q! U4 A# x w
.double value[,...]$ G& B- |* x5 K) a, l- O- r" ?, ~
% _7 m- I4 t* rARM的ARM模式和THUMB模式定义:& O/ O K' p: M1 e2 W0 o5 v! l
.arm|ARM模式2 P* l. Y$ Y( f& L- C9 _3 ]& N
.thumb|thumb模式
: m3 p1 O* b& B: }1 ]
9 x( S }- ?0 p2 i设置架构:# \$ Q) N; J7 D/ r& v" Y
.psx|PlayStation 1(MIPS R3000)
/ S6 J0 R( `- C$ `% J L# c.ps2|PlayStation 2(EmotionEngine)
% p5 [# l& @( _8 A' O8 D( a( y.psp|PlayStation Portable(Allegrex)
+ o& X" k# d7 D* s+ E! N.n64|Nintendo 64(MIPS R4000)' t; S! d `4 ~/ l' f/ F( {" L3 I
.rsp|Nintendo 64(RSP)
* }, s; N+ {& A0 \.gba|GameBoy Advance(ARM7,默认是thumb模式)
) ]6 ]& ], e% B* S; l0 P0 G6 f.nds|Nintendo DS(ARM9,默认是ARM模式)
L- ?% w# E0 X5 E6 @.3ds|Nintendo 3DS(ARM11,默认是ARM模式)3 a$ ]8 E( p1 \4 g
.arm.big|
$ G9 k4 F+ ]2 G" Q* @. j5 @& a.arm.little|
3 @! }- T- I0 i1 N9 o2 T/ ~ M% B8 d
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。* b, B3 ]4 m- @( s
|
|