签到天数: 2157 天 [LV.Master]伴坛终老
|
- I. Q6 {8 _- P# w/ q6 P- mARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
7 X, L8 i* [- M* W& Q m5 ?9 C: t: u n; p5 x( ]* O2 u* w
ARMIPS assembler作者是Kingcom,目前发展到0.9版本: p0 f7 R9 N5 L3 u, N) {
) R, J& o( {$ v/ v# j: \
Kingcom's website:http://aerie.wingdreams.net/ h- r/ N# ~. m9 N& I7 A2 J
6 {6 \% K% f* e- D% [6 \: eARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
l' t9 K0 [: n1 l3 d$ z4 e5 l) C' Q- S. u" z, v$ [
更新版本可去http://buildbot.orphis.net/armips获得
" Y4 B; g+ {- |6 ?0 V- E1 j
7 F- F# ^) a; }! d& |4 FARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。; e- B% v* b5 s& k3 z& F
, U+ z/ T+ C) R& T5 [1 `! RARMIPS命令行用法:# L0 B h# X( S% W: A$ n
+ d, r3 I1 m c! w) V+ N
Usage: armips [optional parameters] <FILE>' n; @! e6 v6 z( K8 N" v( }2 _
( t# t( C' h6 W' u$ g
Optional parameters:
6 Z) {- R' q: J, p* n/ J& k -temp <TEMP> Output temporary assembly data to <TEMP> file
0 k& Q4 Y. j1 c- V) T2 ^' S -sym <SYM> Output symbol data in the sym format to <SYM> file) y2 Y. d8 q( B2 Q. ?
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
0 }9 ^9 q3 k% d! U8 m -root <ROOT> Use <ROOT> as working directory during execution
# q5 N5 C/ j6 b7 j" b: j1 L( j -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
) M. H) p, @- {& a. ~) t i -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
V4 u7 U) e+ r -erroronwarning Treat all warnings like errors9 f0 _7 f3 L7 B- c
1 S# c# U8 X6 W( D" G) }
File arguments:
; ^, _' K7 {7 c <FILE> Main assembly code file! Y, J& S+ f" `$ V- [7 g! ~' C
' W6 M7 C9 h/ T \. }3 k7 T$ a
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
) ?# Z/ o" c8 b' ?-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba5 a6 f; B! d. d L3 b
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp; o, [2 W0 p, k9 h& G
-root <ROOT>参数是指定执行期间要使用的工作目录
! R! O+ \7 g* J- m8 t-equ <NAME> <VAL>参数用法不明/ j7 o( Z: c3 v5 U/ M6 b
-strequ <NAME> <VAL>参数用法不明
/ \. b" O2 ~- A: g, M, {-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译; }% u, A! r( i& l- Q0 l
! w5 ~1 |9 ]2 d S
<FILE>是汇编代码文件,可用记事本之类编辑
' f( U! d+ m( O5 }0 P$ i* ~
! x& R& `- I2 r/ k+ h+ V注释说明:
% c' g; r& k, [& d+ {/ n注释可在单行指令后面“;”和“//”添加, K Q- {7 I4 g1 r. s
“/* */”式也接受" [6 D" @0 I* F+ Q, q" D5 F! N
+ `% C) P) S+ P/ \- i# _0 P例子:
: w2 T- o- [! ?0 n9 B1 _.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
5 Z& F5 r! }: U+ w* H1 g. T# L: K2 {' P( [* A( o6 y- A a
.close;/*关闭文件*/
$ o& c" U1 l! q, m5 R6 J
7 X8 M# ~, i" K+ q标签说明:! B0 j8 X! T3 |; ^: W
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
$ W. f6 }' b$ P2 s; ? }& I V; C
- f) Q) v; \" S6 K( e数值说明:) Z% I8 G# z5 r# L. V9 K
“0xA”和“0Ah”是16进制数值
9 F0 `- v7 M. h0 a“0o12”和“12o”是8进制数值" k9 ]- c- ]# }9 Y
“1010b”和“0b1010”是2进制数值3 u* C9 L, v8 O" c/ c
% n S. _0 @% ^% C5 J
equ说明:
. P L; d/ V; E1 v" W) T* ?格式:text equ value
4 \/ k( e' |: v. ]$ Q! O$ L说明:用一个text代替value ^2 H3 b: v9 C1 V- w/ V& p5 d. c
例子:* a V) W- _ g. h
address1 equ 0x12345678! [( _( d' e, P9 X7 `' w7 s
ldr r0,=address10 E0 g+ B9 F0 R v8 k
.pool0 I5 e8 N1 ^0 z
4 l" m$ R+ u, K% I" X% j
函数说明:
+ Z/ U( z1 r' {+ X. M% x
! G- G. z( p1 f! V" X.open函数:
2 t |$ R. a/ K! G( s# J格式:
# [ x% k' ^% t- k.open "ROM FileName",offset4 j/ G( X# N' q; p
.open "Old FileName","New FileName",offset8 S z3 I" v- h
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。 ]3 o5 m4 ~/ _7 O
7 \& W. G6 U: s. T/ t0 n% H例子:3 F8 w: A- L, x) f- }. J2 B( B. |+ H
.open "1234.gba",0x08000000
5 g* H/ ^' ^ b. |
6 ?+ h2 C0 h) M# u6 C: |$ I.close函数和.closefile函数:
4 m* ^9 c8 R: U( N v# x5 r/ E格式:
1 c7 y/ J* g# l; b$ w( X.close) B/ B5 S' |# x8 B4 i! `
.closefile' ~0 Z) }3 m( Q- j" G* _& f8 Q
说明:关闭文件。
; K H& c% E7 `9 m5 P( U/ r) C8 K0 D' N5 e
.org函数和.orga函数:
9 u7 }4 j' |# I- J% b格式:& L7 c+ y9 c1 X" X, ]7 ~" V8 j
.org RamAddress
% h3 g/ U) H$ F$ ~9 R) b6 }2 M.orga FileAddress
7 K% |# e5 i; ^1 H4 x: g& `8 R1 N说明:6 ]% P4 D- j! x; J( L; C
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
/ l( j; S+ U6 s+ l) j+ }- K2 j" t; N2 ?6 f O
.orga函数可指定ROM文件的输出地址。6 M: E+ m% [2 S2 t3 d* e' j
, W" i d3 p7 c6 \% [.create函数和.createfile函数3 A) O- u' Z- v7 |8 a. u I: O+ _
格式:1 R% ^( i' G; t
.create "FileName",offset, Y& t& j) X% w2 Q: g/ c
.createfile "FileName",offset( c$ V" h( @( W0 U
说明:创建一个文件,如果文件是存在,他会覆盖掉。
7 E# g4 }9 _# v% l$ }4 a8 C% G! m3 V0 x: w6 s- }5 {4 L
.area函数2 }' o6 ?- V' T
格式:
" ^2 E; E# R4 {. ?: t.area SizeEquation[,fill]2 `! k& |7 S/ ]
.endarea
$ m* ^7 S. v" |* T0 c) J% c/ n说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败, v1 n, _% W/ K+ O4 U
# W6 G$ }4 n% z例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据" N9 \& A- S; b
org 0x100
) h7 w9 X o9 N- J/ v8 y.area 0x8: N3 U3 d; l) W7 w8 n3 i# o
byte 0x5,0x6,0x7,0x8
$ V3 G& w1 g, A% c7 k.endarea5 O2 ^% [3 C1 J5 W; t
' {- t1 f M7 y8 a& t' v8 V
.align函数
5 U2 ?' E9 g6 k/ i5 {/ S2 B3 X5 w, {. g格式:.align num. c- t& C. f3 c0 v `
说明:写零字节,num为零字节数量,用16进制表示。
; w0 C- F5 c/ T5 ]8 K g& E$ J6 Z- W( P! J7 ^1 @' }# @
.pool函数" P- P, O9 J5 p+ n5 d" A2 }/ m& n* P
格式:.pool
: s3 C- J6 t* o+ F v6 G- O说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
: C( m, |' c1 M: [. X& ~ b例子:4 p: ^; o% T1 M2 J7 x) e9 J) Y
ldr r0,=0x12345678;; f6 s/ U3 p1 R* b
....2 Z+ v( e) S; V$ @
.pool8 t9 l+ X6 F9 l1 q1 W# `
: {& O. c+ h- a
.fill函数
: b u8 T6 e3 U7 \格式:4 d3 y3 M' }$ D. I
.fill length[,value]
+ ~( O0 i" `2 u6 ]0 f5 Fdefs length[,value]' `1 ]& N" ?: K5 g
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。9 K c4 z) M& e) A6 e1 r
1 o& t" A& j. @9 @8 B/ L.skip函数:3 ^" u- W, W# `- }" d
格式:.skip length( n. M2 l+ f. a2 |. d
说明:跳过指定长度单字节数值,length用16进制表示。
9 f' M" ?4 W& N5 k5 \
6 Q7 X+ Z6 R# c7 F6 r; @写单字节:
1 I# @+ F( @9 f: M5 T.byte value[,...]
* F$ J% \% w6 g: T: R+ d: x# F& a.db value[,...]
' d4 d( `3 ]: Y3 [: P/ b8 R.ascii value[,...]
. E( x7 H9 Z) i0 {0 T.asciiz value[,...]
) Q% S7 y" k. ?7 Vdcb value[,...]
- _1 S( P% d! ]7 w0 O1 S0 ?% N. F, g5 K W5 w
写双字节:0 b+ b; Y/ Y ]5 w6 n8 P! M
.halfword value[,...]
$ X! o& A2 |7 L4 ?* m.dh value[,...]( d7 p; p9 e I8 S
dcw value[,...]
c( A3 Z# x' r
. G4 ^: M* u1 \- Q- F: }+ q3 l写四字节:6 D% r" `, h1 ]( [/ W6 @
.word value[,...]" M- H8 B& X. k* j4 y; `* M
.dw value[,...]
1 A9 _5 ]" m3 J/ g8 k2 bdcd value[,...]. X; Q% a9 u% |
! X- [7 j9 @) @3 Z- q. b0 l# m
写doublewords:
( B3 T( O( K2 ?* k+ W1 e" Y.doubleword value[,...]6 f! j+ G! r1 j5 L* d
.dd value[,...]
' p5 s! V4 J0 a% E# Zdcq value[,...]
; l) H4 y( L3 i6 @) m* P+ o8 R# b- _) |; T* h
写浮点数:
( R R( H6 _) S' ^, X$ s% K1 _. @0 R.float value[,...]
6 ^& C$ G, `" Q+ r.double value[,...]& A! f, r2 Q6 e- ] K! ^
- m! E) q1 X+ X6 \2 FARM的ARM模式和THUMB模式定义:
7 d, d4 W* m a4 h.arm|ARM模式
; B$ a) I y$ X9 N0 h; n.thumb|thumb模式% _' x3 `/ E' H# ]1 h8 V4 F* ?, n
+ G$ F- t7 I0 T) [
设置架构:
" N* V4 u/ N5 C0 l% w* O1 d2 `.psx|PlayStation 1(MIPS R3000)4 W; I$ N* M9 F2 C1 @6 E8 q ~; K, [
.ps2|PlayStation 2(EmotionEngine)
. x+ e8 M4 _! _6 ^+ Z& Z9 M.psp|PlayStation Portable(Allegrex)
- Q* {- g# N' N- G! ^ A.n64|Nintendo 64(MIPS R4000)
, D) F% k" ?& R1 X.rsp|Nintendo 64(RSP)
+ `6 a. @4 C- u) j# X& d3 Y.gba|GameBoy Advance(ARM7,默认是thumb模式)
% Q( T# I5 G6 m d* u.nds|Nintendo DS(ARM9,默认是ARM模式)" ^% ~0 ]- _0 ~2 w1 l8 t, z3 T% H
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)5 _/ C9 W* g8 r+ ?$ k; M0 t
.arm.big|& N& S& V" |4 c1 G& W( Q& \
.arm.little|
7 z4 c: M! |6 Y2 t3 p4 Q2 ~" I. }; L
3 K8 D! B7 @1 E) x$ r常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
6 R) h9 ^$ f4 D5 y# E: a |
|