签到天数: 2217 天 [LV.Master]伴坛终老
|
: i. ^4 G% |2 ^3 q& T/ d: z% sARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
/ o1 I# f+ T6 H: i7 c7 f5 B, i! n* J7 F) r
ARMIPS assembler作者是Kingcom,目前发展到0.9版本& H" t+ K3 Y4 y& h2 |& n- z+ u
0 f& k; C1 k* b: [+ _Kingcom's website:http://aerie.wingdreams.net
# S3 j! ]9 ?2 U- ?, H; x2 p4 j
. X# j3 D! b; j$ f8 S+ b& U7 q/ a' ^ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
* w5 \' A/ b) i
* B' @0 L% |8 I. l7 E, m9 Q: `+ V更新版本可去http://buildbot.orphis.net/armips获得: M9 J; }% c+ @: A" m
& m% v+ Q! S. M$ Z9 mARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。8 F) n" l U% t0 u% k3 Q* X" E$ x
6 A; e2 B' q. c/ jARMIPS命令行用法:
3 J/ ]1 N0 s7 m3 c
0 Q* b# L) A9 S; V. A% f. l; AUsage: armips [optional parameters] <FILE>& x( l# a5 x( M7 K* }/ l! C& U
& p7 q* F$ l! Q
Optional parameters:3 h/ Q( \# @; l
-temp <TEMP> Output temporary assembly data to <TEMP> file
! N2 N/ y2 ?) P( C0 o5 H) s -sym <SYM> Output symbol data in the sym format to <SYM> file
6 p! o4 C3 V3 v* [+ Z( S( r6 e -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
; X$ h- A3 L5 K. z' x -root <ROOT> Use <ROOT> as working directory during execution! b2 V9 c2 ^# g! \, Q b& t
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
- ?( D3 ]) C" ?: v -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
5 }/ [7 a; m1 g i5 P -erroronwarning Treat all warnings like errors3 F6 Q# d1 e: y0 j' f
! z: `% R, p# |. O, xFile arguments:) o/ g$ M% `) o6 T$ G8 n
<FILE> Main assembly code file
( ?- a' N2 Z% |9 Y! `- Q5 ?5 |& D0 f0 U' O( [0 F0 v
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件 i7 N4 R- y+ ?! k6 g4 J2 X7 b- b
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
& u0 z) h# M! Q, B-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp( E3 l0 ]' ]3 H2 }% b ^8 M
-root <ROOT>参数是指定执行期间要使用的工作目录2 s: B- Z* q- q0 {
-equ <NAME> <VAL>参数用法不明1 y, }( ]/ \# n; e
-strequ <NAME> <VAL>参数用法不明( U/ w$ P! f8 R/ p' k
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
- N! F) c% p- m0 ^+ j! b+ Y7 S# | e9 E: R
<FILE>是汇编代码文件,可用记事本之类编辑) |, z9 ]) r6 W
( Y& ^ P# M# C$ D8 P% P
注释说明:9 d' C9 D9 K; Q- s( U
注释可在单行指令后面“;”和“//”添加% L6 x! R. m$ @! r {
“/* */”式也接受6 W' |' j" e% ]- p: D3 N
" e# P+ j ~& M4 w: _2 X9 [" g例子:$ D9 `) a; j/ Z; C) D
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000; r+ l1 u9 ?( ^" n6 e
% N2 F. z( e5 P) s9 y# V' u5 p6 f0 e.close;/*关闭文件*/4 B+ L$ A" z+ X) j4 _. B
' @7 Z0 o) U2 n标签说明:
* J2 b( ~! l2 U' E标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。3 X" N0 c( n' n+ |% A
) O1 U* x+ U7 S% ?
数值说明:5 P* ? H& Z& K/ n* s+ O
“0xA”和“0Ah”是16进制数值; J- I6 X l% ?, M3 G& G0 p$ N" r
“0o12”和“12o”是8进制数值
+ F+ ?! i: l, N1 [( U“1010b”和“0b1010”是2进制数值' t- ] o6 j+ X: ^
! p3 h$ Y. s6 i6 sequ说明:* h' t4 o( X# d8 Y T: h
格式:text equ value
0 I; f4 S% A) U1 h6 N+ w3 E说明:用一个text代替value1 y' R" c, g& N- r
例子:0 P$ i. y L6 B- ~+ t
address1 equ 0x12345678
4 s; {2 h2 p" G* ~: Q+ vldr r0,=address1
2 z0 Q& e; N# ^6 C1 { H.pool
0 i+ ^$ |8 M# u6 ^: P6 I8 V: n; J& B; }- P
函数说明:
. c$ j; a/ g7 r2 j# W: |1 e1 D3 g. d) Y* U, e% s7 p
.open函数:& p: Y) W# ?8 _5 y) j; y
格式:
& S+ K- d2 L5 u! D, g.open "ROM FileName",offset4 [0 \9 l W* a$ T
.open "Old FileName","New FileName",offset. V4 T: }; `( R$ N
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。! q* V/ R1 d1 ]$ ~. a" Z6 Q
* _* o% R8 X, S% }8 T3 a
例子:
& N* v q" O0 |& s. \* X, X7 W2 p9 Y.open "1234.gba",0x08000000
6 V( n% f4 h0 B) O4 F' J# }1 b, ]" h7 J. [4 r6 X2 {! O
.close函数和.closefile函数:, e2 |8 f) `6 j; f/ w8 R, C
格式:
" o; r1 t' \3 j# j.close
8 q2 w2 y R9 Q7 [.closefile) G; k+ ^, X% `' G0 K! R: h
说明:关闭文件。
$ c$ j1 k& o4 s0 V+ T( V3 ^
1 R5 k9 S! M: P" P2 _.org函数和.orga函数:
, ~2 Q" n; `# o格式:
2 b' J( B O: m5 [# t.org RamAddress' k0 {' |9 G( v n, N+ r m0 g
.orga FileAddress0 c# c7 K; E: y3 c, z/ A8 X1 ?# U- p. `
说明:
* g7 \$ b: O6 m8 o+ i8 v7 R前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。& y# @. v- H- N, A( }. d
) V) m3 K X1 g" O6 {" @
.orga函数可指定ROM文件的输出地址。
) @2 e# D- g9 Q$ D9 Y8 O1 |4 a! N# _
4 r9 H {5 x7 z% a% r% I7 |.create函数和.createfile函数
- u$ V5 v0 r, i: y) s格式:! X, O4 |5 A6 B2 Y
.create "FileName",offset' A/ ~7 E& g# Q) C$ g0 ]! e' j2 l( r
.createfile "FileName",offset
4 O: t( R7 M0 J9 f' a! p说明:创建一个文件,如果文件是存在,他会覆盖掉。
, Y% O8 p+ V9 y
- O( t$ I9 P; K% i. L: g0 \4 D.area函数1 t3 _- ~) E" ?* I8 v. t
格式:4 {/ n8 D/ s! U3 V
.area SizeEquation[,fill]
4 n( D! ?7 H1 C- M! Y! }.endarea2 X; j1 Z* t+ L0 ~. a: L' o/ o
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
/ w% _9 `. Q/ D/ q
2 p2 z' V4 L; P9 b# P* }+ d例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
' v2 H% B) |4 h: g: _" r* jorg 0x100
2 `* h; w& Q, A% U.area 0x8
! b% N: o( V6 y& B1 bbyte 0x5,0x6,0x7,0x8) w$ m) {3 g9 U' O, B+ ]
.endarea! o" `; d. O+ m3 R/ ^+ J
& l- {) o2 i- ?5 M
.align函数# j, g9 B6 p. ^
格式:.align num+ {6 T2 l+ b, T7 q8 z. M4 `% g7 f3 a
说明:写零字节,num为零字节数量,用16进制表示。- W" `% t" F; e$ h2 `. d) Q
, j1 H9 P Z3 u! H0 n
.pool函数; G l/ e! V8 Y1 p
格式:.pool
! c% O' E) {) L# P) ^/ J/ n说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。: N/ |- d2 y" V2 _+ r& O
例子:
4 M$ U/ r! e/ G& j2 mldr r0,=0x12345678;
0 i7 T( u' {4 j' {4 s: p9 j% h7 a....
; g. G1 f/ z8 _6 K.pool
9 V8 ~% l e# g9 O L
) r& t) b9 ~0 D5 K u/ S+ O.fill函数8 J. q2 d; J/ Q! U( d
格式:
# c" ?, Q0 n* E9 p9 O.fill length[,value]& ]( m& ^( @7 O& s& p
defs length[,value]+ m; o5 F+ F }- K: D; O$ E
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。$ c+ B0 ?! N) y
$ d# { m5 e/ [.skip函数:0 u0 {6 }% [) b
格式:.skip length
9 r$ a/ m: n" N* x说明:跳过指定长度单字节数值,length用16进制表示。
3 Q& @( a" @1 a9 g, l' N8 O, t; F- Q1 i! F6 }$ S, o
写单字节:
1 X) e3 ^# ^6 [$ s: m- X3 v.byte value[,...]& ^9 ?: ?: J w o9 y; f
.db value[,...] L0 l+ W2 ]. H X" `$ \
.ascii value[,...] Q/ l( j" x( @& L( \
.asciiz value[,...]! q/ d: D$ J6 S
dcb value[,...]+ t) R2 q; r( o! w# c/ e3 `
: L# K( |. G6 A. P
写双字节:
x" b8 v( E0 C3 B+ \6 v' ~+ Q.halfword value[,...]4 E( F9 \+ k- @$ b1 z6 d
.dh value[,...]
* t: d5 T& L5 m( Cdcw value[,...]: ^. f y9 W4 Z- k8 ^( {
! J& Y; P; {# s: M1 h1 k( d
写四字节:
0 T$ ^, ^+ _' W. f0 ?.word value[,...]
- z, H3 t' [$ C* `.dw value[,...]
5 ^- w* J5 K+ c3 \) Z: E! Ddcd value[,...]1 S6 y( M! A9 T3 k8 G% Y
( u5 R; _ |/ P6 a5 ?写doublewords:8 K% l5 Y$ g( Z+ U
.doubleword value[,...]
; W4 J. T2 @7 K5 @% P; u0 w.dd value[,...]# F H& I5 f C$ z7 y4 J2 b* M9 m
dcq value[,...]
% e8 G8 V2 x" L( q7 ] k' I
' ]/ x) Y0 b3 t3 C8 [& t; H写浮点数:
2 Q& {% s4 s+ Z! g/ W.float value[,...]. m0 X0 f X+ s$ S& I0 W b
.double value[,...] x; n- u4 h0 v7 [( `9 r, ~& p
$ a5 u: H7 s" C: f! g
ARM的ARM模式和THUMB模式定义:
5 U4 R- a: K+ h9 a- H, D.arm|ARM模式
* ^; s* s8 j u.thumb|thumb模式- q1 y9 E) E/ }4 r
0 k& E# z, d% J; V7 k6 P# e
设置架构:
. l8 L' {7 |7 A) [ J/ m.psx|PlayStation 1(MIPS R3000)+ {* w2 y. ?, Q6 w- g; U
.ps2|PlayStation 2(EmotionEngine): W+ ~! }( [- |/ S) `
.psp|PlayStation Portable(Allegrex)
9 I% E8 C! o" y* q( d5 O.n64|Nintendo 64(MIPS R4000)) `0 L' Y0 E: w, u5 B2 s( U
.rsp|Nintendo 64(RSP)
# K+ l6 p: {1 Y% B, D.gba|GameBoy Advance(ARM7,默认是thumb模式)
3 z, d/ ?! k$ O9 V0 x" N.nds|Nintendo DS(ARM9,默认是ARM模式)
A5 {$ \2 X! ?, r1 f.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
: u3 e/ l: V g& j# W* h8 ?" w.arm.big|
! x, ]/ h" M/ m.arm.little|( J! w* ?; ~! |, {: i4 g3 N
9 V- Q5 O2 U6 t) [0 D7 L, o; n' X' w常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
( x8 s$ S: J& Y |
|