签到天数: 2200 天 [LV.Master]伴坛终老
|
, h) v! o+ y9 E3 k( ^# [. ?, `% V
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000# ~2 z& }* I/ b7 I% {4 C( Z( Z
6 Z: j) k- i- h6 ^ARMIPS assembler作者是Kingcom,目前发展到0.9版本: P$ z" I2 ]$ c# v
! q+ s7 @7 w) t
Kingcom's website:http://aerie.wingdreams.net
( t/ L9 t5 t4 P/ l" B7 B# L4 o: [. c
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
4 E7 N6 ^6 _4 D) n4 J$ ^8 ?3 d4 z1 O0 B; G
更新版本可去http://buildbot.orphis.net/armips获得; I8 l5 y `, L' I$ b
5 b# i: y0 h, z! b; `' |
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。: L x/ K `" @9 @: ]4 ^1 w
: u6 C/ D" _0 I) W* V8 ~) {. a1 oARMIPS命令行用法:
$ A* T$ T4 `) `4 s+ n
?5 S& @+ [9 I; x" ], g8 @Usage: armips [optional parameters] <FILE>& q- ?) e$ D$ D. b! [
j. Q* H! C& a }" F: X# Y1 A1 d
Optional parameters:
3 V0 |: d" z& v! s8 D. P! I! T -temp <TEMP> Output temporary assembly data to <TEMP> file8 |9 x; A' H; u% i% y
-sym <SYM> Output symbol data in the sym format to <SYM> file
' \4 H0 X9 i0 u2 |8 H$ Y -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
9 k" I6 |5 u3 p8 W t -root <ROOT> Use <ROOT> as working directory during execution
7 `: @+ l! c ~ -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code8 i4 D6 ^7 l0 _8 ~; G2 {8 T# Z
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code( _+ ], u) p. {5 O% b' b
-erroronwarning Treat all warnings like errors
8 n+ G1 B8 c0 q; C8 A' n3 S2 Q% j2 v7 {: s6 B8 D
File arguments:; G" }2 I5 Q0 e( n6 s
<FILE> Main assembly code file0 g9 i. t+ [0 x5 {% T5 {
. V9 s4 l1 L1 u% B* Y, p
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件5 R9 a5 O9 P! w+ u4 a9 F* h
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba% P2 o! v' K% u
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
- e$ l8 a9 v2 h9 c; C-root <ROOT>参数是指定执行期间要使用的工作目录
# O t' N/ B+ a0 U" v( k" R* d-equ <NAME> <VAL>参数用法不明5 {, U- b; R: E$ L* J( ]
-strequ <NAME> <VAL>参数用法不明# x* C M6 J; x
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译. ~( o) y2 D4 a" p/ D4 E
( t, L, [( B* l3 S9 H<FILE>是汇编代码文件,可用记事本之类编辑1 Z) D' I5 m4 }5 M
4 u4 i8 E3 X9 e( m) a7 e% i& h
注释说明:; G8 H& J% [4 r9 J! x9 U5 x
注释可在单行指令后面“;”和“//”添加
6 N6 w8 t* }4 {2 @# v3 x# J6 R“/* */”式也接受
1 d& I: W8 d; [$ d$ b b2 G# E5 a' u. u+ V' N6 R
例子:. Z6 [3 Q- J% B! v$ O- u
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
# V- a; k$ `2 W8 T4 q0 q2 f5 A- |9 _, Q% s5 p( N8 i
.close;/*关闭文件*/0 n6 s3 E4 A! t$ }" v
; i% n6 |3 o1 J3 {' ~7 ?
标签说明:
( S G* y3 A8 |( Z8 P标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
: k- ^# b) w* Z* R2 j' v; b. b* S( _* ^/ u. |
数值说明:. n6 o, H& W+ c/ C4 }" j9 I
“0xA”和“0Ah”是16进制数值
) w$ u/ \2 E7 o“0o12”和“12o”是8进制数值
8 ^0 R. B4 h2 s; C) f' V“1010b”和“0b1010”是2进制数值
0 E) x0 }7 `! B& K6 X, O
1 x/ g" `, C, Uequ说明:! _$ Y# U+ m8 j
格式:text equ value0 I8 R2 l8 |' c. V# m3 I- K( D
说明:用一个text代替value
" [0 i% W9 f! Y( M8 V例子:* m! Y2 d5 E8 b: |
address1 equ 0x12345678
1 B! N( L3 L1 \. M6 ?0 p0 xldr r0,=address14 f% y: s B- H" `# X) N5 C0 R
.pool
4 \+ k2 C! W' C7 q
2 q% }3 \6 h' _函数说明:( U& Q/ M% Z$ F# r2 G+ r1 u$ X
- J6 D4 M# y' @4 j* U, F
.open函数:
$ g1 |6 |/ c7 `! t/ o( t% e1 J格式:) y& U1 f+ N2 y, Q3 \. ~4 S/ W1 R/ a
.open "ROM FileName",offset( W% ~* L5 R' x
.open "Old FileName","New FileName",offset
+ A) `" d8 ~4 J! O+ Z4 \说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。3 @! X; @5 n8 v( N, [8 q" M
y) H7 @: b' {# j
例子:
5 F# G/ J5 K0 `4 G) q.open "1234.gba",0x08000000
: F' b6 e/ m- ~8 [5 t1 ]2 R+ q' W9 K8 w
.close函数和.closefile函数:
0 N" K$ ^" `* H, f7 S L格式:' r4 ^5 ~0 n) j
.close9 m& y- r7 m: M8 }" O; S) R8 q7 i" C
.closefile. d$ G' I n+ j& n# z' q+ ~
说明:关闭文件。
6 D$ o' J, t. e. U* r: O' u, r% X) ?0 Q# @. G4 ~$ g
.org函数和.orga函数:
0 P, T9 g+ i6 e- g" |格式:* P( {5 x9 L2 c* C
.org RamAddress
* I% r9 s+ S8 c% [.orga FileAddress& X c# n& t# b) s* _+ d! A
说明:2 @$ X* r {' |- R
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
- x S$ Q0 G* n/ i" U% {' t% w2 }' Q
.orga函数可指定ROM文件的输出地址。5 r+ S' E$ M+ [) u! c3 y8 W
0 `" u# ~- l; `3 m% r5 O
.create函数和.createfile函数% D. o1 E! N+ I( R' |
格式:6 ?- K: _" D3 {. O/ \( _5 i- R
.create "FileName",offset- I/ ?& d& z2 J) f
.createfile "FileName",offset
0 }, j9 {( Y5 m, J说明:创建一个文件,如果文件是存在,他会覆盖掉。
' B4 i# t7 ^9 L- M
7 o" D. V/ W: z$ _1 J.area函数+ ]5 V1 n( e: V9 S
格式:7 R, G- ]4 f$ N; g6 O9 q
.area SizeEquation[,fill]
' e$ P: { c; K R% s0 ~.endarea
1 _- s2 ]+ i7 f说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败- B% z1 Z- Y* u/ u2 W8 w$ z2 h8 e( F2 H
/ f% }. K, ` I. [, M例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据" t, v6 Y+ h/ S( {* J5 Z J; k
org 0x1002 l$ j4 n& u% M- ^5 |$ }
.area 0x87 T/ I: H3 `2 y8 e9 g* ~3 M! X
byte 0x5,0x6,0x7,0x8
0 D6 B* y' [! V1 P5 H9 z.endarea
6 N: u$ ]2 z# i* n3 P Q# v* |2 ~
; X N+ `$ |! h3 x: |5 f.align函数7 r5 }% }4 j. V1 \- @
格式:.align num' m0 ~. @5 H1 a$ J4 B) [
说明:写零字节,num为零字节数量,用16进制表示。5 R: ?$ }$ h) M( v
) S% ?, {% j7 `5 O1 \
.pool函数
) R( x# i0 \7 ^' p0 k" x. v格式:.pool
# \7 A; X2 U& g+ A* V0 F说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
& P) k9 s& W+ S5 x' p例子:
, x5 W( e9 \; _ldr r0,=0x12345678;( r/ j; |9 `, M) U1 L, O! c F
....* t& [6 r) [- n" t% w9 m- p: H3 z
.pool
4 x% \- d, g. @& c
2 D, N' ?1 M/ C1 `- G1 L5 Z( J.fill函数7 W) Y" j6 S: ~) C0 i* h
格式:' N# M& N1 V: W" V- |/ c$ w
.fill length[,value]
. B5 W; X! R& \: d6 z- N. z/ K, edefs length[,value]* x9 e) n# A% [: x8 q8 e
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。8 b5 g& W1 N) P2 n
% `1 S2 O. Q1 R- C2 h
.skip函数:# F* _6 U: _# i
格式:.skip length
6 p& `" ^4 C, U \3 m/ @说明:跳过指定长度单字节数值,length用16进制表示。 I% ^/ F! |4 N
7 |! F- ]- I* z2 @* n
写单字节:
1 M. k s1 t4 h) c: c.byte value[,...]7 k3 K( N8 H% f/ i L
.db value[,...]
! n; t1 t1 [( ^( b8 a2 E4 U.ascii value[,...]- Z1 v% R. E# g( ~8 u
.asciiz value[,...]
7 U$ l' t' P c/ q2 _9 idcb value[,...]0 s/ ?4 R2 K [3 ? E) A4 b# Q
( C1 H# a* S$ B+ w; s- b
写双字节:
# A9 O7 T6 Q+ l7 v' L" ?) s.halfword value[,...]
1 J/ h' t( _" f- y, x" y.dh value[,...]0 `3 S4 O* ^: j- @* ?
dcw value[,...]1 p l/ @' B/ e
. p5 D3 Y) w; B) e$ n, ^, f
写四字节:
9 L& `& ^0 Z7 Q) }4 `* p.word value[,...]
b9 r6 A; o% t! u( `% Q$ e.dw value[,...]$ `' f/ o6 K! c" O
dcd value[,...]% a9 S- C1 }. l. _# O6 ~
; Q8 b9 Q+ v3 {
写doublewords: |* w& N* v" E3 [+ {1 }
.doubleword value[,...]
$ `( \; u% e9 P.dd value[,...]; V& |/ n' Y( w( ?
dcq value[,...]) Y' `6 y0 N' ^; ^+ D, I/ s
! h. v' y2 H, ~9 T' ]) V0 S4 J7 W
写浮点数:6 u/ ? j# W4 e9 a6 M) N& {
.float value[,...]2 E8 l4 l% q' R) J
.double value[,...]
6 N: x0 U. G: j: k2 A6 r. @
; @& B: p3 N% e; J: n* k7 wARM的ARM模式和THUMB模式定义:' |* H; d9 K5 K0 Z$ X9 u* ^4 @7 E
.arm|ARM模式( [4 S) W: ]% z- r# `+ k
.thumb|thumb模式
2 A+ a$ m" k( u( R: l
/ y* B, L9 C' F9 W7 s8 X设置架构:6 W. z' z* U' K% E! i2 R; s; d
.psx|PlayStation 1(MIPS R3000)
7 Z1 L( A# y% w, |8 `8 ?.ps2|PlayStation 2(EmotionEngine)# \( U3 x! W& _' ~5 f# `( d
.psp|PlayStation Portable(Allegrex)+ }+ V" j" q0 F3 I8 w4 z
.n64|Nintendo 64(MIPS R4000)
. z7 c! q1 ]$ {4 @' _! ^) |.rsp|Nintendo 64(RSP)
2 f# E0 E9 P5 q5 F0 L/ A.gba|GameBoy Advance(ARM7,默认是thumb模式)
5 t/ S% R; J. E$ M7 K G.nds|Nintendo DS(ARM9,默认是ARM模式)
3 G! e0 ~: i4 u& Y) n. @$ }.3ds|Nintendo 3DS(ARM11,默认是ARM模式)7 T& W& N: j9 }5 u
.arm.big|/ `. v$ Z; x" x
.arm.little|% D: H$ @3 y) J6 \( s; p) q
# S4 U7 u+ i) \7 g0 g常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
/ t) M2 _; ]0 P- ^ |
|