签到天数: 2211 天 [LV.Master]伴坛终老
|
% l2 A1 b6 X* e4 m( M x
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
7 s9 x. V5 Y4 H7 g: ~$ {
- W% {) V9 h4 E# l) Q& _ K6 hARMIPS assembler作者是Kingcom,目前发展到0.9版本1 E4 v* P% j8 k- v' f5 I/ ~
9 f9 e8 o8 t9 _" K
Kingcom's website:http://aerie.wingdreams.net
1 I2 ^7 C K1 u
3 \2 K( U# X7 g, q H4 K! _ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得7 {4 Y6 U$ i( p3 |3 D s
2 b9 }9 e/ T; k2 \0 I, N更新版本可去http://buildbot.orphis.net/armips获得+ }3 G9 b8 V- `1 s! |
* M# _) x( R& z- r5 y3 x' N
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。* T9 M9 t6 G2 E: S' |$ W
& D, [; U X2 P' O" }ARMIPS命令行用法:
' w% S, X! t( ^+ K* g
* e9 f! I H. bUsage: armips [optional parameters] <FILE>
& k/ Z" m4 v, E* I4 ^( w% F. m1 C7 x3 n, Z
Optional parameters:/ c( e( g# `! r8 Z5 n$ j
-temp <TEMP> Output temporary assembly data to <TEMP> file
2 ~( R8 b- k) f( r -sym <SYM> Output symbol data in the sym format to <SYM> file
$ @, u x7 N* P, i: Y -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
- E9 Q1 Z7 \: c% q- d0 o; l -root <ROOT> Use <ROOT> as working directory during execution' Q) _" t+ d+ Y6 Y: Q
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
/ O6 F: ` e k. I, u: f( C -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code) U( Y2 |+ W) u: K4 h
-erroronwarning Treat all warnings like errors' N: j+ ~7 A# X1 a9 C" i; r
: j, ]1 F; v. c, D# h1 x1 X
File arguments:
2 C; T# Z: s9 t+ T" d3 b) L3 w <FILE> Main assembly code file
8 {6 w" E) G: ?! q' B
9 `0 S) ?! Y3 X. W; V, D- {4 l-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
! j, n, ?! o1 J7 y/ I! W% r-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba- s, }8 u( Q8 B
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp1 t# t1 W5 I3 N* J
-root <ROOT>参数是指定执行期间要使用的工作目录
+ b4 v1 H) G2 G" a2 G! R- C-equ <NAME> <VAL>参数用法不明
" x& k X! d. ] {) z" u' J-strequ <NAME> <VAL>参数用法不明% M& u* D6 P8 X% B0 k
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
* q% P6 p- {9 t3 |1 X5 v* d
5 k: T+ \1 b4 V; D9 Q) Z<FILE>是汇编代码文件,可用记事本之类编辑
: Q! y5 o$ |# }. Z2 ]' g* ~9 t* y* h | B- n7 l# Q1 V. Y5 ^
注释说明:
' V) s# X2 E0 L+ J1 b J+ a注释可在单行指令后面“;”和“//”添加4 W' x7 W9 S8 d- P
“/* */”式也接受
" p Q, ~7 b9 ]+ T; }" R, g
; Y8 t% T3 B z& M. Q6 Z例子:5 ]' P9 D6 @/ H& K. m2 S
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
|0 w& N7 \- ]* @/ i l$ f2 @6 o+ X: k: k# \
.close;/*关闭文件*/
1 u8 | ~0 E# i$ A! q1 }. `8 `0 W$ e- u& R: a, H5 a
标签说明:
4 z: ^8 [) p% C6 i) n标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。0 }1 A5 y# a3 F' E8 i( O8 n* _
" q4 c1 s1 B) N; R+ u) o数值说明:4 |8 Z' ?" ^% g: ^* \, p" y T" U) A- ]
“0xA”和“0Ah”是16进制数值$ n6 w' \ ^+ X, ~
“0o12”和“12o”是8进制数值
/ t2 i; {3 R/ G9 W" |“1010b”和“0b1010”是2进制数值. v5 Y0 x4 N" I1 u+ p
$ e5 u* [; A* B( _8 M9 J
equ说明:; |. e! l+ [5 K$ o$ y! }
格式:text equ value
, p1 S' j% k. \% A7 _说明:用一个text代替value
! ^6 P% E M% v$ ^* A例子:
) H6 ?* J3 u# }& v3 Faddress1 equ 0x12345678" s9 e/ x. J* \( b' |; X! c1 ?* r
ldr r0,=address19 N1 k% o, L0 F
.pool! q" P' T2 J$ @3 |+ x" Q
$ i" o1 d; @) {+ a" u
函数说明: x0 b/ D) s5 e2 e0 I; T
/ S4 x9 F& l# t( @ g' R1 x
.open函数:
}" \5 A5 N) r& ^格式:' s$ z' k/ T8 S5 H
.open "ROM FileName",offset0 @5 q1 M' _7 O7 u0 z$ k. w! U
.open "Old FileName","New FileName",offset- c7 O$ t. q& O1 c, w" [! k
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。4 _) @5 G6 |& s! Y+ Y
1 v$ T3 ~. R& {例子:
- w: s% _4 w% }2 r. \% w3 R/ |; i.open "1234.gba",0x08000000
4 `2 B- [8 _. x# }% K# k8 m C
* Z7 ]: G' b0 P. v5 {.close函数和.closefile函数:
$ O I+ S' o5 g) D格式:
/ c+ J" n' C9 Z, s1 w; i% W# m.close1 M& n2 K% x3 t
.closefile
9 ?# k% B; ]% V1 h+ p说明:关闭文件。
, z5 w2 S0 c8 [# [5 M
# k( K8 t2 m2 z.org函数和.orga函数:. M& O1 R7 Z. M
格式:
. i8 G3 K5 K' L4 Z.org RamAddress' G4 y+ S" k( p3 H" `
.orga FileAddress
- ~/ [7 C# R9 H5 q' l说明:5 }- _1 o- P p$ P7 K! B; s, I
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。6 O1 v- p1 W0 j& c
3 ]6 T4 h' ~. x$ @7 u& y6 j
.orga函数可指定ROM文件的输出地址。
1 P, ^9 {7 T% m* O4 C' _
7 x" D0 s6 @ C' R. O8 x.create函数和.createfile函数7 v+ v5 Y0 W6 d) C! ^6 Z
格式:
0 j3 R* ^7 k$ d* s.create "FileName",offset0 a- U F4 `5 l, { R! j' h+ d
.createfile "FileName",offset
: P6 O6 g7 D5 I5 v说明:创建一个文件,如果文件是存在,他会覆盖掉。* H! p/ y8 o$ p6 F" ~
7 N, A; O+ r! B; q/ S
.area函数
) @8 ~4 ?4 k3 w) E" I. P" U) R( W# m格式:
4 _' w' `, Z! y! t/ v& \' g- y.area SizeEquation[,fill]6 K* n$ k! K; V- j9 n/ y* x; s
.endarea1 L* H5 H M- U1 y
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败' O( e# ?; [, y/ f
6 u+ g4 |( J) T5 f2 q+ M/ ~例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
# P. W; z8 Q* K2 ?& Y/ m1 ]% norg 0x100
; O( n- u1 ?7 ^" `6 z7 Y.area 0x8
. p S& Z. L4 \3 Ybyte 0x5,0x6,0x7,0x8& o8 l$ ` Q: r- w
.endarea
- i7 w9 W) R9 W& i3 P/ g& a6 C. l/ \+ P
.align函数4 t! b: u% K* m- f2 u! j& \# A
格式:.align num
, j; e. z7 i1 g: \4 u说明:写零字节,num为零字节数量,用16进制表示。
2 Z' X. T; f2 p1 i% h; q" }
# N, i, ~! L& n/ \" K/ E# \.pool函数
2 X( T0 E) T7 B3 D% i: t格式:.pool
! P. M" y# I3 |$ P2 X" Z说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
9 u7 {9 c( `8 h# r" D1 p- J例子:
$ V) t* ~0 r: Wldr r0,=0x12345678;+ I' L/ H8 N& k
....
. s6 P. J, S& [ Y l O, S.pool
. M7 e+ o" v6 {" ~8 r# k) N& j: k$ a0 ~
.fill函数9 r' Q: C4 H5 I
格式:" Y6 x2 E# L4 D0 x2 c) J
.fill length[,value]
: }$ b- a$ c/ y7 Y, M% B( h0 |defs length[,value]# o5 X+ G0 E! {5 {2 r
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。% f1 ^5 S S$ E9 x q
, E4 ]5 d- Z% Z8 Q6 i. e! I
.skip函数:
0 x9 @' ~2 @7 N- Z1 F- c- f# y格式:.skip length3 W8 X2 l) y' `6 V6 W
说明:跳过指定长度单字节数值,length用16进制表示。
' l, S; f( a* y" l* y
/ C2 j2 m% ^* Y3 z; h" e# l写单字节:: y* h* F, |8 w3 I$ Q; ]- ]$ ?% k
.byte value[,...]1 n( [8 ]# U- {
.db value[,...]) @0 y" Z! a" @+ V( Q
.ascii value[,...]
/ ~' a# C q5 k" T. D4 L.asciiz value[,...]1 p9 T9 E1 d1 m5 N+ b9 f
dcb value[,...]
# y; h# r4 v6 a/ G- P
# X4 p) ] X+ C; m3 ~( [写双字节:
2 ~; J, T2 Y0 @.halfword value[,...]" f5 J9 e! i9 x4 U. G& e9 o. M0 j
.dh value[,...]
/ s# g6 v2 s& H# ` O( B2 _dcw value[,...]
0 \! w5 v9 G1 t6 X1 B- R3 T+ B) E6 k' w/ B& W* l
写四字节:
: k3 f2 F/ j( [3 u.word value[,...]
% p% O; _( g" z8 i% t) G* T.dw value[,...]
: V( a: i0 P# F$ ~: A$ Adcd value[,...]) S3 p5 v# F4 q: h8 A, w! e
- w* i/ E# W f! Y0 j0 ^写doublewords:
8 d+ U) i1 m: x F; v.doubleword value[,...]# ~- {( o' r% W- \9 ~# X) J
.dd value[,...]0 v& w; F( l4 {& m. I
dcq value[,...]+ X$ `9 O4 p- O
& ~2 ]. r3 }8 n% V; b* m% D写浮点数:
3 r' e, k/ `& G8 o) Z4 i- P.float value[,...]
( `) h% J( g+ A+ ?& t! ~.double value[,...]
& B& O/ A0 K. H5 k% y" d0 L. O5 N- v+ ]( Q8 d, ] V
ARM的ARM模式和THUMB模式定义:* }+ U4 C1 U7 J, \& i% e- I
.arm|ARM模式; Z1 P: |- x Q' D: n
.thumb|thumb模式: G- _# K; _& U( e+ y
6 }# y* s, Y: K. a, z
设置架构:) Z! i1 K% y- }9 B0 m
.psx|PlayStation 1(MIPS R3000)
$ z- J. x w/ b2 {5 @/ O! i.ps2|PlayStation 2(EmotionEngine)% e, o `% F- k2 h% C
.psp|PlayStation Portable(Allegrex)
& [6 c) m' S$ E6 U- s' E c7 x9 u4 K.n64|Nintendo 64(MIPS R4000)
: H6 x. H* [: M9 l6 L& _.rsp|Nintendo 64(RSP); B0 ?# R& M3 E9 `9 q" o7 z
.gba|GameBoy Advance(ARM7,默认是thumb模式)9 @4 z. o7 t% e* ^: _/ C! n
.nds|Nintendo DS(ARM9,默认是ARM模式)6 l# K: i9 F. y
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)3 U' |5 E2 S R; Q( x' R
.arm.big|4 D& f1 t B" D- ^7 M6 p
.arm.little|+ o* o8 Z }* P/ ^4 F" V7 I
6 t6 ]+ O/ d C: k常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。. K' c) r5 e5 d G* b5 l# e; f. ?4 h
|
|