签到天数: 1865 天 [LV.Master]伴坛终老
|
3 z( w3 m: A+ N/ e6 z! i) F
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
( m7 e9 U/ c: m) T) G9 u4 q2 y1 U2 u+ F( _& [6 C& n
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
2 k# u3 Y, E! t/ l- s7 e- h) y6 J/ V( ]$ v9 M" ~* K+ {7 ]0 Y- @" N$ e
Kingcom's website:http://aerie.wingdreams.net
7 b3 v9 W0 K/ Z0 f& Z" D# `
1 w8 _' F% B" t8 I& nARMIPS assembler源代码可去https://github.com/Kingcom/armips获得/ l8 `+ ]4 r7 G m0 V0 ?
' H$ I+ C% s& n
更新版本可去http://buildbot.orphis.net/armips获得
7 m8 n T* O( x9 B
" E. x9 w( w- g1 M+ ]ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。9 e/ }$ {9 f7 R, L
- A1 u5 v( T: D% W. u" aARMIPS命令行用法:8 N. P- P! T: j! D% C2 Q" p+ E6 d( T
% c: w* S$ C; ? O7 B; a" X/ I
Usage: armips [optional parameters] <FILE>
8 x! r6 P* Y* e: O) R. S: y* Q" K$ }" [; o; Z0 n# c
Optional parameters:
' _, `$ }7 \, Q/ N) E9 Q) ~7 C -temp <TEMP> Output temporary assembly data to <TEMP> file$ ?+ W/ x- P0 H) ^4 B& h( f; g
-sym <SYM> Output symbol data in the sym format to <SYM> file" k; X; Y& Q' N5 n/ [
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
/ m* S+ J& d/ `! x9 G- u6 x$ r -root <ROOT> Use <ROOT> as working directory during execution2 K" h1 z1 s0 t4 U4 R) Z5 X. u8 [0 ~
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code5 L' V. `/ R% @/ `4 ]
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code; l4 b4 a! {. w5 X0 t
-erroronwarning Treat all warnings like errors% }0 q* n# C. O }& w$ ]% D$ M
. {9 k: U! {0 [File arguments:) c. |' A: T a0 M! O
<FILE> Main assembly code file% j6 {# P P9 v* k
' c1 p& G c3 g) f/ P3 g1 `. y
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件1 i7 {# |$ g% R- o9 s' r1 f
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
- _( k+ C+ X) a-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
7 o. t- Y/ T5 d0 Q+ P-root <ROOT>参数是指定执行期间要使用的工作目录
/ v3 u4 t( k7 p' [4 N-equ <NAME> <VAL>参数用法不明+ ~1 |8 ^8 `' z3 k
-strequ <NAME> <VAL>参数用法不明
; w' F z/ l+ A-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译* ?/ g8 P2 M& w2 ]$ m2 |
8 k n3 l; N6 [8 H( l<FILE>是汇编代码文件,可用记事本之类编辑
1 r1 s( l7 l8 P# P: k0 f5 j8 H- R0 \- {6 f. w& v
注释说明:
: u+ w5 a0 ?" ^3 t注释可在单行指令后面“;”和“//”添加* ^- t4 l. F6 _( J9 O; \
“/* */”式也接受
) ^( {: u4 F+ Y- g. @8 u- ~0 ^7 U2 ]) H d" z' @
例子: S( r1 g$ ^5 n# C5 u/ V
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
" D& b. U: r% Z+ M& A/ O' X+ r* I& B! R1 d2 }4 T# ^4 o# @1 J
.close;/*关闭文件*/9 q( N0 c: O, \0 p9 @ O( v
4 m& r- @/ e# ?
标签说明:
( Z0 {: p3 J6 Y- ?( p. H) z; ?标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
/ g! Y9 s/ u3 a) k- e. ^
* b9 J. b" N' R. T$ w" e+ U1 x% E数值说明:
, F* z6 h* h* \" d" W“0xA”和“0Ah”是16进制数值: Z/ `% B9 `/ y' h) i/ L
“0o12”和“12o”是8进制数值& c# ^) X# D6 o! z2 G p! B' S* G
“1010b”和“0b1010”是2进制数值
: n& ]* S4 g- I# k0 z& M+ ]
, H9 W* ~3 I+ j9 j6 N4 A0 nequ说明:
8 M' z; g& t9 H0 U格式:text equ value
1 d3 E" M2 K& I6 Y说明:用一个text代替value
+ o# y. y. C/ E例子:
* N' y/ U' e5 @+ Faddress1 equ 0x123456781 R8 W6 D. I2 k
ldr r0,=address17 y# z- C# F$ T( h0 _0 v
.pool
+ w3 L) P+ I* S8 n3 h1 Z: H9 l% v3 o6 E& N* a* T: P& m
函数说明:# W, d! k& b- G( ]; F; W
7 I% J9 k5 r6 s w# _
.open函数:. H2 B5 {8 O* l" ^ x- I0 {
格式:
0 \. T! ~4 ?0 Y.open "ROM FileName",offset
- M- E0 r( J1 ^.open "Old FileName","New FileName",offset& C. E; C* ~7 Y+ i
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
) O$ i" v2 ^2 h. z3 q' v
; ]+ {8 l" J- z例子:3 V5 E6 W& @- t
.open "1234.gba",0x08000000
z' S0 d+ ~% x. i. n) H& s! V& t+ {& n' t+ l
.close函数和.closefile函数:4 X0 E) s- N' D, u: y3 z2 S; E
格式:
+ h3 D' v/ J% O- R! D.close
: p( h1 H+ m% X) { b.closefile
9 A Z: c& z, _- d1 ?' Y0 i, u& s说明:关闭文件。' ^/ M9 L/ J& ?
: y1 \2 @# X9 Z# ]) F
.org函数和.orga函数:
e# o3 n* x+ l' I格式:' D* `( W) D' L
.org RamAddress
& S5 \# W2 E; I2 U.orga FileAddress
: P5 S- j5 e# i$ g4 x4 G0 H8 W说明:
8 g% v( ^) r5 `$ O前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。% r7 }' W3 Y H7 m4 f- N& ]
# v1 A3 F( W; i Y* _/ o* E
.orga函数可指定ROM文件的输出地址。
$ n% |0 {6 m3 `, M2 U F. ~
1 q1 X) T+ D6 _.create函数和.createfile函数, N1 K+ ?$ L/ ?7 a
格式:* {5 t" |: x; G; r6 S
.create "FileName",offset' ?8 B. r* ~, p: ]8 g: L
.createfile "FileName",offset0 j% L# |( {8 k O1 e7 t2 w
说明:创建一个文件,如果文件是存在,他会覆盖掉。8 U) y9 q5 D' g& X
5 _0 l& Q) p/ ?2 Y4 T" E
.area函数
3 g2 N* n. U8 Z9 {8 b格式:% I' s# d" \5 P- b
.area SizeEquation[,fill]
2 |2 i: v( k" U2 `.endarea: t& W9 m4 o [! }' b: U, d
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败0 v: B' y* f7 O( I2 F; K' q5 D
) o, n& D, s- N% E5 b& R$ X1 O% C
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
$ z. o3 i( N5 `org 0x100# T; }1 s/ ^) e) Q3 U
.area 0x8
/ E I J4 |$ {) hbyte 0x5,0x6,0x7,0x8. `/ B* ~- m: I B& B
.endarea3 u/ D8 i) }; x4 ^7 ^
6 C/ _1 ^0 r& B+ K% l3 q
.align函数# |0 Y6 |4 Z( v& R
格式:.align num: n- B' F& z) t$ R% x
说明:写零字节,num为零字节数量,用16进制表示。- p' e) L* C* v1 U. d
: X# L L3 {% E% m" g/ U3 ?, H4 A# E.pool函数- k9 l3 M6 w/ s2 g' C) U
格式:.pool* e3 v Z% M) m+ t1 e
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。/ v% Q1 v' ?7 a4 I% w; w& @' W4 }3 u' o& y
例子:
" y, m. _& Y. Wldr r0,=0x12345678;
- p0 G8 \$ F; c) H5 C. X% w....
n$ }& R4 G% U5 B0 ].pool
7 }* H8 D0 \5 T5 ]2 N# D" b; F, x8 ^' z% e& u7 _
.fill函数& I' f e8 U0 \7 f0 w7 t, e4 Q
格式:9 `' ] c5 I6 Y- @$ o
.fill length[,value]
, V. f, n3 t* j) u C, gdefs length[,value]
& I! U j/ @$ f- l2 H. d% L2 U说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。# [ c6 |* }+ s! t: s
/ e; t1 u0 }: F, W9 ]9 Z% b.skip函数:' U9 R" k% R8 }- \7 G# o
格式:.skip length
5 G9 Q$ d( x5 R' o" z$ }说明:跳过指定长度单字节数值,length用16进制表示。
8 y' A' S1 I" R" N2 \9 L9 k
7 D" ]- x7 m, C4 ?% S3 |写单字节:% [1 ]+ l5 p+ S$ T
.byte value[,...]% [8 j2 M* d x! ]1 z! V8 X: V6 O- x
.db value[,...]3 e8 g) Y8 ~% f7 L& f% w/ y
.ascii value[,...]/ a4 V# z4 U( I* ^0 E
.asciiz value[,...]
n+ m# e' L" E2 L5 b; A, idcb value[,...]
, p3 [! A l. r! ]& j4 }1 K0 ~# `7 a2 b+ R
写双字节:% @) V. v U! |' k3 R1 R. S
.halfword value[,...]
8 L; M# N$ o* s1 c" I$ P5 I.dh value[,...]
4 P" ^) ^* `+ X4 P. Cdcw value[,...]% ~$ h: I; z) p: k& e& v
& K. r2 A7 U: g( m3 B写四字节:
7 I ~! F3 l* U.word value[,...]! c. p" B$ I: a4 T! C) L# e, p4 w* b
.dw value[,...]
$ {0 A! n% P' v: Mdcd value[,...]
! U# d$ ~- u0 M' f% j
. y4 B! Y) w* W, @8 I写doublewords: J' o9 s; _3 p- w' L8 w* q$ |, N
.doubleword value[,...]+ ]2 ]- }% F! Z/ J; c( o
.dd value[,...]; @2 G. }7 C8 M% q% t
dcq value[,...]% a8 j9 d8 h- r3 \* k1 x8 S j, W5 k
8 M6 J2 T6 V9 f+ v) ^: C6 ~# x! {写浮点数:
5 Q; L f, X9 ~. Q: P' @5 E.float value[,...]
! i( e) R+ S' m* [.double value[,...]
* U0 ^5 H/ R9 z- R- \7 r
: t) U5 _1 X% D( G, M# RARM的ARM模式和THUMB模式定义:
+ O9 V; ?0 @; o7 I, R% }.arm|ARM模式) D, K1 \% k# K/ _
.thumb|thumb模式
8 S& S6 M, B' N1 J2 g" R% _2 i( \9 t6 l! g& |' W
设置架构:
! L! b9 e- z3 V X5 E& k: L; e! O.psx|PlayStation 1(MIPS R3000)
. v7 }/ n; P0 @+ ^.ps2|PlayStation 2(EmotionEngine)
+ `' z2 z3 f5 I* U.psp|PlayStation Portable(Allegrex)
3 l( v( w; d; I2 V& @.n64|Nintendo 64(MIPS R4000). g2 G0 v7 J- n! A
.rsp|Nintendo 64(RSP)
/ g2 ]$ |4 a O" u: M. m.gba|GameBoy Advance(ARM7,默认是thumb模式)+ F# e" t. f) j' O
.nds|Nintendo DS(ARM9,默认是ARM模式); }! F, E3 a& g" i3 N) V
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
7 i% a6 b1 }( {, `7 o' t0 X) h.arm.big|
4 H6 \+ E: Y' I8 ?$ @& L* k1 X.arm.little|
; D# I9 v, f0 [* {
5 f! v5 K6 f1 a( I0 l* O& h常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。- |1 T( w. u' r1 n% g1 G
|
|