签到天数: 2173 天 [LV.Master]伴坛终老
|
# E/ k8 P: e1 e$ d: e' Q3 l/ z
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
) i. n1 X/ {# I7 x$ ^' N7 q& M' e
0 c& s( D+ v2 V/ L( YARMIPS assembler作者是Kingcom,目前发展到0.9版本
* d% Y: [3 G2 Y$ H$ U; V! h2 @: n+ b
Kingcom's website:http://aerie.wingdreams.net
3 r( v' H0 R- m& N' K. G1 P2 B h2 ~" u3 E3 ^
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
, k) g6 a2 `! \. p& W; ?" y* c+ R, s$ Q: m
更新版本可去http://buildbot.orphis.net/armips获得+ n& d/ z# w! g
, c( e0 k# @7 d, F5 ~2 v/ zARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
, e: F' t/ T5 Z/ Z/ ] t1 N" W1 _; J4 W, D
ARMIPS命令行用法:6 K$ a4 w" J7 A' J, b
, I# g( W4 G7 T/ r. J, {Usage: armips [optional parameters] <FILE>7 S9 ? |. x. d8 y' o7 ?
8 C' a+ z$ L2 Y. Q& ^Optional parameters:3 e# W1 n& r1 d1 ?7 g" O) e
-temp <TEMP> Output temporary assembly data to <TEMP> file( d/ O/ I% a+ s+ l' d6 D
-sym <SYM> Output symbol data in the sym format to <SYM> file
% o7 j/ b1 {' J/ h -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
# \5 ]: S& I& o4 _% h$ @. ?' w -root <ROOT> Use <ROOT> as working directory during execution* @ T: L$ M* y" L& v: a
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code3 d% ]0 [! X8 _# `9 g
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
& V! T1 f9 K. d( o6 u* X -erroronwarning Treat all warnings like errors
1 B$ g4 A7 h! }! k% j1 F
$ T% T8 s8 c) C$ h. F' u" n% dFile arguments:2 d# H2 H. B' m7 A& e x! T% v
<FILE> Main assembly code file
$ |" `" v1 e p2 i0 t6 l) J# y# B$ w- g- D) v2 k$ f& a1 S- }+ M5 D* f# y
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
* h' `* o7 K* h& Q1 u-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
z1 N8 o) l( _7 C1 {7 G-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
' u# m7 n8 ?- \4 `- r-root <ROOT>参数是指定执行期间要使用的工作目录! W2 x8 P2 A1 I2 j( X- k6 o
-equ <NAME> <VAL>参数用法不明8 b4 K$ v3 @. h
-strequ <NAME> <VAL>参数用法不明( T" r3 g8 ?) M# ?$ ]& E9 \, w
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
2 q. o% \2 m5 L1 C! D
, D( [1 X, I+ C! P+ |<FILE>是汇编代码文件,可用记事本之类编辑% K' |* ]0 O( H7 p& w7 Z9 a
6 |& ]0 @, x. j+ G! P ~7 w
注释说明: r- r S1 W+ p% f
注释可在单行指令后面“;”和“//”添加" y" d" m0 {" p) r# r- l$ u
“/* */”式也接受
N+ b( F$ S% [$ i' N4 z2 r0 Q1 `/ m
例子:' p% h1 O& _ B# u
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000. h& A, A. X) d- u$ l/ i
' `. o9 R( l) k) ~9 {
.close;/*关闭文件*/% D, v/ X/ n: Y4 j5 D3 I/ Z$ c
p* |, t2 h1 t+ t标签说明:
4 E- A* O$ t$ y标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。* K* R o. J7 |5 J, B
; Z3 W+ V f3 ^; t5 ?( j: ?
数值说明: _% ^; {! @* f% o
“0xA”和“0Ah”是16进制数值
5 B" P7 g4 k$ b& X“0o12”和“12o”是8进制数值) w& ~$ z7 P; N' E+ Q# z
“1010b”和“0b1010”是2进制数值
' P B% h% X: X4 v
- |* p* _4 I: m! H4 b2 v: Cequ说明:
8 W) D; o) x: ]# e6 u6 c格式:text equ value* Z7 h) K, K/ ?" t1 u
说明:用一个text代替value
3 n F! m3 H; P6 l& ?- M7 x9 [例子:
8 A1 N0 n2 A2 W; i$ Aaddress1 equ 0x12345678
* @/ \! ?) Y# V" y6 gldr r0,=address1; \: m- ]/ {" |& r' p7 f& ?: R
.pool1 T& {0 N& X4 c, W( \5 i
0 L8 w/ R4 R& ?函数说明:6 y$ G! E% E7 k8 k9 R: q# W; G
0 F: v4 k l: ? f* I9 V6 t! z.open函数:
9 |' q/ f8 h! f# B, e7 |格式:
8 F n! L: @5 C; u, S+ p5 U! u.open "ROM FileName",offset
" s6 H% Y- R* Q2 G.open "Old FileName","New FileName",offset1 H! F5 f3 |5 t B }0 |
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。 l, e; \2 z7 b9 P5 v
. ?# k+ z9 {3 |5 F例子:5 \" n# M4 b3 ?" b
.open "1234.gba",0x08000000
5 H0 x5 r0 L. D
% M0 {) Z* G) L* U( E.close函数和.closefile函数:
% [1 o5 M: G, s格式:
3 H3 I; x9 r, s4 v1 m- b4 o.close" \; S3 x7 B* O% T
.closefile' i( G" M. V4 i( z' m' [
说明:关闭文件。9 l* n" H1 [2 r" `) `
( f) v' G" ]4 G3 M- |+ Z.org函数和.orga函数:
) D7 v& w' N4 H/ p) F% e" B! b格式:
( c9 A" |- [6 o* {.org RamAddress
# a3 z! u9 l/ G9 M8 A.orga FileAddress
; ?8 W* G, s6 T* W- E9 q0 c说明:( `; P8 x B; l s( @
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
: M" M5 a7 y* d' O/ W' X
& I5 _7 b" s! t0 S# _- S- k0 {* ~.orga函数可指定ROM文件的输出地址。; U# ]9 Q7 q: Y1 U9 _4 N3 z. o
5 r0 \. p8 Z8 m6 J
.create函数和.createfile函数
7 Z5 l( b4 T, y+ M. U ?格式:
: `" v( [. [0 }.create "FileName",offset F( h' c- ^: D$ ]# o6 V7 h* `
.createfile "FileName",offset
$ J& X" H7 k0 Q: e& M5 ?说明:创建一个文件,如果文件是存在,他会覆盖掉。
B5 q/ l2 O$ \& z8 `; w& ~' ? C
1 j; w6 s/ k6 ] H! T.area函数
2 A) }3 f1 r" [5 J7 s W, q! v格式:
9 W- q0 ]" Q) E3 F: _8 z8 t.area SizeEquation[,fill]- l9 p7 n" r% p5 O/ `9 z1 A
.endarea
* v, m$ H1 w5 d' a3 n说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败8 l) v' o9 P0 J) \6 @+ D4 ]( p$ y5 P
$ \& |+ r& K; Y8 S8 a2 c2 g6 M例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据- Q$ t1 H; O; |! F: l( s) D5 d* _
org 0x100, {7 f k8 \9 |, j& ^, d9 A0 `. o
.area 0x8: U% G* J' S2 \- w8 E3 Y+ p9 G
byte 0x5,0x6,0x7,0x89 ?7 x9 _8 ~% K8 s7 y! a& i& Q
.endarea
" G4 M/ O- |! o
) I7 C1 |0 Z. Y$ g.align函数- B( z: j% Z( s# H$ x
格式:.align num, a% i& X" E7 ?: {: ~! }6 L! k6 z" D/ s8 g
说明:写零字节,num为零字节数量,用16进制表示。
' I: }" q& l- ?9 a$ V& G7 c& {5 d& `" ]- E8 S9 J' Z
.pool函数 o! P+ i6 H2 X, ]+ Q/ m
格式:.pool/ d& j( e( }( c; X( o/ J3 @
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。0 [6 y) u5 ?- U* Y |& P j7 o
例子:
0 _6 w1 z6 u' oldr r0,=0x12345678;; W+ Y q6 B! k) ]( |; {6 B
....
0 o, s; A* F! T+ `7 g.pool9 Z, o9 X H3 l2 d; R" D* |4 n" _/ M& M
2 H: q6 m1 ^$ g9 ^" Y+ y.fill函数
3 A( |1 U' \8 Y格式:/ A- c5 @- J J
.fill length[,value]( h {% T3 b8 a& T# M+ G
defs length[,value]; d: Q1 D0 z# a- q
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
9 }! Y! W6 z+ V2 k( M5 c3 z/ Z# _% B: i4 k
.skip函数:
. W0 k8 z& K# X( s4 S格式:.skip length
4 `/ C2 c! N' e说明:跳过指定长度单字节数值,length用16进制表示。, K$ ]: T" E" x0 L% G
' E5 y; G$ K# `9 X! |/ ~* D3 L; K
写单字节: n7 d' D* x/ l
.byte value[,...]% Q; K4 N+ q" L( |) ?, Q! N; A
.db value[,...]' e; w* c% A# V7 `
.ascii value[,...]
( Q7 G+ F4 D' W3 Y" O.asciiz value[,...]
1 v5 m, n7 N) t% l; H1 d: Kdcb value[,...]3 D, R0 K7 P. z6 k+ q
) x" T$ {% w8 d/ M
写双字节:
" O' Z" M1 J$ b# y9 m9 Z" P4 f5 @.halfword value[,...]
+ I' P3 y$ D& J3 \4 \0 u s8 W.dh value[,...]
4 I- D; d6 _! Qdcw value[,...]. l; j; o% Y% I+ O8 y6 M
: z8 _6 z N3 ]( m
写四字节:
% \" U) z6 c5 m- W.word value[,...]
, X; P* P( c. E+ c0 _7 s! O& L.dw value[,...]7 _7 h8 n Y x5 k' C# X
dcd value[,...]5 w$ X- R# T, S, R8 Z: {
8 n% T8 e3 S S! X/ M! I
写doublewords:
0 V% g- {8 g$ |.doubleword value[,...]
! ?9 L [$ c6 |7 Y1 }3 U.dd value[,...]7 ~4 a! X7 d" O* p
dcq value[,...]
: q/ J+ E6 p' Y8 F" g, s6 b1 V
' v2 L+ i) v5 I$ _4 y8 |' l7 \6 p4 M写浮点数:3 X/ t& l1 R, h% B
.float value[,...]7 X) K2 o# a6 ?5 Q
.double value[,...]* L V. c! r& l+ M' X' c5 T, V7 E8 @
3 X, z/ L% X3 E" h- zARM的ARM模式和THUMB模式定义:
0 c0 _6 {3 x) Z/ D.arm|ARM模式
$ K3 E7 |5 d5 n0 [$ Q5 _2 Q5 ?.thumb|thumb模式 n1 U8 K: k. S& A5 R
* H- a6 g, L6 B/ L: G5 u$ k$ X8 q
设置架构:7 S2 @, l. a; a% |# f2 ?3 H9 V
.psx|PlayStation 1(MIPS R3000); n% L* A6 ^8 Q4 ?7 p
.ps2|PlayStation 2(EmotionEngine)
5 P8 s' D1 D% y8 T( I.psp|PlayStation Portable(Allegrex)6 z2 a5 P* j5 J2 C
.n64|Nintendo 64(MIPS R4000)8 Q; K& V8 p6 o7 z7 Z# t" n0 _
.rsp|Nintendo 64(RSP), \+ Y( i( ~; G- g0 W
.gba|GameBoy Advance(ARM7,默认是thumb模式) c3 S# [% g. C& y" L
.nds|Nintendo DS(ARM9,默认是ARM模式)* C1 g& Z; r2 D6 |- W& ~6 {- b
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)" c5 S0 c: O. g4 Z# \6 X" s% K) f
.arm.big|1 I& z! Q. W/ S1 t7 d; o
.arm.little|$ G w( s6 X' e0 s$ y
% x9 r( F" n* _! n1 J) H$ c常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。; M* w1 ^% t. y( T, l F7 l
|
|