签到天数: 2137 天 [LV.Master]伴坛终老
|
2 s3 f! y, X4 G. `- q2 mARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
7 ]% P5 t% m4 y9 \- S2 `
- k- E0 u S6 R- [) uARMIPS assembler作者是Kingcom,目前发展到0.9版本2 Q5 ~/ N, S/ h! m* F! I
8 A5 I- f$ z2 Q$ ^8 S# qKingcom's website:http://aerie.wingdreams.net
5 y! |4 p K6 w6 \ e
: u5 a; Q+ k( U- r" n2 ~4 uARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
2 ]: D/ \: G3 F& a6 x$ k [, U' d' G4 b: o& E- [
更新版本可去http://buildbot.orphis.net/armips获得
( Y3 N: m6 V( h& c L( t+ o2 c: V/ B
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。1 ?! B/ Q1 y6 e" i/ ?) {$ ]
% _" u2 ^) R8 P8 c/ XARMIPS命令行用法:
* ~/ T0 N- o- b$ m. a5 e% J. |& _! T/ v
Usage: armips [optional parameters] <FILE>* U$ l+ J; h1 a$ F/ S6 V
( k- C6 n+ K4 j/ D+ F9 ^# {" t, l
Optional parameters:7 z) G5 g9 L. t
-temp <TEMP> Output temporary assembly data to <TEMP> file8 D6 f6 y# m( p5 h" _! U4 U
-sym <SYM> Output symbol data in the sym format to <SYM> file
0 u0 R, m, N6 O: Z7 Y8 S |" J -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
* @% E; A E5 F. X- i) z1 d& i -root <ROOT> Use <ROOT> as working directory during execution7 f. t% y1 H% }$ f2 t2 q
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code3 M$ w) @/ b/ p, Z+ S' T1 d3 j0 A& N' f/ P
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
8 J6 T0 X' f( F6 s. f -erroronwarning Treat all warnings like errors
; W6 D$ \; o# z5 K4 \3 o% O6 ~9 z+ ]; T4 @2 y
File arguments:/ m M# \2 o. W5 k
<FILE> Main assembly code file
5 J% O" d5 }, A) b7 ~6 q7 a/ i' x% D8 x2 m7 W) l* F( N4 B
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
0 y6 z' w2 @# Q-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba. S6 A8 W; J/ }* C
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
5 H9 n7 n N# x) B: C-root <ROOT>参数是指定执行期间要使用的工作目录
4 n/ ]8 P, J$ O; v-equ <NAME> <VAL>参数用法不明. w% T8 |/ @; A# t: @5 \+ [
-strequ <NAME> <VAL>参数用法不明
3 [( l! ?0 y9 ^* z-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译( M: L8 @% e7 z2 ?
# p/ e2 T$ B' r6 b4 i2 ~7 E J- I/ S<FILE>是汇编代码文件,可用记事本之类编辑% ?; [8 M- I# w! v) w
. H2 S) J3 F6 X$ R/ \8 y
注释说明:
- O1 j0 W- f) n注释可在单行指令后面“;”和“//”添加6 r, f( j* l. R% D+ P$ M. y, M
“/* */”式也接受5 L5 P+ [ Q. C$ ]5 L
2 @9 K8 H9 d& z5 h例子:" \+ Y$ b- {0 Q7 @6 D; L2 D
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
2 h- F( i, a+ J" o4 t- l3 r1 m$ G& U: G: U2 k6 s- k4 _
.close;/*关闭文件*/$ L4 d) N V9 F1 {& a- _
: ?' ?& ?6 Y; s& U/ e) D: H标签说明:+ a) ]0 ~; u/ J
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
$ R( l1 |2 l6 `) Z% M
/ w: T$ ` D4 ]数值说明:
. w6 F [% w9 Q“0xA”和“0Ah”是16进制数值2 ~; d+ k S. Q5 \
“0o12”和“12o”是8进制数值
& _! r; v3 P0 x" W) C“1010b”和“0b1010”是2进制数值8 t% ]! Y% _" y8 }1 U
- [8 i1 A0 f6 o# [
equ说明:
) n4 S! y; p1 d; z a, q- Z格式:text equ value0 W2 l. ] T, c) e# r+ Y. z
说明:用一个text代替value
, @1 d# b4 B' c5 E" H2 ~# S例子:7 F3 M* ~3 w0 @
address1 equ 0x12345678- R- v1 O) \! }6 {
ldr r0,=address1
$ ?& M' i" f! R! ^: R+ ^.pool
- R' J& u2 [( k) Z& ^1 P; Y8 R# p7 O# Z2 I r
函数说明:
; }( s2 T/ o. i8 L2 m+ k( A
" U. T9 O2 R& i.open函数:
; H/ d9 L9 R6 T y; Z- D格式:+ X, c! L/ y* u! O1 K
.open "ROM FileName",offset
# c5 ]2 [0 x% e5 G# ^: v$ Q.open "Old FileName","New FileName",offset
: q0 z5 f' k# T1 d: C说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。7 L) Z/ M$ j# i& \ F9 P# Q% x5 j
/ ^8 [# y* Y9 d y' H3 N! M, _' \/ c例子:
1 R' B+ j8 e) y! K9 |& V" W- `4 @5 B.open "1234.gba",0x08000000; b' u4 S+ T% `1 j2 {
) H/ a; Y; z' ~' T3 b; ~4 a/ ?
.close函数和.closefile函数:4 D% C) _0 W3 n/ F8 e* x: z
格式:
0 m9 S2 f+ p% F0 d5 A.close
; e4 Y5 P8 N$ L9 r. X: |.closefile
/ y# m* x u1 ^说明:关闭文件。
4 O* a1 j6 g5 O: o0 K3 V6 U4 K" h+ Z0 b% W( u' L/ H
.org函数和.orga函数:9 T5 ^0 Z6 j( g% O& |% E
格式:1 P U2 O, b. B& L/ U+ s$ F* X
.org RamAddress
& v7 \0 t0 Q0 F- u& P8 ^- y: h# l.orga FileAddress
0 V5 o2 e2 I D) a" r说明:, L( J7 X4 R/ I
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。9 v3 m# \9 z& c2 Z+ p
5 I7 Y- ]9 w( z' F.orga函数可指定ROM文件的输出地址。
7 ?* I4 M6 t+ ~* T- Y' ~7 V# W- D+ k
.create函数和.createfile函数
$ k: P0 }0 i. B1 e$ n7 ^5 F, g格式:! V8 `. S1 S1 R- q; y
.create "FileName",offset2 v' }: {1 j3 m2 V0 M
.createfile "FileName",offset5 n6 `/ k8 Z7 i7 G* ?
说明:创建一个文件,如果文件是存在,他会覆盖掉。
. r' c4 G2 j) J1 j
" p1 Z2 ?" U; R' L7 k: R% @" `9 ?.area函数
8 d1 } a" ^; \格式:) j; V+ n+ C: B+ Y6 L0 ]: k
.area SizeEquation[,fill]. ?. \. f4 L1 m
.endarea
3 p& H% v3 g0 f* m* T3 y4 t说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败0 Z) z7 m8 W: |" ?
& B p0 U+ O) e) C% s
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据8 D" I. F: Q# S( Y, r5 b7 n2 I
org 0x100; r! o k7 y0 X: `9 Y$ R
.area 0x8
6 b5 J5 m7 U7 |) t8 }1 G* A Tbyte 0x5,0x6,0x7,0x8
3 u3 w' K& @# q4 [: l.endarea. h7 Q; a0 g" y6 Y* u2 L( L% a( r
5 f* P$ t# V/ ~5 |" D: N' z
.align函数8 [" w3 D/ x) N% c
格式:.align num
' k; U t) v- f- P ~ Y$ i说明:写零字节,num为零字节数量,用16进制表示。
/ z$ M, q% R" [* |% _$ C# I d) ~# R. i; ^* ]- G& v+ G5 f( F5 W
.pool函数
' z$ S# Y$ }, t3 b) k格式:.pool
@2 ~/ L, Y" M; L- B说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。. d. R9 X8 Z" c
例子:
. l- D {7 V4 r' z* g1 k" L+ t2 gldr r0,=0x12345678;& ?- N" M9 u0 B+ v5 T5 M
....
1 _! N% [2 O7 m/ v2 {.pool8 O0 H6 V- L# v6 P6 l4 b" C4 U
! S4 z6 J( d: N N; P
.fill函数" m( s+ p! E K& L
格式:' V' z1 V5 I/ F# D2 Y
.fill length[,value]
3 w5 M9 x+ j$ i$ R+ |0 C u; Ydefs length[,value]2 l4 C7 Y/ P. r2 T' D
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
6 p, e0 c9 H5 ?3 U3 P, Q7 K Q; I6 q6 V: p% x4 p$ ~
.skip函数:
" H" x! Z& n) G! [0 r n: K格式:.skip length) J+ ]2 F8 e2 f, J+ S2 ?; v
说明:跳过指定长度单字节数值,length用16进制表示。
6 x" m7 d9 j8 z I# G5 d5 r, R6 s( s* |( [6 }
写单字节:4 b" h. Q N- d2 u3 I; p% V
.byte value[,...]
, t! O! _2 V" b* S, c+ a) U.db value[,...] c( u w+ f/ F: ~& R9 d
.ascii value[,...]
7 K" t% D. ]7 x* r$ q5 M2 V.asciiz value[,...]
+ F$ s2 r" p+ hdcb value[,...]2 A) T) S! C: O$ k7 L
4 E3 J( R) S% O1 e* c2 \$ W
写双字节:: }! ?9 e( H# o A" C* _
.halfword value[,...]
( t2 O! g) [ W: i8 _* C.dh value[,...]
) D: B' U! X/ I' xdcw value[,...]
. |% [( b1 I; w& o: J5 |2 z. P3 |4 T* T# d$ Q
写四字节:
7 z8 y- | Q9 S ]8 I: ?# @1 ].word value[,...]! d* e/ s6 X5 U ^' Y+ T' z
.dw value[,...]
0 Z# l8 P- m8 }0 n8 V- ~dcd value[,...]
# A# R K/ G) y3 |6 K5 r' q( ~
9 \) f' f$ i5 | ?写doublewords:
, X2 z0 o: E. w. e.doubleword value[,...]
5 G. j% ]# x+ d.dd value[,...]
- ]* c- }, z! O5 N# V7 ?dcq value[,...]
. s s3 O6 ~/ ]8 C1 b- `4 @4 k/ ^6 R
写浮点数:; G) c/ x0 u8 V- |$ r
.float value[,...]
% M. f, m) K6 s- F.double value[,...]; i* y: N. S' p$ v6 H5 t
4 f2 C- o& B( V; f1 U5 k F
ARM的ARM模式和THUMB模式定义:
/ k# h& m* \9 N) ^.arm|ARM模式
( S2 N; M8 X" _8 @' i0 N) G.thumb|thumb模式
; E7 Z! n( P) i5 l/ P( T& l( s7 Q: t. v. u& ], f6 [
设置架构:
, s& P) z- G1 k2 I* _.psx|PlayStation 1(MIPS R3000)( L; X- U6 a& d" S W% R
.ps2|PlayStation 2(EmotionEngine)
) X0 j. \6 K* S3 v, M0 r9 z3 i.psp|PlayStation Portable(Allegrex)
8 K8 F, B+ a( ~.n64|Nintendo 64(MIPS R4000)
3 b' a. r) r; E.rsp|Nintendo 64(RSP). a) B4 U2 ]" h: i
.gba|GameBoy Advance(ARM7,默认是thumb模式); m ]4 S1 J# d& Y* h' i5 d
.nds|Nintendo DS(ARM9,默认是ARM模式)
8 \2 N3 k/ z( f4 `0 h- z.3ds|Nintendo 3DS(ARM11,默认是ARM模式)! A2 e' U8 g% C3 H/ t
.arm.big|1 A2 w0 }+ s( j
.arm.little|1 W/ t! o& P" Z+ i" Y$ O
7 P& j# G' Y$ u- U: }* \
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
% n" S1 \9 y$ h) b2 `9 w& g |
|