签到天数: 2053 天 [LV.Master]伴坛终老
|
, C- F$ @& G/ ~6 ]
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
a* n! E+ f& k4 z9 N1 @- f6 `2 v4 q+ l" I0 U- i
ARMIPS assembler作者是Kingcom,目前发展到0.9版本! Z+ _$ c# o" n) v& j3 p- A) c
6 |+ A+ D" T4 z5 D
Kingcom's website:http://aerie.wingdreams.net
. C" j- m1 q1 I% f
l5 } {2 S/ V, m/ H" [5 g% e) c% t$ ?5 IARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
4 _" q# l! {7 a% |& L/ ^
% d ]9 _' d- F- l1 M更新版本可去http://buildbot.orphis.net/armips获得
6 `, P( K$ _& _5 J2 E8 Z$ r
2 l' X6 |3 h$ P5 G# C+ fARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。! ~. F& M1 i& U; C
( w4 D! h1 d( B9 Y0 i0 `ARMIPS命令行用法:
# }2 E+ Y, e* x9 J' F% ]3 s# t
Usage: armips [optional parameters] <FILE>8 M8 S: Z2 z$ L
# K8 b* w0 K( nOptional parameters:! R. |$ W7 I9 U$ r8 r! U4 b
-temp <TEMP> Output temporary assembly data to <TEMP> file- f& w5 Y- [+ K6 m3 d* P
-sym <SYM> Output symbol data in the sym format to <SYM> file2 o3 m3 g% l2 f! [8 ]
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file' e V. B) E2 w* }: s
-root <ROOT> Use <ROOT> as working directory during execution
% n: ?7 c# L" @7 E: X4 p& N; k% X -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
) ?4 ?! ~" G/ x! U' @( z -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
4 Z4 [* P/ u8 }. R. n -erroronwarning Treat all warnings like errors( s- Z# ^3 i3 A0 c) I0 i. `8 l
2 J! ~$ X, j' H" _* O/ q" i2 J
File arguments:
; O6 s1 m; N4 G" o; v- j- u) l; ] <FILE> Main assembly code file
5 P- D9 y4 t/ K9 U
4 N' O; P$ g, h4 S' F1 R! k9 a. Z-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
% l% B1 x- v, C0 V- \-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
& ~( |4 R- [" |3 ^, G' G) h-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp8 M. d, d: s& h* x, z! s5 C
-root <ROOT>参数是指定执行期间要使用的工作目录
5 B: p* @4 K. O-equ <NAME> <VAL>参数用法不明2 w5 h8 d l$ q: V4 g/ }# e
-strequ <NAME> <VAL>参数用法不明
' C& D5 }- `# _. w-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
9 x1 R8 X3 x7 t( x, X5 @: Z' `1 H
6 Q8 s7 h# j' m- G) l$ \- p<FILE>是汇编代码文件,可用记事本之类编辑5 C; P5 E8 x& t1 ]
, J" P0 h( w8 g/ w y( S注释说明:7 ]: k1 f1 e O) C4 n& `& O, @. B
注释可在单行指令后面“;”和“//”添加" \7 C; @* ]; j, s# F7 y
“/* */”式也接受
+ @5 ^% t* `: i. E& r/ W6 Z2 k f$ g* R0 V. |' O$ _
例子:+ H% F# g; d/ g- V' I' Y( G
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
5 X/ F; R4 u1 W
# W5 g. x0 o/ ?0 g.close;/*关闭文件*/
1 D7 B4 H M# ^+ {/ ]) }* u% V( B6 c, n0 J' v; R0 y+ I
标签说明:
[! j! q, \( F0 ~. M4 B0 u3 A ~1 l n标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
5 e& k2 H( m2 j4 J5 V
' j- h$ g) k4 k, q y/ d4 E数值说明:3 w0 C7 y, R l2 `4 j5 E% u
“0xA”和“0Ah”是16进制数值
- q/ U6 C5 a# ]" Z4 k' V“0o12”和“12o”是8进制数值
; g/ a, F* W& q- U B“1010b”和“0b1010”是2进制数值
# T3 Y+ i' L1 L
4 {" Z( b* D- X! Lequ说明:: ]$ y J9 c) n
格式:text equ value
+ h5 s+ ]. j2 r# Y6 Q4 I: U" ~说明:用一个text代替value
* W9 y, a, _# H+ A9 R例子:
# y3 s/ R5 ]7 Y+ ]" paddress1 equ 0x12345678
; ^& z% N9 G" Sldr r0,=address1
: r5 `+ y- U; k# v$ E.pool
+ ?* C" }* h1 M2 }7 R& D8 [+ z
* _2 k; Y. ^0 a1 S: B函数说明:& ?5 @, G* R( r+ j8 r6 Z2 i
! U4 {% ~! {- _) {' X
.open函数: r5 D2 H; S- T) o" E
格式:( r8 H2 H2 c5 k5 J/ V
.open "ROM FileName",offset9 \9 H# F/ p! |5 D
.open "Old FileName","New FileName",offset
0 L# P6 V# J; Y4 y; k' F6 k& f9 v说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
) E. D& d& O" c. i' O5 q }) f+ g* T2 Y; D& d F2 [- d
例子:
2 [2 ?+ y5 S1 T# l: j.open "1234.gba",0x08000000) C3 U) V( o4 I8 x8 d
* b3 S# \7 o1 `6 d$ o5 o @
.close函数和.closefile函数:
1 B$ R1 M# O x }# K& y格式:
% B3 V5 z" K3 J; q! l.close
: m- J" W3 v' ~3 k& h.closefile* w( Q( ]6 `" l1 P
说明:关闭文件。: ^1 V0 p7 m2 O, ^/ s, f, t. h
6 w# {" G* p- `' Q
.org函数和.orga函数:$ j. f/ J; O) K
格式:
, a p- q7 Y8 t' V.org RamAddress3 ~7 B! I% \4 Y% C* q2 h2 U0 D
.orga FileAddress) r# q+ j( L' P; q5 S; a
说明:1 M' r7 {" C v) z: c
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
0 B) G& O& q D1 C# S( A/ k
* I% G% M* l1 M# }. o.orga函数可指定ROM文件的输出地址。
2 K" v0 k; ^) c3 ?, z0 U$ O8 i
5 A7 j! N$ @4 e( M.create函数和.createfile函数% E9 |8 g5 ?4 V6 T
格式:
: n) T$ z' n9 o; n.create "FileName",offset
' r% x4 B/ A0 H4 V.createfile "FileName",offset
$ t) \3 N& Q& l! i& D c2 k说明:创建一个文件,如果文件是存在,他会覆盖掉。
/ N. W" v+ I* S& G% P5 Y4 P9 q
( Q8 _8 O, V9 \.area函数! v1 e8 x0 ~3 E! x& F; U
格式:
2 W" t3 y! @) h& K5 k" J1 w.area SizeEquation[,fill]
/ \8 X% U7 {1 A9 @; ~.endarea
7 Q: F% d4 m3 e$ D4 c( ?; k4 N说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
& y- v8 h. _( R. L, O
& h$ b! f; A* C3 L" @$ t9 {' J例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据9 h. a8 W. n, e
org 0x100- w$ {" x1 p, H, m6 X2 J& P% R
.area 0x82 l3 F7 [0 [ _1 X# m9 @7 T
byte 0x5,0x6,0x7,0x8% p& c3 i7 h) [9 w. N: t
.endarea
- v k( @2 r2 u) u9 O0 t' O. r2 ?9 w: S
.align函数# b. G: f' [1 w& u6 D; F+ f0 T- A
格式:.align num
$ @/ P) H3 v3 q3 r说明:写零字节,num为零字节数量,用16进制表示。
( W6 X7 A( T2 J. V, R/ ~
5 H# I2 h1 P% C. J/ ~.pool函数0 o5 z5 L; @+ v+ G4 M
格式:.pool% F/ z9 N8 g5 L q
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
7 a r, y( O5 ]0 f5 Q3 b( \; Y6 M例子:
; v+ m( Q6 k1 ^7 v' Hldr r0,=0x12345678;" u* \! Z& q7 M8 _% x' Y
....
c' q9 W. p" x/ W9 ~1 w5 k0 [.pool
, o. z' n+ r/ g8 r. P0 q! d; w+ Q5 t9 D3 o8 i
.fill函数' {: P4 x( Y L9 r
格式:+ l i: _( L) _% ^0 k/ M
.fill length[,value]
P! L6 Y3 z3 g# a$ [% ?, M( N9 }defs length[,value]
* `! w2 L. k2 w F4 ]& x6 B8 ]$ l说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
% y1 P' i- ^! h: O" V% ?% h
' p9 V9 j' I/ p.skip函数:: Q) T6 B/ E8 n ^1 y8 h7 U! I* _
格式:.skip length% Y5 N! Z& {4 J* _7 |" s2 v6 ]
说明:跳过指定长度单字节数值,length用16进制表示。9 E1 P {% F& x; r$ z& G
2 T/ z# Y% a$ C: S" H; I写单字节:& |" e5 k$ v6 ]
.byte value[,...]/ }5 o& N% ^ X) c; u: T! m
.db value[,...]
" @ ` e6 B1 C. C.ascii value[,...]
& O( Y! d5 V$ h7 p.asciiz value[,...]0 c6 @- ~8 _4 {$ k# s/ L
dcb value[,...]) { T& g4 I& ?, p% |. m* l/ I/ t
% a$ W( n- W% K写双字节:
: h4 a8 ~5 ]5 r# k. {.halfword value[,...]
# {; Z* g1 m" s4 Q d$ W.dh value[,...]! ?4 ]9 K+ P( {6 w. o0 `
dcw value[,...] h/ S9 x @7 l) q
7 ` T8 l2 g3 V$ n3 k. v0 b
写四字节:& d5 c& H) E5 c4 ?: L
.word value[,...]
# Z$ w$ O, a% Z; j) j6 O+ y; T.dw value[,...]( I1 x- J8 c" s( P
dcd value[,...]3 K( S' M( I- d4 h" h
9 `( L1 D4 S' Q; f5 u5 n% d7 Y
写doublewords:: {1 M9 |9 w0 ^9 d
.doubleword value[,...]
/ ]4 l( q; \7 V. q( M1 _.dd value[,...]' _3 D$ d6 }8 e- l
dcq value[,...]
" y0 D3 I! t4 b- h3 @ R
* _; w! g6 d' p/ o( }写浮点数:: F& s! H$ U& Q) L) }* K' G
.float value[,...]: }4 Y+ @7 I5 E( r
.double value[,...]+ H8 _7 @5 v2 Q6 q& A; W
- V/ u# d3 L4 ~7 xARM的ARM模式和THUMB模式定义:
. N6 J5 W8 p( }8 R7 e1 s.arm|ARM模式
% m0 W- h0 t( }6 F6 A* J.thumb|thumb模式
5 h0 O0 Q& d4 ^+ y4 y" O
+ `; `" o% V+ ^* B9 j: M设置架构:; @$ `/ O; b& @ E7 D: E. L6 P9 Z$ ]
.psx|PlayStation 1(MIPS R3000)
3 ~" J, i* Z& c1 ]# o7 o.ps2|PlayStation 2(EmotionEngine)- `; \! r6 T x
.psp|PlayStation Portable(Allegrex)
( b4 M% \& C/ S0 @ B.n64|Nintendo 64(MIPS R4000)) i2 k5 `& s) b# |& u0 h; Y
.rsp|Nintendo 64(RSP)
, X0 ~, S% C3 Z0 Y.gba|GameBoy Advance(ARM7,默认是thumb模式)
" C7 T% X# \& Q5 j.nds|Nintendo DS(ARM9,默认是ARM模式) C/ }& v* s' X f6 d
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)9 x+ ?# j0 o7 s1 T) z
.arm.big|
5 v/ f8 P* X& N.arm.little|
- {" {( N p. P. H0 ^) Z1 Z+ a' Q* O7 p: ] _# X
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。; o2 N" {6 I# T5 D
|
|