签到天数: 1895 天 [LV.Master]伴坛终老
|
) A* {. x5 u. f. u1 L4 aARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000' r; u$ ~$ E8 b: l9 `2 F
: T0 y- x$ s6 I, ^! e* e* H- @
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
/ _- ]* x6 V' A+ d% A, x& O) \& H* Z* x& {* w( V) v, o
Kingcom's website:http://aerie.wingdreams.net5 S$ h$ N* a! [6 F
G* m% \- v( b7 d
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
# M J* H% e# [/ Z. ?* P% S! x8 T8 |( @2 S# a; P1 Y* k$ U2 f
更新版本可去http://buildbot.orphis.net/armips获得
" v& @& V7 X2 r, t; E/ G1 v7 N+ L t: q
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
4 j+ a/ W. K* {3 m1 L" S1 X* }5 y/ `1 n
ARMIPS命令行用法:
K7 i; g' f( r' v# |0 ]$ u4 f: B& \) F6 h3 H. A7 J
Usage: armips [optional parameters] <FILE>; p" n. [6 Z" A6 k: f
1 A1 D W0 V5 |9 k1 C
Optional parameters:
3 M5 p- K& p2 f& L! s. m" P -temp <TEMP> Output temporary assembly data to <TEMP> file
6 b, ^- e3 o7 _) f( q9 D1 b2 E -sym <SYM> Output symbol data in the sym format to <SYM> file
; S w' H% l+ ^) h/ v/ t0 {* m -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file# ?( x( P1 Q- X. ]3 ^- f) u
-root <ROOT> Use <ROOT> as working directory during execution/ T% l# U. c( ~4 Y0 `" _, ^/ Z
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
* u# v" \2 c1 Q -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code3 g) l& {8 t; B( W9 J2 }
-erroronwarning Treat all warnings like errors
! n i, O! P* o9 J1 ?) i
* v/ Z3 w- F2 i0 mFile arguments:. V5 m, L. I7 J* v
<FILE> Main assembly code file& @5 y. A0 s! U$ J
6 `/ S* R9 Y* B/ K3 q$ |-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件8 z% w4 W9 O Q/ r' G. |) C' o5 }
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
& O( p1 } V+ z5 f-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp% v+ O) R+ N6 l7 {+ ` N
-root <ROOT>参数是指定执行期间要使用的工作目录
5 E- [8 s/ P7 N, Q-equ <NAME> <VAL>参数用法不明
+ v4 r% e( d- U; b$ G, P6 E-strequ <NAME> <VAL>参数用法不明& z: N, W, ^: Z- \% c
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译+ H6 b* ?1 y9 E* S/ p
- Q! x/ ~% e8 k D. @; ` U/ N
<FILE>是汇编代码文件,可用记事本之类编辑
+ ]1 Y+ x: }, s8 S: p2 b
7 V: v/ t0 |0 t/ ]0 X# c注释说明:4 j- c8 n; _+ B- A6 L" V
注释可在单行指令后面“;”和“//”添加
3 P5 D; @- p+ A/ D Q“/* */”式也接受
* [) b, \) s, m* I
Y& ]" Z1 ], i9 r, J例子:; ^" w2 c4 X% X2 M V) |5 {
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000- x9 I- Y3 |$ \6 L" B& u9 G4 ~
& E, u1 A6 U9 u1 ~, W; y
.close;/*关闭文件*/9 C7 O0 X0 R; l K2 k
$ p" A2 C" U0 r4 a标签说明:
4 d% O+ z, M* n3 B' t标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。, P% T; G% Q1 w! }% u
: O7 ]* Q& r# K" N- Q: h8 d, O
数值说明:
/ S- t6 T/ k, b" d% a/ E' b5 K, x“0xA”和“0Ah”是16进制数值5 S" }; }7 S; c y; n
“0o12”和“12o”是8进制数值( r0 x* ]& P: K/ V/ L5 o9 T
“1010b”和“0b1010”是2进制数值
( W; l4 N) g/ ~9 G" ?1 }% d* n. p3 H/ J5 X% v! d: p% D
equ说明:
& E \# p+ X- ~9 o格式:text equ value* o! F" x2 V: d2 H( b
说明:用一个text代替value
% ^4 n9 s6 n2 N! K5 ~7 d3 K例子:
4 V7 M' t+ A( ~' b$ Y: @4 Waddress1 equ 0x123456785 i8 t, U! i& P6 z- X8 D& f" w
ldr r0,=address1$ t0 ?7 @1 q4 F$ p, j2 G) D# f9 p
.pool
6 v. Q8 t# J2 E: z7 p* `/ z9 w8 ]% ~( i( \& P J% T
函数说明:2 f C* [# l( | m6 o; n
3 c; v) R# M" w3 q/ |+ F. Q( A.open函数:& B' H" s+ o# U! Q8 l" m
格式:0 e0 M% ]- V, ?: A$ L
.open "ROM FileName",offset
' l/ E) }5 Y$ b.open "Old FileName","New FileName",offset5 \. Y1 p* d' j# O( D4 u( _
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
7 Q+ O1 p, u2 U4 A
) |1 n( ^3 R6 L( [9 L例子:2 Q9 @2 o8 A/ K; N% F. o9 a
.open "1234.gba",0x08000000
5 N- J3 o0 A' @8 m; p) D3 r% Q {- k/ h8 W) f1 |! g U' t* v
.close函数和.closefile函数:: q. I# c) O8 i/ }
格式:
/ B P7 _8 f; {! X* q.close# K& E, }! @. V9 I+ S
.closefile- E' W& k! J* _+ Y$ `
说明:关闭文件。+ t9 c7 e1 V' a1 o! P
9 s3 v8 p) ?$ H& P l' ~.org函数和.orga函数:% Q; O% A# W: r S
格式:& v* T4 f1 v( }- g% V
.org RamAddress
7 @# Z0 [% T: u' B3 d, ~ i.orga FileAddress
: B4 s4 }' v0 X& D& U$ C说明:# x' n, |, `4 x
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
; O1 |7 ~2 x, j: ^( n m U" a. S' J4 T! Z$ F
.orga函数可指定ROM文件的输出地址。
, x; D- O( B; v. i/ |8 ?1 N
3 ^9 i5 \6 _1 H( \.create函数和.createfile函数# |4 R' p6 l- Q1 p5 ~' t3 n
格式:) H9 ?2 S0 F- @" K
.create "FileName",offset
" t: m& Z r2 s _' c9 t9 M.createfile "FileName",offset2 ?! j$ ^+ z- P3 }& z/ u( }. Z
说明:创建一个文件,如果文件是存在,他会覆盖掉。
; ~* y R% V3 k4 ~" L
. g- ]; f- q$ w4 T7 P! {8 K' G5 Q.area函数
" X! m }" x2 Q- |0 ]格式:
5 U, R+ p/ L0 W2 t.area SizeEquation[,fill]
7 N9 b$ w# z* ~% V7 @8 L Y.endarea
7 \! N. y) A2 i: p- a说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败; B( z2 F/ q# M) D
+ Z- U7 Z( f) T5 d
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据) W; D* p b+ S/ F# M, p
org 0x100
# T1 F" [' _- ]2 m) b5 t.area 0x82 `* o* B5 X) i8 m; ^
byte 0x5,0x6,0x7,0x8" G0 W! v/ h4 u6 D
.endarea
8 w8 y* k- e" ^% b; G/ s: v+ k
.align函数6 ~+ {6 R' v( T d% |4 V) K
格式:.align num
, t7 t7 v( Q. B5 g+ z说明:写零字节,num为零字节数量,用16进制表示。
( a. G8 q* G" m: {' d h
5 x2 K8 Z& o$ e" J9 l# W.pool函数2 L! D. ^- M0 I" q/ l# W
格式:.pool1 w) P% C/ v0 V* F( _- H
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。 [* E; u3 O* H& r2 ]2 a
例子:/ I2 M- a" h2 u8 K5 c
ldr r0,=0x12345678;
9 w2 K. `' ~7 h! X( R4 x....
! F; S( ?; u4 d! P/ ?) n: W.pool
! E' e- \; J" c7 _0 u' L l4 i9 y
0 G% G7 m& X# H4 a; a.fill函数
: y' z+ Z' n8 x; n" r! o, A格式:
. o7 y2 w( M( C$ x/ u3 `.fill length[,value]6 h2 ?( y: {- A" [5 {4 s% v
defs length[,value]
" ?) w) w- }, G! A9 d! |说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。, R1 l& f" \# A8 m0 |% o
- K- Y; t& `: p3 Q
.skip函数:
- B1 r2 c6 Q1 v' f格式:.skip length
( J/ a+ B+ T/ x) }" s说明:跳过指定长度单字节数值,length用16进制表示。/ K6 r7 d4 ~$ G9 Y+ _
! }; f9 p+ ?9 M# y写单字节:. c4 d( p) J1 [2 g
.byte value[,...]& i& ]" c$ z5 q
.db value[,...]9 P/ r; Q9 \" I+ P: d
.ascii value[,...]
6 |. U8 j6 P% H! e! o# s.asciiz value[,...]
7 w5 v- l/ |0 Edcb value[,...]
! _! I7 A5 d/ _/ G
; o- A# Z( u8 x0 z+ I- ?; A1 C3 A写双字节:5 ~- Q |! f9 J, ~
.halfword value[,...]8 l# C- w2 u( N5 i
.dh value[,...]
% V x8 v! U6 w7 m2 _ W) j. A% O' Q& S" |dcw value[,...]
" z% H8 o5 d, w/ X: a0 k I
) B- h2 P3 [- \/ H! F7 V. O写四字节:" \8 c& `& N O3 A1 i7 C L/ n3 [
.word value[,...]
/ U3 F3 h3 c, R7 w.dw value[,...]
9 I T: `# f8 e$ adcd value[,...]/ G" R" Q k M' X1 Z* L
# V5 R s( R9 `+ K* y
写doublewords:0 X* u4 p0 v( }* q- G7 X5 [
.doubleword value[,...]8 g3 J, W# U2 |" p+ D4 N
.dd value[,...]7 k* |) a! n+ W7 O) t* @. d9 [
dcq value[,...]- ], b, e4 X% C; r+ K9 S; f
+ N( d7 d, m2 I6 I* n: _: v S写浮点数:
& n2 b. @0 y7 t+ T.float value[,...]9 w- z) t: A& d7 }: ?
.double value[,...]8 | y3 }! A( f$ ?) i, L; |
+ u6 ^( {5 z" D( s, P5 c
ARM的ARM模式和THUMB模式定义:
3 L& c. G p) ^! E5 U* ` q! u1 f.arm|ARM模式
4 y3 }4 d, z9 q.thumb|thumb模式
6 h! a" g# y) p) Y- ~6 w
% w, b% R7 K7 m9 c3 P设置架构:2 G; d: \# n1 |. @
.psx|PlayStation 1(MIPS R3000)
# e+ k0 i" f8 v2 U4 N.ps2|PlayStation 2(EmotionEngine)
# e" c9 v, S% }" \: j.psp|PlayStation Portable(Allegrex)
/ F. t6 @7 Y9 n! g% [.n64|Nintendo 64(MIPS R4000)
! O. J) \! L$ P.rsp|Nintendo 64(RSP)& K/ P- Q1 c# u5 C
.gba|GameBoy Advance(ARM7,默认是thumb模式)
$ [4 X$ m& J# s1 @ L.nds|Nintendo DS(ARM9,默认是ARM模式)
. S$ v! a) j4 r% v) @6 k2 Q.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
: c2 [3 b7 ?- g6 r6 w.arm.big|
+ Z& Q& X6 |% B.arm.little|
6 z; j0 P# m; s) g8 A1 f0 Z. K0 v& I+ C- Y( {
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。, W% @* V8 t' K; C, P+ |# K
|
|