签到天数: 2072 天 [LV.Master]伴坛终老
|
) Y! l0 [1 C5 W, R9 tARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000! H# ^; [6 S! B8 t5 M
8 F4 `$ h* R% T: C3 {1 ~$ q4 R" BARMIPS assembler作者是Kingcom,目前发展到0.9版本# f4 U! L5 q& \7 E% G+ L
. b' F( H1 I2 O4 ]3 z5 |; W6 e
Kingcom's website:http://aerie.wingdreams.net
$ H0 p, s$ ]6 D8 x1 m/ w- l9 q7 |! ?) _
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得- Y5 C. l, f- l0 L- j7 s" @7 f
9 K% |& ]* ~/ D: H, \1 V- w更新版本可去http://buildbot.orphis.net/armips获得( u( {- @8 b( u3 n- Q" }
- F; `6 i" B7 l; A# e, t
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。; ^7 O: O& I7 z4 A) Y& G F
4 w! x$ L2 y& [4 f3 O
ARMIPS命令行用法:
. U; ]/ M% ]. K
6 L5 D$ B* [" r* C, U6 `Usage: armips [optional parameters] <FILE>1 z/ Y; {! l/ E) ~
* u. ]2 S- D: c' X) XOptional parameters:; L: p4 \; D1 \3 H% F
-temp <TEMP> Output temporary assembly data to <TEMP> file
2 w5 ]+ c+ y9 M% ^$ a; @ -sym <SYM> Output symbol data in the sym format to <SYM> file
& B5 |. ]1 v6 o0 A -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
5 o7 w9 s9 n2 G9 Z0 x3 f -root <ROOT> Use <ROOT> as working directory during execution) W- T) |% L: I: V, D/ m
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code: ~; L0 a8 e0 V8 Z5 u
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
{: O8 }# X0 l& I% J8 i! N2 C -erroronwarning Treat all warnings like errors
! h7 l8 k6 f$ L# r, R
) i6 n( @) m) i6 x+ g# FFile arguments:$ C4 F& q3 L! x7 [! k3 J7 k
<FILE> Main assembly code file
M% k: r1 s! J
B; \" K0 K6 Z* q6 C& @2 {" D-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
! l/ Z( M5 J! o3 G9 d! S% m-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba; \7 h: h) b. Z r- U( h& g3 v
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
& {5 r1 ~8 u* ]5 G4 G-root <ROOT>参数是指定执行期间要使用的工作目录& H; x2 v+ ?, ~" ~# a: U
-equ <NAME> <VAL>参数用法不明
/ x* r) Q5 A1 y, G8 p, g1 @3 d-strequ <NAME> <VAL>参数用法不明
4 J) G5 P0 u6 v& p% Q-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
; E b5 K5 J C) Y; @3 W% X/ P8 J8 L% ^3 w
<FILE>是汇编代码文件,可用记事本之类编辑
; Z! M% n3 m/ n! U9 m: D1 V$ s: U( [9 S: f
注释说明:6 B3 } ?1 d0 C5 P2 j# j6 ]
注释可在单行指令后面“;”和“//”添加
3 O+ `4 p) b0 @8 m+ K“/* */”式也接受
' d3 i+ ~% G3 O) x+ n
" m6 H. j" p' s4 x [: v; H例子:4 B; M' U! B; s, C
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000' e9 N! P+ h; ?1 p9 @, c) x
8 N; N& a# s3 G) P$ d; q
.close;/*关闭文件*/
" T( V } l! E1 t; t$ m( ~8 h7 M5 D0 u3 q: U2 U, s- Z
标签说明:7 c: a; t r) |+ n, D# U
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
$ e7 f: V$ Q$ o) F
3 |$ b2 z- ]; B0 u" ]数值说明:
, d. n W4 x% A/ h, H" ?& V, S“0xA”和“0Ah”是16进制数值
+ e( k! v4 ~0 k+ C+ N4 W* z# k“0o12”和“12o”是8进制数值$ k! t* z: ?2 h& }/ @0 U
“1010b”和“0b1010”是2进制数值
+ U' M. ~$ @9 q/ g Y% `' B7 O7 E
equ说明:
2 _+ }1 m! Q' `7 I2 P" I6 w) `$ J4 T8 `" h格式:text equ value
) n5 H, W+ m/ J5 e9 ~说明:用一个text代替value8 a1 B' b- O9 s9 Z, w8 I9 [. t
例子:
4 D; ?$ j: G7 ?& xaddress1 equ 0x12345678
+ M$ U( W1 R1 W; R9 @. S+ Lldr r0,=address1
8 f0 ^+ Y P) c7 ].pool
$ b8 u( }( g: n/ Q. ~7 Y% s7 y# t8 _9 b( z! H" C, ?
函数说明:
' r/ t& { X; d, W3 F5 m4 `9 ]2 C4 g$ U+ ~5 |# K
.open函数:/ G# i c# ?5 M; {# f/ r& u' }
格式:
+ ?. d0 @+ J0 i# A.open "ROM FileName",offset( n" i y1 ^/ j' ? V3 k4 [
.open "Old FileName","New FileName",offset5 k+ m- g$ G, D# i4 P, s
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。& [7 b" w7 N) _5 X9 t
- v& A W3 K( w+ d1 x2 `, i5 K3 q
例子:
3 c/ A0 q* @& x# J/ m. y( D.open "1234.gba",0x08000000
) h! `' u* ?, e* h# @# \* h
7 Z- o# e* ]- M+ N: ~.close函数和.closefile函数:' \8 C M9 }) A$ K1 U, o
格式:
) r2 `3 R; f' v! g( I.close: |, I% M- p+ y
.closefile
* S5 a9 p' T1 C/ ?( u' E! V4 s说明:关闭文件。
}. n: \+ A* j$ \6 M6 ^/ x' N: R; c
.org函数和.orga函数: y& r+ m8 q" Z, s' f2 i* |9 ~
格式:/ p2 f* Q0 }" z# z: r: ]2 k* O
.org RamAddress' A& q* j B4 D, }
.orga FileAddress9 M' A# S; z1 T4 z8 ^- L t t
说明:5 l; n- y- W4 s( G7 A
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
- p8 p" k( a1 N" `& K, {/ h( w y6 w" t* w& u
.orga函数可指定ROM文件的输出地址。
6 R' C' V( b4 z* v+ t* F, a5 @$ A& r( `# |
.create函数和.createfile函数
& a0 {8 Y& X) R. M$ M7 {格式:
( B1 L) E* g4 o% R! I.create "FileName",offset" C% _0 S% ?% d {, D4 d, }
.createfile "FileName",offset
5 b5 X; G B+ q) b; S! n$ _ [说明:创建一个文件,如果文件是存在,他会覆盖掉。* J5 O( i7 {8 c. l7 |9 Q
$ R9 \( r1 P; W B* w.area函数 e) ~: A" S( f) [2 B) o
格式:
, ?3 Q0 N( a+ J9 U! q# J.area SizeEquation[,fill]
8 c$ D( P" y6 ~' O- p1 u6 d.endarea
7 W. X/ k5 Q8 W* G8 F s! d9 R说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败% I; o4 z7 ~, [
& O9 P4 i8 b. R3 d
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据* d4 [. }" A8 U& V% U
org 0x100
3 D- t+ c; o7 H2 L- Z; f7 O.area 0x8
% I, Q6 x6 ~7 f/ X9 T8 d6 y+ Qbyte 0x5,0x6,0x7,0x8$ r1 K! B7 Z2 s+ [
.endarea
; P4 I2 Z0 X+ X6 j( Q: @. z( y% \: @( S8 h/ x( L5 v9 ~
.align函数& M! }- \0 x0 R6 A/ K) @/ V
格式:.align num
_7 S9 @2 m6 ` q8 n说明:写零字节,num为零字节数量,用16进制表示。- |2 Z5 H/ Y* i) ]4 l+ l9 W" y
* R# y6 i8 Z9 H.pool函数
" s4 F1 ~$ N* @3 z格式:.pool) y# ^ s/ _( Q4 L% x i
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。8 i& O, i2 o5 t( v% K, m
例子:
! @$ S$ E) X! uldr r0,=0x12345678;
( e# p' y0 j3 e) O. [....
& | X. K* Q. d$ P" F* C H" A' @.pool
7 \6 g0 h. Q6 q2 T8 ^/ g g7 ^' t9 D
.fill函数1 v: s% F6 a. `6 H0 n& E
格式:7 a% o! C& X! l$ Q! A6 Q
.fill length[,value]2 ^( ^6 ?* S3 C4 c) r
defs length[,value]
, E3 L2 A. J( K" P3 k! B4 m% y说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。* x2 m. ]* V! l& x
f2 U7 |8 a3 P1 A& I0 l8 l9 P.skip函数:$ q' b4 O" F; p7 ?' z. Y6 J* \
格式:.skip length
" h7 x# a7 V2 }5 x0 M说明:跳过指定长度单字节数值,length用16进制表示。4 ` d# K ~ S8 A6 M s
@6 F( P& b/ f7 o7 i; ?
写单字节:6 `/ z. @ S5 ~- H; I6 q/ W# B
.byte value[,...]- G0 I& b3 `; H! @9 P* Z
.db value[,...]+ x" a9 t! Q1 |% V9 B8 k# L; [
.ascii value[,...]
7 [) l, H2 T2 C4 \- Q( ?7 I.asciiz value[,...]
) A1 d6 K& c. y# ?- ]# x5 cdcb value[,...]
; u* Y& k# K) h
, J+ ^( F7 N# K a" `写双字节:
% c t$ R/ n& C& w: U. J8 S.halfword value[,...]
2 F6 |' S ?' S+ M.dh value[,...]( e0 F$ g% z1 h1 U5 H# L2 ?7 C
dcw value[,...]
1 o' e) J' e% N2 u0 Z+ A8 x2 k+ s5 O" v, O
写四字节:. x* E0 O0 v$ {
.word value[,...]+ S" T) u0 D5 i0 ?' V
.dw value[,...]' X8 y8 }4 s$ w; [; E2 X5 m( b- t
dcd value[,...]4 K% }) n6 y& S! `+ Y
# h. M, {/ W3 M1 `) M
写doublewords:6 {0 b9 F; w. @7 ?7 A
.doubleword value[,...]
) J0 @' d4 P: L1 }( w4 m x.dd value[,...]! F: v4 `2 m7 s j& e
dcq value[,...], G: p& R# w% W! {8 n
! U. |- g8 ?# A7 q1 O3 y5 A
写浮点数:
3 I6 j$ K( }! P) z3 Q.float value[,...]
1 R; T" f1 D; D2 m U* {.double value[,...]7 V6 L5 T* w' E: b7 [
& F3 S6 k) m; |" lARM的ARM模式和THUMB模式定义:
4 I) ~- v3 S) n, x) S3 Q.arm|ARM模式
0 A, I3 O3 P- n$ D1 ?& F.thumb|thumb模式
5 \3 J/ j9 s1 ^, t& x( ~
& _5 N; D0 ^7 |6 K2 W7 |" z7 v设置架构:
8 u& f4 R: o: g5 J+ h. }) b K.psx|PlayStation 1(MIPS R3000)% K5 k& q4 u5 ?
.ps2|PlayStation 2(EmotionEngine)1 p6 s" H# y" I4 Y: V& Q
.psp|PlayStation Portable(Allegrex)
1 L; v1 d7 G& ]" f.n64|Nintendo 64(MIPS R4000)1 U! i6 \6 X ]9 V
.rsp|Nintendo 64(RSP)4 F \9 g3 {( H- i
.gba|GameBoy Advance(ARM7,默认是thumb模式)- o( Z- ~. Z5 W: W* q
.nds|Nintendo DS(ARM9,默认是ARM模式)
& b6 G& \0 x5 j.3ds|Nintendo 3DS(ARM11,默认是ARM模式)/ x$ p) ~% O7 A. R, J/ {6 \
.arm.big|
% r1 A5 x2 _; l# j% B7 W: v.arm.little|3 r( m6 C% I, v. M. z
2 s7 p# s/ I" n( |. O A" l1 _
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
- W: q) {. H( R M8 g |
|