签到天数: 1895 天 [LV.Master]伴坛终老
|
2 Z* R5 V5 Q) o. n
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000, R6 v% y' F! s% S( r
6 b) w# t1 B9 n9 ?8 \, ]. T ^* uARMIPS assembler作者是Kingcom,目前发展到0.9版本
: z( v8 O" ~8 u$ K8 [) q4 z/ r0 W* _! q! S
Kingcom's website:http://aerie.wingdreams.net
3 V' u( X* n3 y: `1 _+ C- X5 F
/ Z( V* |8 q" f' u4 GARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
8 R. O5 }' ?0 g5 J: ?4 z% ]- ^7 R2 @- ?: R* N- n
更新版本可去http://buildbot.orphis.net/armips获得- x0 ?4 g4 j6 O0 |
3 N. b' n7 N/ q* i& SARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
3 Z* C% S# W/ w3 y! n3 k2 d) d3 `, P+ e- `
ARMIPS命令行用法:
% [1 G9 m' ^& M# R4 _& G* h0 B5 {) R0 V* E
Usage: armips [optional parameters] <FILE>" b3 H" r( s3 V" ^* x" B
+ N, v. {, v# QOptional parameters:
5 W9 a( {: R/ ~ -temp <TEMP> Output temporary assembly data to <TEMP> file
9 N. O+ K6 u: x F4 } q) b -sym <SYM> Output symbol data in the sym format to <SYM> file, o& c- b8 K) |9 e
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file; N: j# \1 F% ]$ Z- @
-root <ROOT> Use <ROOT> as working directory during execution7 K- a3 Y' _+ j( b
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
A* @& B* L* k8 x, t5 k -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code, n D0 I, [; j; y" j( f
-erroronwarning Treat all warnings like errors
' \/ d, e% j6 W3 K7 K: W9 K" p6 O+ ~2 g, u6 n# W
File arguments:
$ Z6 D# y7 r- C0 k3 H/ ~" `$ v1 w# l <FILE> Main assembly code file
! g/ ]3 i0 `8 t% k. C, e& o( n
8 v8 d, _$ u2 U/ _/ z/ S& r7 @-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件+ s# p+ O' ?, g& C9 ?% O( p
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba9 r( z& g% B$ k! ~ j
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
1 z" H7 z, `* l1 J+ i( u! E& g: {-root <ROOT>参数是指定执行期间要使用的工作目录
1 j' }: G( }1 Z9 ~- C-equ <NAME> <VAL>参数用法不明/ e% N: N+ ~( {# J2 b
-strequ <NAME> <VAL>参数用法不明" v. V; [- R' v9 Y( y# p+ J
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
; i& [$ r; @, ~0 t6 B
+ B7 {; z( g: ~' K$ h<FILE>是汇编代码文件,可用记事本之类编辑
# h; F/ l% v R {; q
0 H0 s& R$ ~& y6 | H$ a1 o注释说明:
* X2 k, Z( W2 \& I+ u6 ^注释可在单行指令后面“;”和“//”添加
/ M9 T k% }+ S% ^“/* */”式也接受% h! j& n# x0 `! P0 \
K0 e. j) b' T$ j
例子:
. @% F1 ^7 V) `4 a9 j/ A# h6 @.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
( Y7 ^% o/ s' F6 N6 B/ Y6 w+ z4 j8 P7 \- |
.close;/*关闭文件*/
, n/ u* }( }, r, ~8 @% k T/ W7 {2 | R3 H/ ~# U
标签说明:$ y5 t/ D: W7 F5 j
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
6 P( ]3 _" b! E& X3 C7 ?- i) x
+ |: @5 z+ x. y l* Q数值说明: S2 b3 m. c/ `" P$ h- J: _5 `
“0xA”和“0Ah”是16进制数值) g ]) P" i5 H* x
“0o12”和“12o”是8进制数值
t8 g6 g e( k5 i5 g3 \“1010b”和“0b1010”是2进制数值* k* v# @4 J0 f
) r' v- L, W2 W! F& K
equ说明:; H- ?' b4 y8 a$ k+ A
格式:text equ value( W" E n" _$ }- Y$ Q
说明:用一个text代替value
N/ P3 z, Q- E0 a7 X3 e/ V( z1 X例子:! \ J2 p0 L* _
address1 equ 0x12345678
: o" [7 ]8 _; Yldr r0,=address1
; u' p0 C1 S, @.pool
% q* q$ U$ \4 n9 H
& v" g3 n: K0 C4 {8 v函数说明:; i0 K5 |4 Y4 c3 k Q& h+ f
9 S) B& b% ^6 w7 y" k0 _
.open函数:
$ l/ I2 p& K0 ]/ G格式:
d8 T- @( @" H0 e! {7 H+ F.open "ROM FileName",offset. x+ f& I, E1 F
.open "Old FileName","New FileName",offset' K7 }. |8 L1 Y8 p* E
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。! M( i# m# k9 K+ w0 o- j5 M5 d
3 k4 f& ^& b# P5 B( p例子:: Z# {+ N- z/ r q" I
.open "1234.gba",0x08000000
5 b. V ^5 s; G' U. H6 i$ p% z5 g. n" j; h, t' p
.close函数和.closefile函数:
; I% k. w& r7 l格式:4 N: y, R6 t: c8 D, j
.close4 p" C+ P- q* z9 s5 p
.closefile
' ?9 _2 [3 m$ f4 ]$ E* {/ ~' j8 N* b说明:关闭文件。' i- J+ K1 [( T, U: }! a4 W
# Q3 z; Y: `1 Q/ H6 h
.org函数和.orga函数:
. l5 Z A6 l8 z; S# z, n4 D9 N格式:
; v7 W; ]6 F. v9 N/ D7 k.org RamAddress
) K' t+ x- {6 w) e6 R.orga FileAddress$ b7 V* w( W, ^/ @9 {4 \
说明:9 j; M- j2 P0 q6 K+ R2 D k
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。' R `6 i3 f; r& {% v
; [: L# x' f- w& P6 g
.orga函数可指定ROM文件的输出地址。
& v6 s- a3 L- y% S' L, A2 R
" s$ E& P- Y& c.create函数和.createfile函数
) [- {1 E* v5 p1 X$ _格式:
- W6 l, a7 J* g. x x1 D.create "FileName",offset
k1 f, V4 c, E1 s2 K g2 A l.createfile "FileName",offset8 s# s' H. c# k5 s
说明:创建一个文件,如果文件是存在,他会覆盖掉。; j, X1 S- z6 i2 e( S
! ?7 {& I7 B& U9 I; v! M
.area函数
- Y/ L* p: S9 G格式:9 L" \: V _- J8 E
.area SizeEquation[,fill]
' e( x! b# c1 N) L |. l; v.endarea0 [5 R- k! i' `7 F
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败# a" Y7 a: ]+ m3 H6 [
; e+ t8 p( `# O1 B- T& R例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
6 G# K' O6 D+ ]- sorg 0x100( I: y/ e v9 h i- q
.area 0x8. G* C9 y B: o5 V6 K
byte 0x5,0x6,0x7,0x8/ N% H3 W1 [3 ^. ~, C$ A, ^
.endarea
; Z% a6 x4 X9 J8 C* [7 G: R
$ x: A5 ?/ d0 W& h3 r! A3 H0 X.align函数 j s- B. z Z( D- P) B/ U" b
格式:.align num: Q6 d) j) g9 i, Y) f
说明:写零字节,num为零字节数量,用16进制表示。. z8 g: z0 i F
* a3 j3 ] X7 u& ?& B' a3 s: M q.pool函数
& t5 t" t4 j5 }! r0 F7 j. _格式:.pool& q. [8 D2 }. I; t
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
' I x6 k, I0 D7 o例子:
1 |6 ~6 t e( t% Q7 L- l( F& aldr r0,=0x12345678;
2 \, B# q! u9 A5 b z....
6 b1 s/ _/ D- [1 [" o8 z.pool7 k# }( E" E/ e; ?5 {& L$ o! c
0 w2 p2 T% w3 I2 C
.fill函数4 |' M5 E% t, g" T' n( {
格式:+ m* S1 B& q- c6 z# L1 \7 r
.fill length[,value]
. [, _$ \6 P. O# C/ @defs length[,value]
9 b F4 u7 w" O" {2 G6 l说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
6 h# e# {2 T' K3 g: W [& Z% Q- V, S+ }. ?4 Q0 h
.skip函数:3 U. C6 x* E' l# f8 E' M
格式:.skip length
) Q$ E/ a; o3 L6 Z说明:跳过指定长度单字节数值,length用16进制表示。
" D& z( d' `9 F% i" K( O4 |, k4 Q7 j0 U& \7 Q% R5 u" t* Q+ Z3 u
写单字节:
; v4 _3 |: Y8 W; L/ u- M, \.byte value[,...]
& ~- `0 d6 A# I& f.db value[,...]
7 U5 `* ^1 r% M! x4 Z.ascii value[,...]% J* T( ?9 X+ q
.asciiz value[,...]3 N# E) J$ X+ W; x# k0 R+ v) w
dcb value[,...]
# R+ n0 ?0 t$ }& B+ d. X
; z& U2 D% t/ {" R写双字节:$ t- }0 X1 V6 ], V9 ?- m, V7 B
.halfword value[,...]2 E0 _7 V$ q) }
.dh value[,...]- u4 x' T, v: n; Q* `( B
dcw value[,...]
/ i$ w7 [. G: \5 C3 q/ k( h
3 ^4 O* l) [8 D- l; T8 F写四字节:
% r) R! N9 C+ Y- t* D.word value[,...]* \2 M4 E0 {2 ^! i5 N
.dw value[,...]2 N3 u8 E* q/ T$ R5 j
dcd value[,...]
* d% o% d# r w: H. a! r5 l* W0 Q8 m' V$ O* T; [7 [, p* [
写doublewords:
0 J; F/ b. Z" P j.doubleword value[,...]
2 o; c9 N! v# R4 {, P.dd value[,...]0 A8 G+ d( [8 s8 |
dcq value[,...]1 G1 @! P5 v1 N9 |
9 R! E# m2 w+ L) Z3 _. X写浮点数:3 t5 \7 b0 t/ X/ ~/ `4 J0 J6 w
.float value[,...]- Y! V) b' Y$ D( J0 L6 S( \
.double value[,...]
, W% D4 ^$ x5 _: s! l* x& O
# C" d7 R! y# A% N* i1 CARM的ARM模式和THUMB模式定义:4 [# F+ _/ z& r3 _1 w" p( V
.arm|ARM模式5 Y! p2 y' u4 W0 }# S4 r8 C
.thumb|thumb模式
8 Y! }$ X: e1 s# B$ |8 p0 C: I4 T4 k, l8 B0 e& j
设置架构:
) X3 K) S4 z5 T, q0 \.psx|PlayStation 1(MIPS R3000)2 A; n) l/ g0 d% ^/ ?8 E
.ps2|PlayStation 2(EmotionEngine)
3 N( s8 [1 S% u1 J.psp|PlayStation Portable(Allegrex)6 R' a4 z0 W4 I' D9 {7 J+ S! O
.n64|Nintendo 64(MIPS R4000)" J" T4 Z& h* }3 b* V5 d
.rsp|Nintendo 64(RSP)
1 ^; o! o. t2 T$ S- B3 p$ l R.gba|GameBoy Advance(ARM7,默认是thumb模式)
' ~0 s7 N/ p0 |4 ?$ r.nds|Nintendo DS(ARM9,默认是ARM模式)1 W% q* A2 V; S- h8 ?- b- i( N
.3ds|Nintendo 3DS(ARM11,默认是ARM模式): @8 W4 u" ?" z
.arm.big|
' `1 W9 G/ h% F$ J$ ].arm.little|+ I9 o+ D1 o) W) b$ Z1 ^8 ~% ^
9 I7 R( E, @, q/ ?, V4 L4 u
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
# \3 E" w3 J# s$ S3 V |
|