签到天数: 2143 天 [LV.Master]伴坛终老
|
+ t) V6 B n% h, i
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
3 n3 ]4 y$ x* ^3 L
1 U9 V8 w" _9 A- F) x% B6 NARMIPS assembler作者是Kingcom,目前发展到0.9版本1 l& ^0 T9 S3 k7 T9 a5 t- Z
7 ?4 s+ b+ m6 G `: }! f9 s1 M, X
Kingcom's website:http://aerie.wingdreams.net& q( p) L3 p! C9 u5 B$ Z- u$ Z
, f0 V1 E N$ n; d, E) CARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
% N( d9 R4 f- s1 `3 n3 S- K* o( u
- w1 W2 x/ r( c/ ^9 l# U更新版本可去http://buildbot.orphis.net/armips获得) I3 ~1 D7 Q9 o+ S% L" |1 r4 G
( O* E4 y0 H3 q" K- TARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。) E# Z: I. p3 Y- L* R7 E& t
+ @" u; k% }' J$ O- J9 TARMIPS命令行用法:
6 i4 |+ ]; B3 h: E" J, `2 e* H9 t/ V O( T) s
Usage: armips [optional parameters] <FILE>2 R4 H3 d$ y* |7 H/ }! ~0 p' {
1 l, ?9 q% L$ o- R- qOptional parameters:+ h) L2 v2 a) `, n
-temp <TEMP> Output temporary assembly data to <TEMP> file* U, q8 [: o+ f: }% [# g$ }
-sym <SYM> Output symbol data in the sym format to <SYM> file8 x S4 J: _4 U" ?7 k- C
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file, S& o% Y6 j7 j6 p
-root <ROOT> Use <ROOT> as working directory during execution j& A; ]( r, [3 q9 Q
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
0 h& T8 u( [' m* U' z$ ?& n5 y -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
1 ~* T8 z2 J/ A0 a( Y$ d& q( q -erroronwarning Treat all warnings like errors. Q1 D" \( P. }2 d1 a
) ?( l+ k% a& G; A3 @- C; B/ A
File arguments:, Q5 K* c+ ^' F4 a
<FILE> Main assembly code file
& L ?( |; o% z1 C' t$ R# O, l6 ?! R
8 S* X& b5 w* M3 @ X/ y" X-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件' Z3 m! {; i6 P
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
; h) `/ _' J2 d8 y2 }5 S-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp5 _% ^) k1 W7 M+ O4 @
-root <ROOT>参数是指定执行期间要使用的工作目录+ X) e, ^! ?& D4 u B0 D' H
-equ <NAME> <VAL>参数用法不明
1 |: Y7 S$ {' P8 N-strequ <NAME> <VAL>参数用法不明 z. x+ J, k4 j
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
# {. h4 u! Q' o* k* D' T
" s! \0 S6 d- r9 x<FILE>是汇编代码文件,可用记事本之类编辑
1 g- h, O3 [ c! P) J0 y; O0 f+ b, G3 {$ d' Q4 }2 r v. k0 c
注释说明:1 {+ A% X% J" C# R) |
注释可在单行指令后面“;”和“//”添加
7 r- [7 m( ^2 \* T“/* */”式也接受$ w& l! @! A( K
. j7 g& g6 u' z! W+ z. n6 ~
例子:
! v( M6 @, k' [" m" Q.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000002 E! U7 r( _3 f
$ B1 Y( h! o* m; n.close;/*关闭文件*/
4 x1 y8 Q( S& f3 J: o9 l
' X% I# [# r: d4 u标签说明:
, g$ \4 g* s% A9 O, y标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。. V; Y3 z% _9 Y$ Y5 |9 t
9 q! }9 {' a% Z3 R) c) B) [
数值说明:
$ P4 _- D c- y) E1 x“0xA”和“0Ah”是16进制数值
$ r% t8 M6 g6 w% K" b" {“0o12”和“12o”是8进制数值
1 W2 h2 Z0 z/ y4 d. l5 @. t“1010b”和“0b1010”是2进制数值
* o* j2 ^+ z7 h# C8 C9 p. B7 n3 \1 ?: d( P. T
equ说明:' t( ]0 e3 G$ b
格式:text equ value
7 O6 Q5 N5 s* }% S6 I* ^说明:用一个text代替value. T2 U# G9 b( t& ~: N$ `* k; j
例子:
/ n$ [3 A( D+ T/ `4 E- n& _) h) naddress1 equ 0x123456786 W) v, {: _: b4 O
ldr r0,=address1
4 u4 d7 R- O+ K6 V.pool& b/ l( ]& \ V5 }
- F$ R2 o9 C ^9 A函数说明:& a& E; s( M w! p% r8 u
1 F' K, f, H, o" L
.open函数:
; u* C; t5 x' O3 v/ u& y; }格式:
5 {5 V8 B& `/ b7 ~! H) d.open "ROM FileName",offset
$ m6 b7 S5 B2 o3 Y. m1 w; u.open "Old FileName","New FileName",offset$ x) K: t8 U( t6 X0 O1 Q- E
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。. K; S9 R( A- X8 I
L9 V- h2 E: ^ B; _$ B2 U, W
例子:
7 t" e# H! Y: |! G# Y* K.open "1234.gba",0x080000008 G$ t9 b; S: \! P8 G/ G2 F
3 d+ O8 J2 F+ x" S.close函数和.closefile函数:
6 e7 v8 Q( b7 R/ X( ?6 v7 W格式:
% i# {6 J. N' n2 ~& M5 X& f, x; y.close, h/ Z1 C9 o. g5 W4 |
.closefile
3 G0 i" f7 F) n6 I4 ^说明:关闭文件。
: O( d: E9 E' _ C' y0 }
; N7 r/ _; R, H* a7 Y* P! N. g.org函数和.orga函数:, e( v' }. u& }# |
格式:
8 B7 W- J- p) \3 L( I( n) `3 t.org RamAddress+ y* w8 k4 T* r% s+ ~& ? E* q/ {
.orga FileAddress
! R/ h6 T/ |3 M5 j3 }* s& e4 _: ]说明:' f) }" k: y1 E' |& p) y
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。' i! m7 T9 `8 v8 j& H7 D5 p
9 ]3 V- X. B' X( D2 J; M* [8 b! t
.orga函数可指定ROM文件的输出地址。
( ]: \8 Q6 h+ }" f& Y
' B' P* o! g4 m# C7 q! E% x8 E+ k# e.create函数和.createfile函数
/ o E% I' E4 Y1 q. v |( p( @格式:9 k# v: D5 o0 G& g8 A [5 J: |
.create "FileName",offset; [+ Z4 q, L H4 x- I
.createfile "FileName",offset
! L2 y. A3 Y" }3 u$ s/ \% O说明:创建一个文件,如果文件是存在,他会覆盖掉。: ]0 |1 i5 N# H2 ^1 m; \: m# C8 c5 P$ Q+ P
7 C/ a" g3 Y; `% E/ ~.area函数
, F8 T5 b( w H V& a8 F% U格式:2 ]) p) \5 f' i/ d8 O3 f
.area SizeEquation[,fill]
* |1 s$ d% H( X8 U6 j- E.endarea) w: o( b9 [' K6 W. k. w6 X, |0 k
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败 O- Z( T, _/ D" y$ t
5 _' O( n( \/ P' L4 J; l5 W5 g2 n
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
4 }, |; \" `' }# u* ^org 0x100* l: Z$ h9 |" b! ^! x' [. S
.area 0x8
% n, V$ V. C4 l6 ^/ Z( D6 jbyte 0x5,0x6,0x7,0x8' v; N: E* h, N& m
.endarea
, m: s# B0 ^9 y3 w' b: g' i" ?( E9 D" G4 C/ q
.align函数
$ s; s; q% V( \7 r7 ]) A; W: k格式:.align num7 j0 C+ ]3 w) e4 J' _
说明:写零字节,num为零字节数量,用16进制表示。4 o" V4 s$ k6 `- N+ C
1 D, Z R2 d5 N# v.pool函数
3 V" d4 D+ K. A' K2 A' b8 q( t格式:.pool5 P$ M- w7 Y9 Y" l: o, P6 Q" G
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。+ T% j3 o6 y: Q8 C* ?1 I
例子:
! @+ ]: {( P! i6 k+ S4 H! Qldr r0,=0x12345678;
7 {1 `" D. [; c% M% c8 V: b..../ i# c7 W; V& B5 X' ?
.pool/ e( M- I- J$ p
) D! o- W2 ^2 b9 h1 e0 t, f.fill函数# N5 t3 q q$ |1 k8 N/ g0 h* n
格式:" T4 x: C9 t) q; i/ `
.fill length[,value]
" B7 K( P3 |. m; y/ x4 Kdefs length[,value]
) a' N7 p+ x$ ?6 q5 `1 g" y7 T说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
! `: Y1 n6 G+ s
5 F5 B7 ^: s5 I5 F' e3 l; y.skip函数:/ n+ R* W X1 s g9 }
格式:.skip length& ~3 a' ^; R1 m! i
说明:跳过指定长度单字节数值,length用16进制表示。7 U9 }& K/ N( x. O
% J4 `8 _) Q, ~) B
写单字节:
3 F7 G; @4 K) n' q$ N* k) ?6 [.byte value[,...]) t% k! r2 {# `: _: J
.db value[,...]
7 u$ r* v* j- S, y1 U0 ~.ascii value[,...]
4 f, l) T% @% V$ ]: N4 w.asciiz value[,...]
/ |! E2 W6 G& bdcb value[,...]
, y2 Y" Y: X' E& K8 O; z9 @) {: b3 N
写双字节:* x3 y! L* b. T9 l# L7 Z/ ?# [7 K
.halfword value[,...]
1 P6 W8 |# c9 r3 D: Z5 s6 E4 k.dh value[,...]1 W9 \" m! ]9 u( L2 l
dcw value[,...]
) j( u9 T* A3 \/ E+ d: S1 z8 U9 E, G! q. e N$ V! P
写四字节:
, x* w0 j5 X2 `.word value[,...]; k/ F4 r9 ^# t% M5 m& t/ ^
.dw value[,...]: G6 N7 a/ m4 Z% j" r/ i0 y+ q) e
dcd value[,...]! C q$ ~7 a( B% I
3 @' ` V2 A. N" P写doublewords:" S4 P9 R8 o K) Y
.doubleword value[,...]
- a9 G4 h4 |2 R7 N- x+ J1 u.dd value[,...]1 A& [) y' {) X4 m& r9 ]
dcq value[,...]0 ~$ g6 C; z. U! Q! ~: f
* K5 @0 _4 B1 i" Q+ `写浮点数:6 M2 o. W& E5 F9 a3 W
.float value[,...]
6 h2 w. D K: H8 f H.double value[,...] v/ K2 _6 B3 r0 j
. a* G+ ]. p1 m" i4 x1 k* x: e1 j# nARM的ARM模式和THUMB模式定义:
2 K- t! Z; R; N# u: e.arm|ARM模式
, v4 L8 N& J! x) |+ Z& o# X/ q.thumb|thumb模式
$ ?& t& C/ ? n0 V* M* ]) T2 g- u) G# G3 D' A9 D
设置架构:
# s$ j3 v% p7 ?.psx|PlayStation 1(MIPS R3000)
9 S6 n; h( O5 E* O( @. h3 m; H) u+ Q.ps2|PlayStation 2(EmotionEngine)
$ |% r0 _0 ~0 ~, q7 K) U' s.psp|PlayStation Portable(Allegrex), \' Q1 _, V3 d# I, A
.n64|Nintendo 64(MIPS R4000)3 M' Y6 ~" |3 v/ ~4 l+ @5 ?2 g( P9 ?
.rsp|Nintendo 64(RSP)/ V! r: Q* W9 d' B* i# _, |
.gba|GameBoy Advance(ARM7,默认是thumb模式)9 r& @1 ?7 C) |) T, b
.nds|Nintendo DS(ARM9,默认是ARM模式)
. I" |2 r9 T! J+ j' J+ ^4 \1 b.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
' y% o; j; c1 J$ e2 h.arm.big|! w" V) D& w4 j% A$ i
.arm.little|
0 |" C/ [- H( f% J5 H3 w5 f& N. v
: n" U: X2 V0 [0 a常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。* b; O; c3 `2 j# ^3 u; Y" u
|
|