签到天数: 2186 天 [LV.Master]伴坛终老
|
( Q% z2 z* U; u, k3 k. w2 w# z( y
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000" Y3 T7 |: q i5 J
$ k* l4 N6 l8 c$ G; J6 d4 i! {ARMIPS assembler作者是Kingcom,目前发展到0.9版本& c$ I6 P( p" V" G
Z4 u: C T( M9 nKingcom's website:http://aerie.wingdreams.net
+ y( ^4 W- m% M( Y2 q, b6 [( e& K/ v
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得, I% V- i: x; k" i
6 R! S+ s+ s& t# A. s- T更新版本可去http://buildbot.orphis.net/armips获得, L6 o0 f" g/ I( Q6 [: X
: q) h& M. L# [: }ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
+ a; C/ b4 k) E1 ]8 z' J+ b; \/ h; J# Y9 M$ H7 _, Q7 {) |
ARMIPS命令行用法:9 p7 h& K4 h) H" } P% b( O$ H
1 Q$ J; o2 s! d5 b
Usage: armips [optional parameters] <FILE>1 X1 q; N. n3 ]( S" I5 @ O
4 z4 [ k! u( F& ^6 ?3 S* M3 G/ c
Optional parameters:% p2 W# b9 s8 ?
-temp <TEMP> Output temporary assembly data to <TEMP> file
w$ P# a- ]3 K7 n: `$ q9 b( @! ]' [ -sym <SYM> Output symbol data in the sym format to <SYM> file: H! b2 \8 k2 n3 X9 O8 O: j4 [& n
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
R7 n7 v, | s; [ -root <ROOT> Use <ROOT> as working directory during execution
8 {7 p3 v3 T/ r p5 s -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
% M' _2 ^& [3 Z3 Z r9 {0 c" G8 t3 r -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
% R5 H! w/ z5 ?2 X: ?+ h -erroronwarning Treat all warnings like errors" E3 c, o: t, x; ^. ]/ K+ L
( f ?6 p) @/ GFile arguments:
4 R$ H$ x0 L. [; { <FILE> Main assembly code file9 Z; I0 h$ t' P
! C2 t9 O( f6 ?$ T-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件2 b! [# x3 ^3 l* X+ Z% V z
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
Y7 k/ c! B- w' F) S: Q-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp% V0 W |5 K6 z0 s
-root <ROOT>参数是指定执行期间要使用的工作目录7 }* g! a! ^6 ~
-equ <NAME> <VAL>参数用法不明
7 v3 r0 F6 J, Z T+ @6 l: I-strequ <NAME> <VAL>参数用法不明5 k3 y: a' `! W' M5 L6 ?5 A8 D
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译7 G- D# Y& o* R" L5 _
# B$ ~( t' w& F( ]/ I |* H
<FILE>是汇编代码文件,可用记事本之类编辑
4 I* ]' Q ^$ S% s5 U+ |# S2 q' q" B. f* t5 [5 q0 l$ e+ P$ G
注释说明:
' B* t) W) a+ b0 H, } z; U, t注释可在单行指令后面“;”和“//”添加
6 ]2 ? P$ i8 \, x“/* */”式也接受
7 r0 l# z; a$ G* n, u1 j* O0 [% _. ?' W& R
例子:
& _# W& W: {% X5 |. \1 Y5 B.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
" Y4 K7 ~% _8 e3 O! v& D9 B7 \ a4 P, u5 H
.close;/*关闭文件*/
/ n. c- L; W: D7 u3 Y k
$ v5 B) Z( D7 @2 M标签说明:
7 o: j8 e' ~! J# ]! K* _: K3 Y标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
) l! p! }$ k0 h8 B: R, |9 u; Y+ y1 x! j3 [% f2 t! i! M
数值说明:) k% a, w6 c) t# k( Z6 I
“0xA”和“0Ah”是16进制数值3 t* t& t6 I/ z. o) ?7 H1 I
“0o12”和“12o”是8进制数值# N5 H+ c* ~, W$ D. x# e- @8 _
“1010b”和“0b1010”是2进制数值( j1 h! E' }* ~) L
8 ]* C) n% U! d T) \equ说明:
S L+ R* D) k6 M- k2 g8 V+ ]格式:text equ value
' u) \4 W* e. O. q! h说明:用一个text代替value4 b. q8 s9 R* u: y* C5 S( a5 B
例子:) i& ~% q' Q9 ~7 S( l! m- A
address1 equ 0x123456781 C! J8 t/ U8 c i" h) J1 G6 @
ldr r0,=address1
* _: j+ v( }0 R7 h' w" k% f.pool7 o, m. p! u5 |! Y$ n
6 f0 {; v6 _% H. S
函数说明:: z& F4 x1 t$ v# k. x7 g( Y z
& M Z) o" {6 a& h x# h
.open函数:
' T9 w G! K8 T# ~. h8 I& }+ O格式:! L2 h5 e) b- } M# P
.open "ROM FileName",offset" `0 u+ u% J: m: W0 I) e: R {
.open "Old FileName","New FileName",offset" c5 U6 m: |3 E- A1 O3 p: \
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。. b9 e! T+ k/ f6 N
2 j7 T+ ~& V) e3 v1 Y例子:
7 y$ W1 S$ J) J) R.open "1234.gba",0x080000000 _! v4 Q- @! v! _6 [# }& Y
& p, P! t# T0 X1 {
.close函数和.closefile函数:
) }5 z( ~( ~ B" P: o- ~' B格式:
- e# ]# u# f! B1 c. M6 [$ ?.close [) b8 q* q8 J0 u% D$ g, p7 G
.closefile
. s. ~, \% Q. B0 |9 c8 G8 ~% a说明:关闭文件。
& a, N/ G; h6 S& F
8 y2 C, H, c6 U& }$ O8 q.org函数和.orga函数:* C# f' n ^* K m' {6 r0 p
格式:
- s3 ^/ r. Z8 d) A.org RamAddress9 B; w+ u# | {
.orga FileAddress- F) c+ w4 d. O$ `/ e9 ~ C0 H, s
说明:
: H# H0 b$ I* G/ x0 e# c) X- H$ i; [前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。* q2 c7 p1 B* B, K4 Y
. O1 r6 x8 g. ]6 S5 a.orga函数可指定ROM文件的输出地址。' ~3 u( e% P- ~0 O* \! @% K
+ B j; y, n: }5 c" Q; u7 }3 {.create函数和.createfile函数
+ E( K9 I$ i7 n& ]0 r0 o' h格式:
7 V. g/ ~. [ M1 D.create "FileName",offset
( O G* q+ q% z4 X- _) l.createfile "FileName",offset4 g1 D8 p& A* p% m4 }3 a7 ?: O
说明:创建一个文件,如果文件是存在,他会覆盖掉。( B+ F3 I/ [0 ^& w
0 r" T( [ H' }3 Q% X1 W$ M' N.area函数5 ^8 d0 h8 y% V
格式:5 v, @8 V8 q+ y7 w5 Z z
.area SizeEquation[,fill]0 D! k+ e- @) \8 A# @+ O4 {, ^9 M
.endarea' u' K8 l3 [0 t$ @6 e
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败- z# t/ n5 Q. |9 G1 h% u
3 O" K. K7 D1 E' T4 z
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据; L5 o1 ]6 W0 L0 h/ m; E+ s. m
org 0x100+ ~. \3 D$ r* G# t; I! F" {
.area 0x8
8 [+ ~4 s, W" X/ |0 [3 G$ ~9 Mbyte 0x5,0x6,0x7,0x8
8 Y1 B8 U8 v/ {' ^: I' N$ C.endarea4 l3 r) Y$ Z- {
& i$ K: M5 q0 V, u* `* H7 z+ [) y.align函数
- j! _# }% m0 F6 h格式:.align num
8 T# Y8 r; J$ O- G5 x* S说明:写零字节,num为零字节数量,用16进制表示。
. }; H0 m' z0 h$ M$ q3 m9 }8 z ~& f2 b* A
.pool函数
, \" |- A9 L. Y4 S格式:.pool
' X2 w/ g" d4 q: G# g$ p( S! P* I说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
; H4 k$ N2 l2 H例子:
3 D" Q3 G; }- d8 X {ldr r0,=0x12345678;
2 F( j5 l7 w- v$ A4 a, e- X" \....
9 b, X) a/ T, d+ l6 b+ K0 G# I.pool
1 | G/ I, [0 u6 |* e/ F/ [0 j8 j
- _% i+ r- i! Z0 ~% t.fill函数
. ^5 e4 O7 Q Q3 t格式:
/ X* Z& D0 ^5 Z K/ B. T' f5 ~2 G2 L, Z.fill length[,value]
7 R X. @- v! y/ A$ F, kdefs length[,value]
0 _# u" I8 Y$ Y8 {1 C/ X说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
+ c9 ^# E* e( I7 H4 d, m j& @2 O3 c" }
.skip函数:
2 f' ^+ Q. G: p: \# a格式:.skip length
9 S# X( v* R9 ]6 I: G+ u+ l/ o6 r说明:跳过指定长度单字节数值,length用16进制表示。
" N" U4 ^4 Z# L4 F- r6 h
/ P+ ^/ h5 b; }/ A8 a3 U1 E写单字节:
! Y; a& n- m9 ~5 u1 C5 ?+ |1 o.byte value[,...]
. Z7 u5 K* ]* q' o2 m3 o.db value[,...]; L% l1 J/ b0 `# T, l2 H
.ascii value[,...]
. y8 [& W3 i. D.asciiz value[,...]
" _/ u' T& |1 j% E; Q$ pdcb value[,...]/ j! o w* d5 M9 d8 I
1 v3 z/ H+ t! m/ d! q. ~+ O写双字节:
; `& R8 I/ x% I.halfword value[,...]3 M! V7 y+ H/ F7 ?3 O
.dh value[,...]# c7 X) w9 S: p8 y7 a1 H. x* S- @0 n
dcw value[,...]
) y# t! E8 o( `8 x4 P
& v: `0 m' X( _3 c& h写四字节:7 d" m* Q, E6 {3 g5 I
.word value[,...]
8 R$ R0 t8 ^, D* l.dw value[,...]% A. {6 @0 l; `$ ?$ R( V# w. R
dcd value[,...]
+ v: a# O" F% P( U$ {) _9 l
5 m9 ^$ Z6 k0 @- \写doublewords:) d: p5 o/ @. n F
.doubleword value[,...]
4 w5 [$ g4 v( \' a. g. B9 V.dd value[,...]
" f/ h# _, n* P. v5 \9 _# Gdcq value[,...]
" M3 j' ~7 U8 I# I2 a
- a7 I* B: y1 H写浮点数:
- Z4 o" ^1 {1 K+ U/ |2 Z e.float value[,...]
2 \3 t* P, P4 J7 S7 a.double value[,...]) N" m3 I' D: k0 A2 E& `
. c+ H* \. F( p* j2 b
ARM的ARM模式和THUMB模式定义:
4 W" Q( b6 u0 V! z* W' f9 _.arm|ARM模式1 t* u# r& E m p5 O
.thumb|thumb模式( {/ ], K/ T: ?' }
7 r1 K) y! m5 b( m9 `4 E* m+ T设置架构:
: a' G2 F5 s2 q9 A0 |3 x; y' y.psx|PlayStation 1(MIPS R3000)
9 m" N; S7 X$ x+ {" e, U.ps2|PlayStation 2(EmotionEngine); b9 W4 N) x4 O$ L% q
.psp|PlayStation Portable(Allegrex)
+ f/ M- s9 _0 V4 o6 a. G.n64|Nintendo 64(MIPS R4000)9 b |5 I7 H$ s1 W$ e' N1 ?# Y
.rsp|Nintendo 64(RSP)% Q/ ?2 k! N# |& o0 e9 V9 m
.gba|GameBoy Advance(ARM7,默认是thumb模式); V1 Y- I/ T% [; R6 c
.nds|Nintendo DS(ARM9,默认是ARM模式)
9 q* w. I8 f V1 o3 x4 e% \2 A) e.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
$ l* [" W, O4 K5 v.arm.big|+ P6 \" y/ @! x0 `$ F
.arm.little|
. Z: k; e6 k1 W' {, L: Q2 N
- L6 J p/ \ n j) [0 C常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
7 o' K$ B) m$ P2 P8 x5 S9 | |
|