签到天数: 2012 天 [LV.Master]伴坛终老
|
R. `1 E5 w1 _# n$ k' D1 tARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
' |6 D, M) [; }# W& |- u
. w0 T- m/ n( P$ m/ ?, iARMIPS assembler作者是Kingcom,目前发展到0.9版本
5 e2 X* I4 D) W9 ?7 g
1 ]+ X) v5 s8 o! ~Kingcom's website:http://aerie.wingdreams.net
- H. u# i$ w+ x$ [& ]2 J
% o% @: s0 ~; b% R! Y( Q8 ?ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得& W6 x0 W! m1 G& Y$ V
2 Y% B+ c7 ^. \
更新版本可去http://buildbot.orphis.net/armips获得
. H' S, G$ n) N& s( S
2 h5 g3 v3 k- M, o. x. _5 o7 j: NARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。+ L4 q7 \: }! G5 f% }9 ~7 }' y# y' ^
# }/ t5 D" w* A6 w
ARMIPS命令行用法:2 d* J( R, c; b E! v( w
' i* R1 T; {8 y" L: k
Usage: armips [optional parameters] <FILE>. E5 `0 b I5 ~* Q& ]6 G
& z8 u: [! ?2 n: i( G
Optional parameters:0 H) d" Z6 |) R7 E) U. _+ T
-temp <TEMP> Output temporary assembly data to <TEMP> file
4 ^% J8 U( q' O. _3 s: @" ? -sym <SYM> Output symbol data in the sym format to <SYM> file7 l' t0 H$ V5 R% P- M
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file$ p& J' J* e( C' ]; \, C8 G
-root <ROOT> Use <ROOT> as working directory during execution5 C! l1 e [* i; \7 @3 B& ]. R
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
) s8 V4 _5 m4 }& o8 p -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
) l0 p: |; j+ B -erroronwarning Treat all warnings like errors& b( ? s; S" P0 C, |4 Z
+ t3 b5 n+ \! [File arguments:
* M \% b: P! k) W/ v3 y1 P0 A <FILE> Main assembly code file
3 Z- m3 l% f: L3 A! G: T! t L. w
& Y& Y* R0 l) p X1 l7 e1 `-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
9 \8 t! F: k1 E) I1 ]5 ?-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
: v. s5 f' K8 f, F, L1 r, P* p-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp. E8 i' I9 A' K" k* t. x
-root <ROOT>参数是指定执行期间要使用的工作目录$ Q9 _+ m- G# n0 I$ I4 ]" o
-equ <NAME> <VAL>参数用法不明7 j" p3 i3 l. @! M k* m$ c
-strequ <NAME> <VAL>参数用法不明
9 v- e% o+ c V* b( X7 W" v& o-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
, ], ?4 v1 p4 C3 e
# o+ H- b0 w4 Y6 R) G$ z* R<FILE>是汇编代码文件,可用记事本之类编辑
2 ~1 G1 j8 ?! ]. c3 {5 b$ B" A2 X) @% y1 R# F
注释说明:
9 v( T& v$ ^3 q6 Z5 h1 I注释可在单行指令后面“;”和“//”添加$ {6 V& \+ f1 i" ~1 z9 P
“/* */”式也接受
7 y% \$ C" ? R- _" N7 P. `( M' Q6 h8 V' d
例子:
" c F# P: _# E0 o. z! i1 c: R.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
5 k# C; W8 [5 T
2 [' l$ ~& N" s$ m.close;/*关闭文件*/
) t6 r# x, A7 j
8 \, P9 E3 @) }+ [; Y标签说明:
& p' b2 g: d* U0 ]标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
- {0 \- d+ h% j Q
) t7 P2 |$ |' T: x数值说明:
k$ L! u2 l9 U“0xA”和“0Ah”是16进制数值
" e" Q# T, t: L3 S/ w# w1 p' Y“0o12”和“12o”是8进制数值
, u0 D; h) m& a2 P' R" Q“1010b”和“0b1010”是2进制数值$ k' W3 W/ e$ N3 c
' A# I# g9 Z6 K# bequ说明:3 L7 W4 ~; Y' c, ^
格式:text equ value# \6 G# o N6 V9 M3 J y
说明:用一个text代替value
7 _. s' k3 d4 ^& G. I/ M+ j8 `例子:; g: P1 L; [2 y: v3 K6 R8 H% Q% s
address1 equ 0x12345678
( W, k9 d# }+ Pldr r0,=address1- Y7 y# `0 C C% p' H
.pool% C2 L$ B) t, h
i9 R, L# D2 ]7 z0 O T. F函数说明:
5 y5 |, D) ~" U! j. t5 C3 l5 y
$ G$ E; w9 g7 X1 V.open函数:" ~3 E2 Y* D. b
格式:
# ^: b+ Q0 R% M.open "ROM FileName",offset! c2 G3 t* z! l1 X
.open "Old FileName","New FileName",offset( V4 I1 E, ?- G
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
; ^5 {. T v. `4 o G
, \. O! b3 L, f D& I" R例子:: _. Y( k' K3 a1 n' K( g- c
.open "1234.gba",0x08000000
: U- k4 C) K9 I& C& T1 w& m6 S; G+ e4 f- l. j$ }
.close函数和.closefile函数:
: f8 K f9 `1 P* q% j格式:
, A. S% j6 Y9 D) P1 E8 n.close
9 H; B3 ]; R7 U9 T. g.closefile
1 E% S9 @# @$ M) \9 C2 B说明:关闭文件。
' W2 D6 m: I7 q" L: W5 L7 ^2 h$ O5 E3 F C0 T: Z
.org函数和.orga函数:8 b# o3 M! e7 W: q, E% w/ k: f
格式:
7 P5 X: ]; O, Q$ d5 S8 H. |* ]! L.org RamAddress
* m! p. r8 {# z0 T$ {1 N/ V) Y.orga FileAddress
, J+ B7 u/ |: z" H C6 {+ p说明:2 j. p* a# S* q' _
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
4 j* [, Z5 z/ U9 z
# N1 \0 I/ h8 N4 E: s- j.orga函数可指定ROM文件的输出地址。
* o8 K% w2 X- P# n K% s. x
4 ]. i% P! |$ l% D1 ?9 D& J.create函数和.createfile函数
7 \# ~! }3 z% {1 _# d# T格式:
- E: h1 S# H6 V" C.create "FileName",offset+ {9 x5 Y5 n7 q- p
.createfile "FileName",offset
# u3 r' D; {; I {3 I( s说明:创建一个文件,如果文件是存在,他会覆盖掉。
- T! q/ F U2 n$ z' z+ T) M0 h
/ n' E0 b$ ~: ^* x; b! Y1 t.area函数
, F9 i, w' u6 i; z% Z) a3 z格式:$ r/ e: l. Y/ @5 k
.area SizeEquation[,fill]$ y/ U$ B9 V9 C; Z) E
.endarea
: Z0 X. e y9 ^3 E! O说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败7 c5 n! @7 w' T \2 G! a8 B- [
( _2 q" I7 Y7 A+ i, s8 t8 E2 ?
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据3 A7 j1 K$ {; E. d- y6 i3 f: ~
org 0x100
: _7 }/ m n9 i: I+ m.area 0x8& C. b! S% Q, W- Y% |4 ?
byte 0x5,0x6,0x7,0x8! S& }& c) w" U7 R* n
.endarea
: _- ]" F1 N+ q& \0 v, U" F( j3 F( u, D- V V4 E3 k* L" Z
.align函数
8 o$ `: A7 ~4 L% w% \格式:.align num
1 ^; C5 _. j9 Y9 C说明:写零字节,num为零字节数量,用16进制表示。. H4 c) p* V' p$ D. V# s
- J2 C- f, }1 Z.pool函数
* X+ A( V, H- ?9 P* N格式:.pool
% K5 U0 M# q) o/ \) \- O4 e& n) z% l2 b说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。2 L) t: v# }- @# ~1 K
例子:
3 F2 E! g; U1 ?- a/ L9 w5 Cldr r0,=0x12345678;- m8 w9 C P d2 s' I* u
....
/ u3 E% w& Z; `.pool
% U2 \) c7 ]& M/ t$ l3 J, j6 W, m2 `2 m% B
.fill函数
' r! J9 t; }# D* X" |. A) H格式:
5 s% O" b/ c! |+ X' ?& f.fill length[,value]
# [$ T" E0 n. Q( M% Qdefs length[,value]
5 A8 F$ ]5 C5 W0 C9 [7 q: w说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。7 Z R% e. }( d4 d
: O& l/ U' [* y' f6 ?5 z- C.skip函数:- v6 j9 B/ L2 I" s* C# W* M+ o- }
格式:.skip length v& \. n$ _7 v( f
说明:跳过指定长度单字节数值,length用16进制表示。
1 x+ z$ Y2 c x
! b1 v8 x6 N- n' a0 r! C写单字节:* G( t) e" l3 R: S% b, v, H
.byte value[,...]
/ V$ j! o6 p: `.db value[,...]
* u: @0 C: X. T4 I: B3 M& K4 F' p.ascii value[,...]+ N$ _. Y. R' R9 d3 H9 _
.asciiz value[,...]5 F/ w& M6 T+ X9 B% F) k% F' _: ]
dcb value[,...]' [1 j2 Y( \7 B
* B, N3 |7 u: n: q8 _" q
写双字节:
6 s; b/ X2 q1 p$ e& {8 v* a$ }.halfword value[,...]
, o( T+ ?9 p: S* k w7 j.dh value[,...]4 o' d& x$ h7 h% Q: q k3 |
dcw value[,...]( r3 l# N( z2 K* i( L
3 E. B" {0 N! v t: ?写四字节:
' k. A+ [; V9 q1 o0 E5 S- X.word value[,...]
+ s. P) J0 J- w l: `.dw value[,...]
0 \0 n- h6 A: E& g1 E% }1 gdcd value[,...]
$ R0 w( w2 }! A0 p
, L( ^7 ?; |$ d8 v( }写doublewords:
! T$ z# C' p7 ]/ B) Z( X' J% n.doubleword value[,...]! i9 d& ?* S4 D0 d% `
.dd value[,...]2 i' \ v* D" t% g, J$ Q- ]8 e
dcq value[,...]" }% M* k+ V: S" P
4 c$ y6 M# g$ F( d5 v8 |写浮点数:% _9 j, L- _. r# J( Q; Z
.float value[,...]
( c# e+ U8 A }1 q- [' J4 C1 i4 ?! s.double value[,...] l' Z- y% g8 x" a
8 {% }! f) n; @5 D6 x
ARM的ARM模式和THUMB模式定义:
1 C v1 y* Z# B4 c8 C/ Q: D.arm|ARM模式1 }) q! Q0 I* n1 V, V
.thumb|thumb模式- I6 ]8 Z: P; c
' M' n1 z6 M5 j设置架构:( Q& B! G$ g7 H, \5 e8 W
.psx|PlayStation 1(MIPS R3000)
: g$ A# o+ ^' d W$ {1 Q' y3 }.ps2|PlayStation 2(EmotionEngine)
, r2 O+ P t! d: ^7 W' z* [9 O.psp|PlayStation Portable(Allegrex)# ?' _9 e/ R' t
.n64|Nintendo 64(MIPS R4000)
& B0 [- g r/ s! w2 H+ F- J.rsp|Nintendo 64(RSP)
2 j" R) i9 P& N3 e.gba|GameBoy Advance(ARM7,默认是thumb模式)
2 X( r6 W2 Q5 y.nds|Nintendo DS(ARM9,默认是ARM模式)7 Y4 @+ T+ }3 [& J- [0 {2 _! i
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
1 _' m3 b3 m% x* P, V' K1 W2 J.arm.big|
2 ^) G* S0 `2 e ~.arm.little|
& ~% x& {; O4 ]4 v# Y
w' c! t+ Y" _* |常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。/ ^7 j! c: Y, Z& p
|
|