签到天数: 1993 天 [LV.Master]伴坛终老
|
! }2 O0 ~- @2 t( c3 |( VARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
3 b6 l+ G6 ]7 E0 M" @
0 a0 d5 B2 O5 l/ U0 v1 m0 TARMIPS assembler作者是Kingcom,目前发展到0.9版本! Y3 x0 p1 _2 z% C+ ]) r
3 @/ W' `; Z. B% ?6 h5 E% |
Kingcom's website:http://aerie.wingdreams.net
2 {, t+ h& D( a' A8 t$ X
8 E) f w5 X1 z' q( m0 Q- SARMIPS assembler源代码可去https://github.com/Kingcom/armips获得( Q% Y: n1 F( @3 I7 w! m0 @
! ^7 G7 ]8 D% L3 n# k9 T7 ?% q. P更新版本可去http://buildbot.orphis.net/armips获得9 c1 e# p' j1 z7 g& y) H
7 r; D( Y; A3 k3 ^- |
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
0 B% M$ I0 n9 ?9 J/ {9 i% L& D G
2 M% T$ R3 [) q) q& m( tARMIPS命令行用法:
) D# o5 ~0 ~: P# A1 V2 t# @. c7 z3 }7 M4 D
Usage: armips [optional parameters] <FILE>
1 i$ _& h c1 R4 b. p3 I/ ?/ f1 V4 [- C- m' _! h. b: C* M& [) ^( w& |
Optional parameters:' R) p3 R1 }3 {+ J, R8 N" I
-temp <TEMP> Output temporary assembly data to <TEMP> file& [& T; O9 Q }( r. E" w
-sym <SYM> Output symbol data in the sym format to <SYM> file0 I3 d, C. _! O+ C9 x3 K
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
: q4 v+ Z) H3 j8 ^$ ?* P6 J8 P- _ -root <ROOT> Use <ROOT> as working directory during execution
7 G" r/ B/ h5 n" u4 O -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code5 L4 ~8 n% j6 l5 m0 t% w
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code7 _0 K1 M1 \$ |8 n# t4 Z$ u; w
-erroronwarning Treat all warnings like errors
. ], D7 f) x, P q; D3 e: k- `/ ~( K- b1 T
File arguments:* {5 |4 I; J5 g6 L1 x* Y3 v
<FILE> Main assembly code file
0 T: e; n) X7 _! H: }" q; a* [& |4 H( _* d& A: m
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件0 _4 Y7 u. y( h9 {
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba6 M n2 f+ k9 v5 @- g! W
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp; \/ }% e( y# @5 `0 G) J* e
-root <ROOT>参数是指定执行期间要使用的工作目录5 c. _/ D9 q P* Z' m8 z t7 J7 v
-equ <NAME> <VAL>参数用法不明, x: X( e0 a7 w1 P+ ?' |! L* T
-strequ <NAME> <VAL>参数用法不明
% M2 R6 V; a1 Y+ t' Y) l$ _8 Q( P9 H: Z0 u-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
1 B6 O' C6 d; p& i! J8 n& T. Y7 ?: I3 ^& l( j* @) a
<FILE>是汇编代码文件,可用记事本之类编辑
) h* w' k9 \. e; J/ y" `( _5 W
7 J: C. s1 v0 r8 F+ _1 f注释说明:
6 t2 g8 V; M. `) W8 G+ m注释可在单行指令后面“;”和“//”添加8 [% i& _* h% s6 C8 a+ p' D/ n
“/* */”式也接受
5 e0 _5 P: v. E
) ?- N( y! k, W: R& ~" ?4 `/ t! @例子:
% R& Y5 R6 m! p- s& q.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000) _/ j/ e$ @4 u, @
2 K4 P$ x& I* j9 p# ~# ?
.close;/*关闭文件*/
& i E& E2 B, }, v5 h+ N, ^- u0 V* g! j' P3 C v
标签说明:
* N; E4 f2 i' U3 p0 y! n标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。0 m" ]% _5 w- c9 t/ G, z& c! J
: H/ [8 V S% O0 ?, L6 Q$ y
数值说明:
& U9 R7 r! D9 l, t“0xA”和“0Ah”是16进制数值0 @, U* g2 b" V
“0o12”和“12o”是8进制数值
# C- n5 B t: b& |1 a/ J C- T“1010b”和“0b1010”是2进制数值, X' Q2 e# s! a+ h+ A
' t* C2 x) A6 ^8 g0 J, R7 G; X
equ说明:0 D1 X: Q! q2 [/ ~: q+ y+ \, E# w
格式:text equ value
+ [/ _9 a$ I6 N' y( C/ C. W% s! j说明:用一个text代替value% Z* I/ K; |3 v) I( F! u
例子:
1 y; f( [, z9 T: t+ g) M. z: Haddress1 equ 0x12345678+ T' ]8 s! b8 F$ W. z
ldr r0,=address1
& e+ |& B& P# t0 R" p& D, R* c.pool. ~% E* l; B( V! ^- O- Z* X, ]
, k0 _6 ]% Q. I3 G2 V% R! L函数说明:, B" M! o( [2 y' e
+ ?1 k% u& P" y% o- f% J$ @* W( v.open函数:
8 E! ?/ R8 C- k' S格式:. Y6 T6 E O/ T1 I# L
.open "ROM FileName",offset1 m" V' Q) v% g/ r" m) h
.open "Old FileName","New FileName",offset
8 D- m% q% Z& x8 e说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
! e8 G6 U; c+ ]5 E. }0 }& [0 D& @5 C7 M2 m+ ^9 K4 V& W/ s3 i$ k
例子:
" S2 N% W0 [) s.open "1234.gba",0x08000000
9 m% N) l1 k4 F& _2 f" F0 ^7 }/ ^, Q' P$ b; k
.close函数和.closefile函数: W4 w I3 e. l" k, |- h
格式:) n. ^* v" V/ E; o9 c5 ?
.close
5 y% {# F8 H$ A3 H1 z( A# U( N.closefile- E! v* i7 V! Y5 S2 u; B; B
说明:关闭文件。0 W! R4 V5 H# F+ J# M# d
1 y# ?8 q& |% A
.org函数和.orga函数:
* i* W$ Z. A% T$ m格式:( H( M1 @& |/ L& T1 b
.org RamAddress
5 y" C' D7 B8 G5 A.orga FileAddress- o0 Q/ U7 H. g0 G$ Q7 q# ^/ c
说明:
; o# N4 S9 u. t# |前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
) k# E1 y( u( y( |# B4 H+ c- i! n2 Z2 k
.orga函数可指定ROM文件的输出地址。
8 }' V1 e# P- P) E) {$ a
( V }! j z7 L# p' F6 l.create函数和.createfile函数
9 @5 ^+ c+ r7 M5 b2 b3 b2 R% K0 n: B格式:
5 @! A' S* @. v* P# T4 P8 r; v" Y.create "FileName",offset
+ ? f) g( n7 a.createfile "FileName",offset
1 \6 m: o, o( b) }! K( f说明:创建一个文件,如果文件是存在,他会覆盖掉。& }/ n7 J, r& W0 w6 ?) A+ ?3 O( `
/ Q' o" k7 j" ~% I4 ^5 n.area函数
5 J5 T/ h( b. v$ r L+ u& L+ j格式:- k/ v+ C: u1 x4 S2 {# _+ ^
.area SizeEquation[,fill]/ G$ | M) y" d( h2 \+ g7 s, ]
.endarea
5 a) @' s4 |! e- V9 f说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败' L6 m5 @6 w% O, j" c
& }% V$ }1 U& t+ P5 X, F
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据; a2 x* D- K9 K. Q
org 0x100
! m, x9 K: P# x.area 0x8
" q3 \" @; v; R; r* | wbyte 0x5,0x6,0x7,0x8
7 v7 Z1 D2 |, z9 \ l.endarea: `; d0 W L1 O3 @% x
6 O( D* w" E+ {6 I& j3 z.align函数
/ A" j: g, ? y* y2 S4 V+ m格式:.align num/ p3 r9 M+ P; J! h
说明:写零字节,num为零字节数量,用16进制表示。9 D3 d$ b1 f0 w7 K" c0 |$ J h
4 q* o8 I- ~9 B M6 F7 u9 Y$ M
.pool函数) `& M8 \8 m1 }% S3 b# ]: ]3 |
格式:.pool% S; {' W$ M# p7 `1 A) p
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。3 ]- E% c5 Q# M
例子:
" f9 U* O# h% Q; c% W2 bldr r0,=0x12345678;/ T4 w7 R+ E ^- H/ V& f
....# N% F! _$ W; f. |2 U) a
.pool2 l9 O) y E+ o
. l; L$ e0 I8 G* X.fill函数
) [; E8 w( H3 X) `0 I+ v格式:
Q* f# O2 s$ h% d" U" y% N.fill length[,value]6 b+ _" ^% x; |- Y! f5 [
defs length[,value]5 H7 \" d2 ^2 f8 J0 F8 p6 T
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。( p6 Q# N4 E1 f& V% o0 \7 @& o2 w
+ z$ s3 E# N1 u) t7 ?0 [.skip函数:5 p, `6 E) H d7 n* b9 C
格式:.skip length
* p5 w9 m5 I$ c2 {说明:跳过指定长度单字节数值,length用16进制表示。 I% W5 `3 J$ k" W0 z7 ]
7 Z8 j- K2 O% ]9 z; D9 g
写单字节:
4 q: f) R- C. u.byte value[,...]
, ]# m& a. j/ S* o% V) [.db value[,...]& I6 F* L# v1 e
.ascii value[,...]1 T3 g; Y0 `/ b" m! l" \
.asciiz value[,...]
, n7 O$ q+ j$ ~- r+ _1 V5 r8 kdcb value[,...]
0 ^0 L! \" O- i& `
( ?8 Y9 l) ]+ _' U; y0 ^写双字节:
" G5 _; z; D7 c: Y.halfword value[,...]
& ^/ }3 u; L: j: @1 }2 H) F! h.dh value[,...]
+ e) @/ t* ^, B4 ~2 @( sdcw value[,...]% h- \# {: F* `
( K$ [/ Z% |5 o A
写四字节:- U2 |& {- A1 _
.word value[,...]' s+ D8 t1 x, m& m( S9 @5 s
.dw value[,...]6 ?- d8 q8 P F% |/ y' J8 n- p: \1 l
dcd value[,...]
* {& U, t) M N% W4 v) E" T0 [5 O# p3 \; h: n# d6 O7 G, O, y0 F
写doublewords:
% r0 T/ x3 w! p5 }.doubleword value[,...]2 j, O. F% Z$ d% H+ v9 e
.dd value[,...]3 C& Z6 }1 S) e, E" s+ @' H0 d+ S
dcq value[,...]1 \/ l- ~7 T( f! h% B6 X8 @
1 h- x0 e, G/ I% G1 ~$ |写浮点数:
6 A7 M( b. ~7 F# b.float value[,...]
# |/ s7 M) K I2 c- Q0 _.double value[,...]
+ `) z2 R7 |6 p. q, c
- |& ~ P# P* KARM的ARM模式和THUMB模式定义:
/ U2 f" R# D9 K2 f.arm|ARM模式
; }; q$ K% w: u% j.thumb|thumb模式2 a6 H/ K3 P/ ~5 a' C0 ?" F
6 X. s) E4 T( R: i! \设置架构:: q, ?( | K+ q/ m' z5 e
.psx|PlayStation 1(MIPS R3000)2 n0 Z3 B/ B( v+ P& {, X
.ps2|PlayStation 2(EmotionEngine)
; V N/ S. r& v.psp|PlayStation Portable(Allegrex)
+ l$ y9 X. D0 d2 t' L.n64|Nintendo 64(MIPS R4000)
/ s$ M4 I/ q7 n6 \! r) o8 |.rsp|Nintendo 64(RSP)* W3 u1 H F! p3 o# O& {' h7 ]
.gba|GameBoy Advance(ARM7,默认是thumb模式)9 J6 r% s3 h" M; c; }9 K
.nds|Nintendo DS(ARM9,默认是ARM模式)
& h7 K* |' h7 }/ w1 N+ W0 F.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
! Z/ b; o" ~) W/ P.arm.big|7 N) g" d2 N! E! [
.arm.little|
$ e, a4 A& T: z3 Q% i$ @9 X# m0 ^1 d3 C# b" n
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
- q, K) i4 g5 y! s+ T) k) I |
|