签到天数: 2216 天 [LV.Master]伴坛终老
|
; w; P4 A% c# s" M* U/ \ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000- k! H- G' q6 f3 d7 ^% t1 u
7 h+ b2 T. ^. ~( o$ r* }ARMIPS assembler作者是Kingcom,目前发展到0.9版本
. F( k2 N: E8 j0 X7 i6 |" D9 q0 u1 L* t( \' f' ^
Kingcom's website:http://aerie.wingdreams.net* k% E7 R( ?. s7 r" ]
1 k9 ^$ W& Q/ ?- |9 ~ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得 N! k( ]$ M9 q
+ Y8 ^" R9 K2 s) l+ _$ O
更新版本可去http://buildbot.orphis.net/armips获得
8 y& l3 }8 g1 `0 q7 p1 m5 _
; b# Z6 c2 y- CARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。# c% r/ x2 g8 }$ i2 L7 A8 C: r
( R4 |2 h' q @" ~5 _1 p
ARMIPS命令行用法:
( O. j. e. O1 Q; S6 ]8 {# `. N Z* b9 a
Usage: armips [optional parameters] <FILE>0 ~# V8 i7 ~$ [, l9 ~
! I, A, t6 X0 T8 O+ B) V/ S- L
Optional parameters:
0 C2 i2 S" U; P- A# c& U" |4 e -temp <TEMP> Output temporary assembly data to <TEMP> file/ H. @0 w) G& \) q. R5 B
-sym <SYM> Output symbol data in the sym format to <SYM> file+ g2 O. [9 I, C1 P7 ]1 d
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
( m( S8 {0 p& m- k. O% A9 i& m -root <ROOT> Use <ROOT> as working directory during execution( q* e; t4 N3 D$ W" P+ Q
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code. C6 w p0 n3 U# C+ I9 v% M+ G
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code: ^# {5 r5 r1 i
-erroronwarning Treat all warnings like errors
9 |$ C/ j3 r0 M! ?9 K3 w( c2 ]
) k1 f; c: F5 q. bFile arguments:
" N; w, X. R" K9 X) q <FILE> Main assembly code file
4 F5 e0 S! U: A2 Z: N' P5 _4 k( }: D) g o$ o8 R$ X
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件5 _0 Q% b9 l5 Y3 H* F5 f: _4 x# p
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba9 B( L, A4 |. b, V5 l! w
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp: P) F# i- \, v9 p
-root <ROOT>参数是指定执行期间要使用的工作目录+ Y. ^4 Z& Y' [, e" c' o
-equ <NAME> <VAL>参数用法不明
. H9 p' U2 c$ |+ y- r2 k2 h4 Z-strequ <NAME> <VAL>参数用法不明' E/ L. F" T2 k8 O( H3 P* a$ r- _
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译7 n) `3 _6 ^' L, H
( e! [0 p6 ^5 G$ U+ s
<FILE>是汇编代码文件,可用记事本之类编辑
4 @: u9 T) b5 u/ U5 S. k4 @1 {. j! D( {# V! ~! }
注释说明:
+ U) X# o( O0 }( ?注释可在单行指令后面“;”和“//”添加- `! D5 f: L m: o5 F( O
“/* */”式也接受% j- B7 d- `, K5 O; I
: c+ o8 m1 O& J
例子:& o" x7 R% V1 r2 w6 r
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000, n. T+ [6 `' r4 \' Y" c
8 z- m8 f1 U: X# z* Z/ D0 h
.close;/*关闭文件*/' J* E& `2 \0 G' d' n
3 n* _( \2 Z. O' L; t标签说明:
% R" u# A! p8 Y% k/ U- O- m标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
C2 ?5 {5 x' ^1 ~. d, l8 {
8 a! t5 S; i" ^+ d9 D数值说明:
4 n; o6 [, q$ Q; `# o; o, s“0xA”和“0Ah”是16进制数值
& q1 z$ G. M- L4 s# D6 C6 m/ I: o! k" Q“0o12”和“12o”是8进制数值* y# ~) U& D1 c$ L* |
“1010b”和“0b1010”是2进制数值. \7 U+ M. D W. ~% X
, y# P/ k) r# E0 \, A
equ说明:2 u1 D% h: a$ D' I4 Z
格式:text equ value
" Y% K3 d5 l# l9 M说明:用一个text代替value+ E8 K" U- {) t1 |$ D! t r
例子:
' \7 U# y7 @( |7 Naddress1 equ 0x12345678* C5 H! a$ ?. ]" ~ N% s
ldr r0,=address10 k5 B9 L" N! t+ R9 ^* |2 z
.pool
$ s; h2 A$ K1 ~" @ Q% u2 A. z* d% W& W+ m. B- m4 Q
函数说明:
! D7 Q, W: p1 T$ b0 q ]# H) ?; t& G, G7 B+ D
.open函数:/ l. v' r# a/ o# G
格式:
+ y, N. \6 M/ @.open "ROM FileName",offset5 f4 Q3 a f' D# \ J; W6 S
.open "Old FileName","New FileName",offset
7 I) K, u g6 H% }2 T: S, v说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
; W2 \5 d9 v2 r3 a; l" {4 q8 y9 K5 W" }# ~. h5 v9 z2 d$ H$ E
例子:9 c" l/ w! v: O9 g0 T; E" B$ j0 `# c
.open "1234.gba",0x08000000# M2 E3 a$ x( p3 ]5 @- U: _. F
! c, ~& s5 t$ n! z3 E
.close函数和.closefile函数:7 r% s, s# u* ^# G9 k" E9 g4 c
格式:# g3 s% Y( d2 u
.close2 g7 t6 @ e& F5 i$ t$ Q: h* }9 e
.closefile
$ V8 R0 g5 _2 u' f说明:关闭文件。
) Q/ B M" }. s5 K6 n% D; J/ K
" b; i8 R q! _2 C4 ?* f.org函数和.orga函数:& B" a i6 h# n n. J
格式:1 I2 z7 G' `. i, E/ e Z
.org RamAddress( W) E9 T8 I0 q" ~" w( r
.orga FileAddress
, C: A2 n- h! J T3 \说明:
. D. s8 {" P0 z- m8 c6 r+ Y前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。' s8 R8 F$ k' X9 m) F
( T5 ?3 N1 O5 a) l
.orga函数可指定ROM文件的输出地址。! p n+ ` P( n- m
: \1 v2 W' F2 G# U2 O! y( C d6 h
.create函数和.createfile函数# J" M3 U6 G! w9 O
格式:
' B. t; J& F, i% D' R" ].create "FileName",offset
q5 p4 N3 q4 M.createfile "FileName",offset
, W* U1 Q# f/ [; d5 t说明:创建一个文件,如果文件是存在,他会覆盖掉。
8 u {( ~! R6 o& N* P
' B- H% y3 d r& b6 v' \8 X.area函数
( V' o: n: r. Z- e6 \7 t格式:
5 {+ J* p& P6 Z3 K y.area SizeEquation[,fill]% B# Z$ W4 C% b6 d' \
.endarea
9 p0 `+ |( ]8 O% W5 A0 m% M说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败4 {/ j: n) V6 G
. p( x. }7 h1 m" \4 M" ?; p) \例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据( i/ n3 m8 x9 u) S v2 u+ [
org 0x100
E7 q. ?; O' l6 s& K: w9 `5 y.area 0x8; W8 N2 y/ r; M- K
byte 0x5,0x6,0x7,0x89 S% K: ?6 q7 k9 O
.endarea
6 @/ V- q9 n. ]5 r- ~! C5 ?: b1 S5 ]5 e$ i" T( t2 R
.align函数
; j( Y- d( R9 j: U6 T0 [& r格式:.align num# w0 B: `/ i9 w; z! W: r
说明:写零字节,num为零字节数量,用16进制表示。% M$ W) h% R3 g7 I, |- S9 S
2 K3 |* L. O, W4 |.pool函数) w. p6 |6 g; T/ E6 J
格式:.pool* Z U1 o) c( L' g( {: `
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
1 H( H. X' ?/ r例子:
- L3 b4 ?$ ^% S: ?0 ~' ~ldr r0,=0x12345678;# G* w% s; T/ d
....
9 D) I/ R" n" Y) g5 F0 q4 Q9 y: M.pool
0 g. [. r4 B! h, `1 }
) O, a& }2 Q6 d P( B8 p9 e.fill函数! a6 C% R* }9 }5 r( {7 G* \3 ]# v$ ]4 N7 [
格式:
9 E$ @ h2 c% s+ ]- q0 q% [; ~; Q) }.fill length[,value]
" n* x1 G; K+ j" e2 c8 R z3 Odefs length[,value]
6 ?2 @% q+ f4 I# S4 x- L说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
% B+ v, B+ Q" P) u# x" k
; v7 f4 v/ Z0 o.skip函数:4 Y- |, k, ` a
格式:.skip length
7 ?5 Z6 O5 x* E9 ]+ `( w6 O- c4 v说明:跳过指定长度单字节数值,length用16进制表示。
2 k: O+ \) C3 u: Y. _' O F; c7 {5 @; m- \4 [; Q+ W& U7 _
写单字节:
7 e* Z G" E9 D4 x0 F/ t% C.byte value[,...]
& y- h' u8 E; a, U.db value[,...]
9 m, w' I1 S0 H9 ]2 F9 n" u.ascii value[,...]
$ I7 a$ \2 m, O+ ?.asciiz value[,...]+ c% u0 x! @/ {4 C. {7 b/ t
dcb value[,...]
# ?9 M2 l g/ y3 C% Z
! Y$ C) C( M$ j) Q写双字节:# T; y$ d$ K& f+ G* ]
.halfword value[,...]. Z: U8 e+ W) }# g
.dh value[,...]! ^6 g* ]) z% s4 n% q
dcw value[,...]- p5 C: Z1 l' R) @
5 t2 n2 K7 p$ T
写四字节:) C& Z* S. ]- X' j- v
.word value[,...]
; P9 O" Y* w( }% b( F, }- b.dw value[,...]. F! U- q- P: f8 N
dcd value[,...]
I/ a8 s) {# A0 a1 E2 k4 q( }5 ?* z# P7 E4 W+ v
写doublewords:
- v% z" s% W v.doubleword value[,...]
4 v5 r; C+ X: I* \9 i.dd value[,...]6 X* U. y B+ T3 g% K4 F
dcq value[,...]
, ? w- l |7 k# J4 \1 i- @
+ t& |* ^7 L; I6 n( R1 S# ]/ h写浮点数:
- {1 [ B8 w I% D5 d.float value[,...]
" w2 [ [; d1 b+ T4 ].double value[,...]
; r l7 A5 A# ^& q: g7 {
3 a% Q j, S a! SARM的ARM模式和THUMB模式定义:
1 o3 F, I1 w$ u0 I$ I7 g* E.arm|ARM模式6 j4 J( a! o# M$ }/ v
.thumb|thumb模式
% C: R d+ r2 q4 Z" N
! }/ ~9 D; c1 a6 b设置架构:
6 g8 Z3 m9 u, h! r; o.psx|PlayStation 1(MIPS R3000)8 }3 B1 q D5 ]$ P* `0 X) d: b
.ps2|PlayStation 2(EmotionEngine)
& @# L' J8 E6 l7 O }.psp|PlayStation Portable(Allegrex)6 @- Q# @- ^4 {
.n64|Nintendo 64(MIPS R4000). J$ @* B. v: y# I& ?8 l" o5 b O
.rsp|Nintendo 64(RSP)& r8 E( t& J% @: G9 ]3 ~6 s" X" @
.gba|GameBoy Advance(ARM7,默认是thumb模式)( e+ J. b& H' V3 b0 K
.nds|Nintendo DS(ARM9,默认是ARM模式)
0 n7 Q2 D7 H8 j! K.3ds|Nintendo 3DS(ARM11,默认是ARM模式): S) C, V. D b
.arm.big|
2 W I% `8 _* @7 e5 @2 A x$ q.arm.little|
/ {5 l0 T1 N( w$ O2 x2 D3 t0 q( b: G1 Q ?# P
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
0 D9 s/ t+ B. a: N0 | p |
|