签到天数: 2053 天 [LV.Master]伴坛终老
|
3 p% r# y# m. _4 A9 Q4 o% ^
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
0 O: A ?. F/ g" s7 m! R
2 F/ [4 e: C; c1 D* A! K+ x; jARMIPS assembler作者是Kingcom,目前发展到0.9版本
( ~. Q2 |1 d% g1 F. z. _! W+ x* Y5 i) x- a
Kingcom's website:http://aerie.wingdreams.net3 D* K! o" `: c3 k6 _( B# N
8 R" Y G7 y& Q6 m* DARMIPS assembler源代码可去https://github.com/Kingcom/armips获得. i' E7 {9 R1 a
0 g: N: [/ s/ f
更新版本可去http://buildbot.orphis.net/armips获得
- g9 [/ l; M3 z9 g$ D. n; ]4 Q) S' c& I7 E
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。5 l/ O3 L6 Z% s
! T! r: ]! `, k! y
ARMIPS命令行用法:* d$ p' P p5 R4 Q& O/ s9 U) B
+ |: ~4 Y" _$ ]Usage: armips [optional parameters] <FILE>
# B( ?2 H6 d! F* |
0 ?- `9 H% U$ }% m WOptional parameters:
& r2 o& a3 H- c4 A7 |) t" t, R -temp <TEMP> Output temporary assembly data to <TEMP> file1 M8 m; J+ q3 `; w5 P
-sym <SYM> Output symbol data in the sym format to <SYM> file
4 P6 z$ ?" Q/ ?. M4 M5 J3 q1 {1 p -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file: ?9 f# d$ D5 r% ~3 I
-root <ROOT> Use <ROOT> as working directory during execution
& ^8 t \* _& \: D -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
& k; B m: q* U8 p0 A" q8 i$ Y ~ -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code9 O ^$ Q$ ]; B! O5 Y
-erroronwarning Treat all warnings like errors
7 I' q+ x& J4 ]4 v
1 f c; G) O7 _- m) T* OFile arguments:8 q- d$ _6 U! V& O8 Q1 R# A6 ~/ Y! Q
<FILE> Main assembly code file7 d8 W! n. j" {* T j) |( ~7 R
/ ^" i+ @) Y X \2 n% A' }9 ^
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
' r e' p9 u Q3 ^4 J& U& [9 X3 n-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba1 a3 q v% Y2 j! X- ~
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
( `+ m- H( l4 |# T-root <ROOT>参数是指定执行期间要使用的工作目录. o- T7 s! W: L/ V$ f& W/ t4 m* R
-equ <NAME> <VAL>参数用法不明
0 G/ j; T% K5 X: X6 v3 x- C-strequ <NAME> <VAL>参数用法不明
i7 S0 D k( G' p: o-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
; e8 f9 {8 Y! I, K9 l" O' x
' ]2 A5 ?' Q! ^<FILE>是汇编代码文件,可用记事本之类编辑 k4 ^' S8 R) c4 z
0 E" {( m; L3 D4 d
注释说明:6 I( w' R+ `8 L% j V
注释可在单行指令后面“;”和“//”添加0 g# U- j! n# g* _3 Q3 [, P8 _& I
“/* */”式也接受, K1 P) x; v, ^: N
8 _: I: }6 ^: c6 v4 o例子:: |" X4 D o) k
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
- H; G( F8 K1 a8 u( ?: v V6 Q
0 U( a) P0 X2 ~8 v7 W8 X; i.close;/*关闭文件*/
5 z8 A4 Z6 w7 P: m+ N9 ?- z8 X8 `; E4 _, k5 d' a9 [! G# \
标签说明:
( ~! O' @! w# e; @; {标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。$ B5 [/ s8 Q; e- Z
# i6 }5 E$ j* N( B) J2 {9 u. b数值说明:
4 X+ w8 Z9 i9 X, X' ]' Y“0xA”和“0Ah”是16进制数值# I& y2 V% k% W
“0o12”和“12o”是8进制数值
/ @6 Z& Y/ T. P$ `! V* \“1010b”和“0b1010”是2进制数值2 }! F y! ]. _
6 e- H" k. B/ I0 J& Xequ说明:
9 [0 X* f2 X, X; b格式:text equ value/ {; o% t+ a# D) Z
说明:用一个text代替value; [' @+ b+ ]7 {
例子:
0 q2 Y+ p2 n4 w7 Q1 Q3 Eaddress1 equ 0x12345678( q6 ]+ v% K8 q6 }$ b- i% z! J3 N
ldr r0,=address1
# Z9 r4 F* v. I& ]- l6 c8 W.pool
0 q# \& [5 d" |# K$ ^" G' C3 H3 z! h
函数说明:
9 s" Y3 Z* P0 `: G" T7 H4 {& W/ o& ]+ ^3 j; g! F
.open函数:
2 D3 m. ^7 a9 n' Y" z格式:$ F( a) ?5 y7 D) e5 Z. m
.open "ROM FileName",offset9 X2 d& ?( p- }: i
.open "Old FileName","New FileName",offset
& P& I( b6 a* [+ I+ W4 J1 e5 p. c说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
& I. ^- W/ m9 n2 P3 O4 C1 W& ^* l6 I) z( x. \
例子:
' ?/ t0 p. e y.open "1234.gba",0x08000000. {0 `8 E( p7 L5 c5 w& N
$ b, V7 O3 Y" v( c+ K.close函数和.closefile函数:- T* H, ~+ g1 o3 a1 Z) K1 [4 e8 ?
格式:
8 {0 L& u3 T2 m2 D.close
! X3 l1 V1 o% G5 S! r.closefile
! b; h6 w8 K0 }6 t- m" L说明:关闭文件。
8 |; n) m, ?4 H! ~# s
$ O: n$ T: R6 K- Y# g: S! O ]) p.org函数和.orga函数:
# z6 Z& H2 }. e6 L: M格式:
1 g, @; _% K$ f7 O( F% O.org RamAddress3 @- W1 r4 D" l3 m
.orga FileAddress
: _, _: b5 n% f. `: K, F说明:
/ w3 ?3 ~( @( X) N% e# f/ y# ?前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。# e! U7 h2 M9 r9 W. L$ f! d/ Z. A- V
, B; o; x3 z) D5 a
.orga函数可指定ROM文件的输出地址。
$ R# g6 v. K3 K# Y# x6 G% T4 b* o% [' M, R) a
.create函数和.createfile函数4 v- r7 b2 r$ r8 p) |0 J
格式:# @" _) u2 N1 C) \1 G p
.create "FileName",offset& ~6 j& L) H) }/ o4 K& \% E
.createfile "FileName",offset
7 Z1 ^2 k' X7 @! b" R说明:创建一个文件,如果文件是存在,他会覆盖掉。) B; z3 J6 I( k4 e! g7 N ]6 \( t/ J
% R' |# @0 _+ ]1 C+ [7 V m
.area函数6 ^* ~5 @" @. V# l& u8 G2 W) f; M* H
格式:$ e' b! Y% ]9 E$ v5 Q$ t2 P7 P3 M
.area SizeEquation[,fill]. U: X3 p D+ z
.endarea
0 n: k! |1 x# _/ ^/ u7 v% ?/ q说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
" T5 f8 R$ G( |% o! [- H; m; A- I- Q2 x9 {
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据) b, I+ l! U+ V+ Q" E% ^5 k
org 0x100
9 i$ f: \4 K6 k+ |) V, Z: t) z.area 0x86 I6 Q8 f! G, e, W" k3 k
byte 0x5,0x6,0x7,0x8$ ~6 R7 `/ m3 X1 |5 l3 S# l& V+ L
.endarea
/ Y/ ?+ o+ I- _; j3 x: ?4 F: ?2 o2 P4 @5 L
.align函数
9 y$ o: O% l4 ?1 k5 |格式:.align num
/ H3 c0 k' i* s% O% k- d说明:写零字节,num为零字节数量,用16进制表示。$ F! \8 C4 X* I% G
1 `' ~' b6 N; t2 ^
.pool函数/ x& N9 A3 I* `7 B: a0 `! @, B% e4 i
格式:.pool
5 X+ R) E4 a7 c4 T4 U5 l! b说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。$ l' L2 p5 \( w4 t K! D
例子:5 X6 v* ]2 T0 w( n/ u5 p
ldr r0,=0x12345678;1 V3 k7 [3 j( R
....
1 H4 X7 F' B0 x/ V+ ^.pool; F, s7 I) d3 o
) ?% v- L# B' Y
.fill函数2 s9 @; N: i: U# w9 e; _5 ?- n' `
格式:+ ^ p$ p' O, \1 O) l7 s
.fill length[,value]
" F6 F. z* G' j Edefs length[,value]( r* N$ ~) a. z9 C) [- w0 T5 ^) _
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。! {% \ |- k% {, U) f
& E: |% _/ T# w7 B4 q! t
.skip函数:# g1 o( ~" v% u1 O1 @9 |* q4 U
格式:.skip length
: Z) D# K- f1 u* S5 B, p$ H说明:跳过指定长度单字节数值,length用16进制表示。; P3 z7 D. k. x% ?1 q
# V! z* h9 ]- t) A
写单字节: L; e; g1 `2 ~. J' V9 A6 O+ e
.byte value[,...]
3 |5 i( a% \5 W7 j0 @.db value[,...]
0 G6 n) ^7 c% m- P& H.ascii value[,...]
9 Y' K- `9 ]1 e! W# a3 F G.asciiz value[,...]+ o( M( m, a$ J; l6 }4 f( ~
dcb value[,...]
" W8 b# n& v8 e r, S2 M# S5 w8 N; H/ |$ ~4 l G0 h! i3 ?
写双字节:% B6 L+ p3 T% j- G& U
.halfword value[,...]3 _5 X( B' Y+ K- X% ~
.dh value[,...]
) z* D2 @$ }, Rdcw value[,...]
' B; x/ d- E! N+ J ~3 Q6 Z6 K* |$ y* z1 [8 r+ m) t3 B; l7 x# j
写四字节:: Q- a1 R- z, s
.word value[,...]
6 L. Z9 p0 A y! x( g.dw value[,...]
( C5 H) n2 E2 g6 d4 V8 mdcd value[,...]
u6 c5 H9 w$ r" P4 Q
3 w. B7 r5 q" H7 a! @! B: I/ y写doublewords:
+ m- ^$ ?& D0 B( q) r& J.doubleword value[,...]/ e' }/ @' }+ _! k; I* ~3 m
.dd value[,...]3 x- p- k5 y, |+ k# J) O' X6 N) A
dcq value[,...]
+ k2 X6 [0 W8 B* I) P* W- t
0 U* c0 k* t# Q' e: k. w* o写浮点数:
8 g2 D q1 B: i D) n. i$ P6 l$ W: q.float value[,...]! x) I6 u* m# U: \
.double value[,...]
3 [# ^: Y" x* U6 m' q/ R: t! i; t0 t! q: c$ t0 s
ARM的ARM模式和THUMB模式定义:7 o- B+ t$ j0 G! m* h. S
.arm|ARM模式
$ z% P, J9 o" d2 s.thumb|thumb模式
H" m+ f' P& r
! `) d* P- {* R s0 O' a设置架构:4 M) o" c3 R; `9 e
.psx|PlayStation 1(MIPS R3000)
2 l9 p& |! c, b5 e.ps2|PlayStation 2(EmotionEngine)
( ]$ V( W% ?5 U.psp|PlayStation Portable(Allegrex)
( s. q7 C& j- t- x, ?" `8 V! j.n64|Nintendo 64(MIPS R4000)
7 b% v# h/ {9 z6 g.rsp|Nintendo 64(RSP)
1 b- m& `$ h2 A% I% U- n/ m.gba|GameBoy Advance(ARM7,默认是thumb模式)
% }, L r4 |4 X.nds|Nintendo DS(ARM9,默认是ARM模式)
+ i! | ], A( p; k: [. Q; R! n.3ds|Nintendo 3DS(ARM11,默认是ARM模式)8 }4 g: D8 u4 @* r/ e B9 A Z5 i
.arm.big|1 q, [2 E5 `8 l
.arm.little|
9 L- p% \. K! L) S3 n* _
7 V8 K. E7 z* r8 X y常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。+ C1 V. h2 A" I) i) @+ U
|
|