签到天数: 1804 天 [LV.Master]伴坛终老
|
5 U% s) J! }! q1 I$ eARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000, n# x; O# {7 N0 Q% g j) ]5 O
' {1 n5 j% u8 W, \* P3 rARMIPS assembler作者是Kingcom,目前发展到0.9版本, \$ y4 A6 S8 S$ ~
& g' B& |( A+ l
Kingcom's website:http://aerie.wingdreams.net
1 i3 L4 l- @# I7 L3 Q3 `7 }
, P6 p* G: J+ Y1 ~& s' ?. u oARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
9 `( h+ f' p$ p1 J: X' ?+ L; p: Y/ ]4 S9 |6 h6 L6 [2 ]
更新版本可去http://buildbot.orphis.net/armips获得
& P( r8 u) \* T4 D' Q: M
! e& ?5 W' v$ I- q/ ^ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。: A3 T4 b+ w) I7 M3 f# v
6 j9 z2 o9 |; U; h/ I& f
ARMIPS命令行用法:; w+ V3 w6 ?; a4 d7 t. g S7 t
7 z9 n' X; Y8 N3 ]Usage: armips [optional parameters] <FILE>
! s$ s0 S5 U, O8 e" i" F$ P$ [
$ n* w( L' O# _# n* L$ pOptional parameters:
* l1 Z5 |3 I$ q" p& f -temp <TEMP> Output temporary assembly data to <TEMP> file6 m: H( R1 i0 T0 u! f3 w- i( J
-sym <SYM> Output symbol data in the sym format to <SYM> file5 ~8 P) p E. S3 J6 }
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file9 p$ m7 V1 H. {7 F
-root <ROOT> Use <ROOT> as working directory during execution
3 o7 f. S6 k, b1 x/ | s -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
( `4 R7 U/ ? c5 ~" ` -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code3 ^& S8 T. v) i e5 `, m# |; s
-erroronwarning Treat all warnings like errors1 W+ Z8 X* [+ S, p' ]7 D( _6 F0 n9 D
2 M, p( F I' ~# W8 j* Z8 C ?
File arguments:
8 W) u+ b$ D9 w1 O. Q0 u% z8 m <FILE> Main assembly code file
% O/ K; a* j2 @. f1 W7 ?9 `( A9 l; T' C1 \2 U, D. c; ~# m
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
3 l. s- r! D; b L! @% a; S-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
# v, f# f9 C8 i; G6 _: G! Q-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
x9 [- }! v* q0 ~-root <ROOT>参数是指定执行期间要使用的工作目录9 q8 n4 J* H1 E; z: T
-equ <NAME> <VAL>参数用法不明4 x$ O4 Q/ c8 H z
-strequ <NAME> <VAL>参数用法不明
- B' T5 y3 H6 ]) `7 `-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译7 g4 Z1 U( J6 i" U% F
7 ^# o- p" U' [9 U6 Z
<FILE>是汇编代码文件,可用记事本之类编辑
7 C5 L) ]1 j% ~) g2 a" y
# A8 h: H# K; m0 w0 K注释说明:2 E+ ^* q' x: ]" i4 v2 n& y8 s
注释可在单行指令后面“;”和“//”添加
c# A7 y( C" j) K c/ ]( ^ V“/* */”式也接受
! B |+ x5 S2 c, P) A4 |1 ~. s0 G! b/ i/ T- S
例子:$ R/ {* i+ B+ {0 I% f
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000000 W5 Q1 }+ `1 m( F. r; t, B# a4 F9 J4 X) }
/ P$ R% y, \+ O2 C$ `.close;/*关闭文件*/: `0 J/ n5 f) ~' I( D6 _
( r" Q: w5 ^3 |4 ~5 B$ U- {' ~& s标签说明:
0 i( b j8 V6 \7 h标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。8 F3 B1 Q; ~3 t/ I
7 H @ `. x* U' i- J$ I+ t( z5 q数值说明:3 i1 C8 C, I+ [1 T5 J" ^
“0xA”和“0Ah”是16进制数值/ c4 v* _9 G. U, W4 S% H% H
“0o12”和“12o”是8进制数值
, _" X4 }+ I0 f# o1 H# W“1010b”和“0b1010”是2进制数值, p3 f$ a8 h" u. f6 R) N+ Y7 |7 t* n
, E4 g6 M/ P# Z5 s. \8 X# i7 Fequ说明:( c" r+ h) B+ r% b
格式:text equ value
3 r& Q- X1 j, y, h! N! m说明:用一个text代替value
7 E5 [0 D& r1 X B5 t8 ?! h例子:1 y2 G7 X" a8 A
address1 equ 0x12345678% Q; J2 k+ S" _
ldr r0,=address1- ~# o% X! l6 f3 e* r3 T' C
.pool
- D a5 z; D5 ~, y9 R1 W9 \
' d% { y! ^* U函数说明:& ^5 B. M3 _# A) W& b
. u2 X; [0 H5 x5 m% ^# U" A+ ?4 n.open函数:
( h1 e `9 A) ^* e; R4 r) Y+ c3 L: ^格式:
3 s) c: b2 `& M0 q1 j4 H.open "ROM FileName",offset
& Y6 `5 p3 S" K' R* U/ J2 p7 z.open "Old FileName","New FileName",offset
* l# A& V! }( f$ C. }. k% I说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。 Z( }: V% {2 f3 t4 m) @4 [, k
: A, R/ C- \/ F8 F例子:
$ A* N/ _+ f4 D4 c" u6 k.open "1234.gba",0x080000007 A# o; z# h' m. C% y6 Q
. x3 S( [0 _5 O( U/ [* ?.close函数和.closefile函数:
$ h& `5 _- S, j. l% b格式:& b$ V7 l- X6 U- K) U3 U
.close$ m! M" Q4 b5 y3 C
.closefile
. V$ {/ B4 l7 X- \# e说明:关闭文件。
3 T; z4 Y+ l0 @% Z8 o, A! R3 K0 [2 }1 U, q) e, s
.org函数和.orga函数:3 b- S/ a0 u. Y
格式:
. B! }3 m) t! o/ N.org RamAddress1 r0 V/ d2 ]! j* y9 A
.orga FileAddress, n6 X/ L# a8 f
说明:- f% n6 j+ u2 Y
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。3 X+ T8 f# s% F* c; t) ~% Y7 g
6 Q+ [) w# `' \: M8 e4 }.orga函数可指定ROM文件的输出地址。3 L$ r; E# W( X+ J( z9 i) Y# \
- U- A6 G. Y: B$ f
.create函数和.createfile函数) g& p, s- j' S0 g4 v( G# Y) J
格式:+ r6 g! m+ b5 \5 g# u/ h
.create "FileName",offset: @$ }: d% s* J# v1 R
.createfile "FileName",offset
4 i/ ]( b: Q" W6 _ B6 l说明:创建一个文件,如果文件是存在,他会覆盖掉。
9 }' l2 K1 y' x( P; d/ i
. g. P1 G6 {9 b: b.area函数
3 g2 c; n# G: f7 X; h* ?. v: j格式:6 V1 l R( k) D5 l* l
.area SizeEquation[,fill]
8 o6 i: w# L( d" q! v$ i.endarea
, S3 K7 s& ?7 q$ y! D说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
3 r$ `# |! f! A+ K: u' Y# T# o* U6 Q% Q, ~0 D" r, Y
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
! o# y1 Y5 r6 ?0 u( p+ v/ qorg 0x100
5 k3 v6 Y) m$ u! g.area 0x8
# d! j3 ?! b+ A" r# h1 Z' gbyte 0x5,0x6,0x7,0x8. g2 ^' b$ N* Q3 x6 M* S4 u
.endarea
" U) }* j) c \$ E+ c& b; x5 u; ]" G/ M, O5 f8 G+ k
.align函数 }7 N: M; A* k4 E5 n7 W
格式:.align num4 O3 }# u2 u3 s% D. E( D1 ?
说明:写零字节,num为零字节数量,用16进制表示。) x; s' A" z) T2 s! [
8 @! ] Z* t7 f3 Z.pool函数
+ Q+ `) S2 \* \) f# g6 L6 e格式:.pool+ t* S+ p/ R5 R1 a
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
8 u- U) @; J2 B% s! i# ]例子:2 d7 h8 V( `; f7 N s
ldr r0,=0x12345678;
# h* A* A1 m) M5 C: F....1 A \1 ~. {4 L; \$ z0 c( V
.pool' z3 x% n4 r; P0 z
$ x) A8 C5 z* Z.fill函数* |' N. W1 C0 d4 Z# M; j' o! U
格式:1 L+ }, T1 [4 c* R* k& s3 m
.fill length[,value]% R9 R g% x" K( ]! X
defs length[,value]
2 T) P' `$ l9 Z: P; G$ ]* v \6 ^说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
7 k- F2 @5 M8 ^% J( F: `( g1 _
# } }2 ?( w2 r: F0 ^.skip函数:/ l9 a5 B7 T: M8 g/ U" |
格式:.skip length
5 p5 `9 S1 O' T/ @, S说明:跳过指定长度单字节数值,length用16进制表示。# P8 \, L! q* l: C1 F" r
2 k, B* `& A' T0 _
写单字节:% l/ v! k- U8 [, o2 I2 Z. `5 v
.byte value[,...]
% G, {2 G# H+ @1 k/ S.db value[,...]
2 m0 F/ u1 N4 r2 I.ascii value[,...]( g. r4 I7 _7 S
.asciiz value[,...]
! M# b5 \. C$ o" Ydcb value[,...]
6 T; _/ C: m1 L* c9 n
: K; p# _7 w# J4 n0 P& I- W9 u% v写双字节:# |) l$ T0 w4 k$ |% _; M
.halfword value[,...]1 O5 S% `5 U7 l8 Z% W
.dh value[,...]! \/ x+ Y- N( I& o
dcw value[,...]1 t" ~/ w1 R. H( |% N0 N1 }
" Z1 I5 U9 X- ~- |
写四字节:8 {3 k9 s- o4 E3 u' R. m
.word value[,...]
' Q( O B9 n: {.dw value[,...]% ?, B; C! M/ n4 z* m
dcd value[,...]$ R/ k+ q" f' k6 j
2 L& f& r% K# p% l1 O写doublewords:& B/ W# Q( N4 r) X7 D6 s
.doubleword value[,...]
' ~/ A6 S! }+ R A1 E7 V% f- r# C.dd value[,...]
& [* y6 v# `, o7 _" jdcq value[,...]* i7 ?5 e6 v* N7 s( W
2 r1 U% y4 u0 B/ g5 p$ [
写浮点数:% D3 o: @; Y( b7 ]
.float value[,...]
7 P' Q4 h8 ^7 S- d! E/ b7 K5 X* Z.double value[,...]4 p. D* ^2 k+ H0 m5 }, v* _9 c0 G
9 _6 F& T, i; k) K2 n6 X
ARM的ARM模式和THUMB模式定义:
2 W1 K0 }2 N. E$ g2 G. ?.arm|ARM模式# N: _& S' K; C4 Z" t
.thumb|thumb模式) I$ l" G8 a' ~, f+ H. b& O
$ w2 V8 `) \* O7 \
设置架构:
$ d: p0 X! O3 n4 }/ b+ s1 ]( o5 U.psx|PlayStation 1(MIPS R3000)
' h. W7 `* [; M4 b+ d" o9 ?8 Q.ps2|PlayStation 2(EmotionEngine)
" ^/ k4 O1 e) _* E' V.psp|PlayStation Portable(Allegrex)
! F" q: ]# |$ L! F9 B$ t# ?.n64|Nintendo 64(MIPS R4000)) ?* T a c% g8 |6 [& x( d
.rsp|Nintendo 64(RSP)- `& m9 A3 Y% v/ X
.gba|GameBoy Advance(ARM7,默认是thumb模式)
- M3 G9 A7 Q% |.nds|Nintendo DS(ARM9,默认是ARM模式)) W1 t3 ?3 w1 q' |
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)8 Y; h" F2 o* x( `4 C3 `3 a
.arm.big|
! H# `" m; l( l7 \ Z.arm.little|
0 W$ P; v4 D0 [; K x5 U) O
7 s8 [$ `2 U- F) `常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
. I3 G# b! u$ J" W6 e |
|