签到天数: 1773 天 [LV.Master]伴坛终老
|
& R ~/ C. P# Q/ P/ w2 t) |
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000! r, v! Q2 F+ m+ M4 J! ~: S! K9 Q
3 h H# U4 ^8 k% G6 e6 u
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
! Q/ \/ r k( Q+ C
: N" l/ g+ ~& X4 ]! xKingcom's website:http://aerie.wingdreams.net
$ k5 ~% i& o( Q; M# t6 ^) S4 E2 {% L8 c6 p `( u
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得# }: m4 \, z& Y+ K
- u) _! N. n) U. A6 T, T: S
更新版本可去http://buildbot.orphis.net/armips获得9 m* Z$ [% _8 d8 @" U0 ]1 M* t
# g! i7 A- K; c M: x7 r* ?ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。* R" y1 x, F2 w, P1 l9 M
B' O0 L0 o) @! S' Q1 eARMIPS命令行用法:3 j4 q0 c0 v+ X# O
# r: i+ G% |( e5 U, Z& x$ R
Usage: armips [optional parameters] <FILE>$ j3 W) u" p: X/ Z
& z7 E/ G( k+ V' ?% `3 wOptional parameters:
% I, A) n" d# z# _ -temp <TEMP> Output temporary assembly data to <TEMP> file
$ X5 V4 u7 W$ C L$ u -sym <SYM> Output symbol data in the sym format to <SYM> file8 M& z) w- i8 |' \. k% f' i
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file) l9 T; h$ h1 p
-root <ROOT> Use <ROOT> as working directory during execution
7 y# g: Q, @7 c4 K5 M: R$ T' b -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code& h4 r( u8 a$ B1 S. x- u
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code9 \+ D: `4 M% q, e8 f. J0 a
-erroronwarning Treat all warnings like errors
6 Z" z# f/ d* z9 q, A* d4 `- G( X9 E! f% X6 y
File arguments:
& U G6 Q. G8 Q2 o# o; \# f/ r <FILE> Main assembly code file( L6 ]* i4 v1 \9 k$ D& a
# H0 s) t% Q" N$ ?4 i4 L-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件) I {' _7 x5 Q9 F( }. T! j
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba$ E+ g e+ u7 }, ~( a
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp6 w9 d0 x4 g: ?/ t- W
-root <ROOT>参数是指定执行期间要使用的工作目录: `6 Z# i. N0 u. O. E
-equ <NAME> <VAL>参数用法不明( K2 \% D5 X( ?, q8 \1 z
-strequ <NAME> <VAL>参数用法不明7 j8 A W8 I5 Y' r
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译2 I( |% x. M2 X) p
2 P; E/ x' d; y9 {<FILE>是汇编代码文件,可用记事本之类编辑
5 r( h) s0 n8 x( R D
7 n. V$ {$ i" N- x p$ d注释说明:2 m3 C+ D, l, W& f
注释可在单行指令后面“;”和“//”添加
# i- g# l/ G: A“/* */”式也接受3 W! P9 t4 n" U
/ E; u# O! ?2 J" S5 j' r- k& z$ X i
例子:
# t; B; B4 k9 Q8 S1 ~.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
* c2 }( d# o8 ` |% m, }" B! K5 V9 o
.close;/*关闭文件*/2 }/ h9 q" S! t8 b9 j% w ~! l
+ [ A4 ?6 i" t1 C# O) O+ ?
标签说明:; b7 M* c+ I# w0 ?9 B4 H
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
) g' Q5 I d g& d- b% e
& P$ @' h! f8 i9 w数值说明:5 O, u) c' T% x$ g
“0xA”和“0Ah”是16进制数值
4 D6 ~1 G2 `. x9 T) J“0o12”和“12o”是8进制数值
5 t* M' Q5 r$ x0 P8 W- _! E( g- \: G“1010b”和“0b1010”是2进制数值
2 g) o9 F% l' g0 ^& z0 @3 A- M9 N% v9 d$ N
equ说明:
$ ] v/ Y, h: P格式:text equ value5 C2 ]5 E5 r2 I" _$ e d& F$ H
说明:用一个text代替value! {5 I5 d/ j1 Z6 V+ Z$ c
例子:
& b/ @; L% x5 U9 x2 X8 X% l' z" ~address1 equ 0x12345678
# l; i5 C8 m5 L2 f& c* }# C/ lldr r0,=address1
0 k5 ~2 J6 F1 Z) m" Z' S' ?.pool9 u/ g) S2 K9 m" K7 I' Q- k
7 ^6 o) l) r8 F5 E函数说明:
5 t( X2 d2 [, _) T+ t, x' _
1 T. c! P2 Z! S4 b1 U( v.open函数:. [( e) j- y8 i% f
格式:; W" N$ c; ^+ @1 \8 T& v) M
.open "ROM FileName",offset/ C7 J. Z2 @, f! L' ?- ~4 @
.open "Old FileName","New FileName",offset* A: Z. w7 p, `: Q4 ?5 J, ~
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。' ^# w4 Z1 A8 ~
; D5 |9 ]+ k% c& T \例子:
* Z; S6 [3 {* Y0 y) l' I.open "1234.gba",0x08000000 ~' k% n+ q; Z6 _
; Z# |9 i: \ ^3 B$ Z" `" x& u9 H
.close函数和.closefile函数: {' l v% K, {
格式:, Z$ D1 m/ R1 @* A0 N4 e
.close
, }, } g+ `7 ]4 W.closefile2 D; t4 z6 b- |% [5 o, g1 y
说明:关闭文件。
) l$ F" T4 E" d7 R
0 B! P# S, {8 d1 C, A# C5 j.org函数和.orga函数:
7 `2 n; p5 k) J) p格式:
5 ~! y4 p8 a+ v- N.org RamAddress
( u4 Q6 q. B5 T( q4 C; w1 i.orga FileAddress
, P+ O$ W, t& G. K' {2 E G说明:
) {! Q+ O6 ?" {5 y5 p$ `( }前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。) a" r5 e" E K0 @
2 }, d0 I1 A2 n
.orga函数可指定ROM文件的输出地址。
: |3 X' W% Q! y7 E2 u! D2 F7 {
, D/ ~. |" G$ N) D.create函数和.createfile函数
4 E4 ]( F5 \* K4 u0 K: `格式:, Q6 ~# \# A8 c2 a* l
.create "FileName",offset/ ?& {9 I9 p6 t/ m0 I; w4 x' Q
.createfile "FileName",offset$ o( b: [+ Z4 s! q# G# g' i4 J
说明:创建一个文件,如果文件是存在,他会覆盖掉。
3 s# ?+ F; D" d+ M; j1 I9 D; B
.area函数9 }/ K9 y1 y: | Z0 U& U- H" Q8 Y
格式:
3 s' Z/ N- X+ X0 d.area SizeEquation[,fill]+ a/ s! x& W. X/ y
.endarea
# n5 l/ n; b1 g( I" n说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
! }' Y: F6 q" D; Q8 u, `
( e; U) S3 Y8 q. a9 T( h" L6 Y3 W例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
: J6 v: _8 T( a( P4 Porg 0x100
* P# h" Z" {, F* W( u! F d.area 0x8
- m; J, S; A, P5 Ybyte 0x5,0x6,0x7,0x86 R% c! N6 I# D& J7 \
.endarea! I& A: \( L0 Y {
7 \1 C2 Q1 b9 U8 \6 i5 o' p* T. K3 e
.align函数; w! \$ d; W# ^+ y8 y5 a
格式:.align num
, v3 H& i! U. \. ?说明:写零字节,num为零字节数量,用16进制表示。
* O8 r" |5 S2 ]! C5 N9 x5 b4 E& J
: \& i! \) l) b5 v7 ^+ E.pool函数
! \2 {8 k) n% r% G格式:.pool
# s' ~* B2 o# u6 O; M说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。: e: e% D$ i' v% W# y' e, ]; _! ^
例子:
& d& ]" J( e: J v$ m- @7 hldr r0,=0x12345678;* P" W- a2 |, T+ z
....: l3 J: @6 k% p0 V
.pool
8 Q6 y' L* Y" l2 Y: K( l5 C! R8 n( t! ?# I1 n' m& [
.fill函数
, \* t; z: a4 G. H1 v' T4 L格式:
- b. e$ H% D3 I; Z.fill length[,value], W; U7 _0 S0 a4 S$ \- p
defs length[,value]
- ?$ g5 }/ a9 t说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
& p' Q, m Q! T0 |8 m
4 \, x3 R- O( S: o0 W) m* i.skip函数:
+ z- i3 t6 q% b格式:.skip length- M& ?- Q _1 i$ {5 Y+ _+ j8 N
说明:跳过指定长度单字节数值,length用16进制表示。) X$ Y5 u7 N5 Q- F/ k7 b
4 X/ s# h& |6 m% B0 C# ]( m写单字节:) `7 M9 I- K6 s# D1 ?1 ?) b$ e0 C
.byte value[,...]' C- h' k& p' U$ A6 Z) Z
.db value[,...]
, P3 a' c- f9 T/ [& P.ascii value[,...]; T; f g) J0 T" j( b
.asciiz value[,...]3 V! s8 T/ k6 B5 j1 C
dcb value[,...]) V8 [; D* ^- F5 L4 S. \
! k C6 m3 y+ N3 H+ u p& R写双字节:
! {: m$ P' G* J$ F) b9 ~.halfword value[,...]
3 I7 [9 [" x3 f/ a6 ^; c! g.dh value[,...]& W: {( X$ r2 z) A1 H& p
dcw value[,...]
2 s( f4 {* P7 ~ h- J
' P4 F+ C- M- N写四字节: O% t# g9 V4 v
.word value[,...]
2 T# C1 N. D0 ^( u" {) U$ z1 f.dw value[,...]
1 |8 \" u; d; o. ydcd value[,...]
8 E6 A. X* t( M6 Y$ d. N0 b$ a/ N( |
( g" a- u" m* o6 m) L8 b写doublewords:
$ i. o% |# Q/ e) |.doubleword value[,...]
0 N- W! K- G6 \$ c% ?$ _8 z0 T.dd value[,...]+ j+ u3 C) E3 z4 S
dcq value[,...]+ y* E; V: D7 B* T) S7 V, T8 n
/ b2 c5 M7 B1 n6 n Z" A; k写浮点数:
* W/ k( \. H! v/ _.float value[,...]
' i. I2 i4 d! W7 h.double value[,...]
/ P$ l6 Z# M1 N0 v$ a) F7 u+ a$ _: Y( ?
ARM的ARM模式和THUMB模式定义:
! O" J, b! T Y4 r+ C7 P.arm|ARM模式7 k- Q7 R& P- G
.thumb|thumb模式" W* h! M3 G+ q' W' ?
6 G% w: a: b. s, O# g2 W ^2 h设置架构:
* P" o5 l* ^7 U$ l.psx|PlayStation 1(MIPS R3000)
! M. Y; }* I5 G" w- O.ps2|PlayStation 2(EmotionEngine); M2 B: _3 E% a7 y- }: O
.psp|PlayStation Portable(Allegrex)
& F2 }0 r' e5 \! Z2 `% N' P0 g.n64|Nintendo 64(MIPS R4000)
9 a( k) V- s0 n6 k. l# o8 X5 w6 b.rsp|Nintendo 64(RSP)* o' S' O$ t/ V
.gba|GameBoy Advance(ARM7,默认是thumb模式)" K. { Q% u+ y; E
.nds|Nintendo DS(ARM9,默认是ARM模式)
: E* m( t" s6 C( g4 h6 ]9 G.3ds|Nintendo 3DS(ARM11,默认是ARM模式)+ H. D& W6 E9 ^5 e' ?: d- f
.arm.big|
" M% s7 O9 f/ F; K2 X.arm.little|
. A# X |+ p- B. a' j" n" Y6 q2 g$ e
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。' F; c6 r0 w! e0 w' L* ^
|
|