签到天数: 1865 天 [LV.Master]伴坛终老
|
5 y6 U; ]5 s" c2 O4 ]% ]% b" I! iARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000. G4 X' A9 o7 K9 }& I8 k5 _
) K$ H! h" `+ T( qARMIPS assembler作者是Kingcom,目前发展到0.9版本
" g! j: R6 A) _! z( ~% d9 V2 Y- b. }7 @
Kingcom's website:http://aerie.wingdreams.net
2 X+ D3 z7 N$ x0 Q( {; Q4 V7 v7 u5 Z( H; s" S/ L
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
- M( u. e+ j4 e- R' ?
7 M8 t) p6 M" c- k: [更新版本可去http://buildbot.orphis.net/armips获得6 Z2 e4 d& k& [* ]
: x" h) W+ ?# m! Q9 X* [ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。' N( h. j) P# G5 _8 i) E
0 m, o- ^6 c- F' K4 ]5 y
ARMIPS命令行用法:
6 U, B$ ]$ r( X8 c. m8 @ l
7 n5 R0 j* \* I% ~( |5 W1 {% JUsage: armips [optional parameters] <FILE>
9 |! X; ]4 J( ?5 u( | u0 K a* B& C8 Z! h7 a% N4 w. ^
Optional parameters:
) I! E7 ?$ \" W -temp <TEMP> Output temporary assembly data to <TEMP> file
% F: N- N8 K) A -sym <SYM> Output symbol data in the sym format to <SYM> file
7 a! |5 `. P" \. n+ j -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
3 j& |8 Z/ X8 C# t( ~0 K4 z' p3 ] -root <ROOT> Use <ROOT> as working directory during execution
( q$ \2 S4 N. |7 G* W -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
: w" Q& d4 L0 a% W4 z% u -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
: N- q; s' W+ k" G+ v- n! `) S: ` -erroronwarning Treat all warnings like errors) V F* n! U" |" e; x! i
, H, N0 l7 {# D. P
File arguments:0 o3 A7 C, l3 l6 z
<FILE> Main assembly code file' q) r' g; m) J$ S" ?3 C o
% e p+ j0 Q0 q9 G-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件4 X+ ?8 \( d+ g$ {$ j
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
: `) \5 `" k$ j: O+ [% g-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp( f4 t: Y. k& J5 m' h
-root <ROOT>参数是指定执行期间要使用的工作目录
- N7 R n' v- B6 {9 m( O-equ <NAME> <VAL>参数用法不明
. X* O( `: t# K-strequ <NAME> <VAL>参数用法不明
" r: a& M" _- w' {- z0 F-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
0 Q4 ^: u' Q) P0 o- |
2 v* V& l! a( k2 T<FILE>是汇编代码文件,可用记事本之类编辑) P+ |/ s4 U! R) }% `2 c
, x" k4 v( W, ?( r! s, o: w* H注释说明:
% a% E. q# _& M2 e% @ z注释可在单行指令后面“;”和“//”添加& G) [7 U J2 i7 l
“/* */”式也接受9 g" X/ S9 g B0 l6 V% b
' M+ s, |0 X, B, q$ f例子:
' O9 a' n9 D( a.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000( L Z( `1 V9 G1 {/ q7 Z
g1 o& w* s9 q.close;/*关闭文件*/
9 C5 O% P1 Z# g1 N
c& b( J5 _- L5 K: T z标签说明:
5 }% }4 Z- z. v- t. A% J/ S标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
; k1 v, C$ N0 ]' q
4 Q; x1 m3 {. b# v# G9 C数值说明:' r) I8 ^9 R2 g7 u! J/ \8 T* n
“0xA”和“0Ah”是16进制数值
; {6 G) X2 y# V: s% D6 \“0o12”和“12o”是8进制数值
- Q& ]% c' C4 p l3 l5 y“1010b”和“0b1010”是2进制数值' ]0 ~5 @5 G' H
# B$ ^# ^3 o6 g/ {# z e
equ说明:4 d2 S* c/ v; |' _( Z8 c! p+ K
格式:text equ value& O( K/ j4 Y! N: l
说明:用一个text代替value8 N2 |( s4 c E
例子:
3 O# p; H* D' n& n; D: \& o! V/ uaddress1 equ 0x12345678
- e( h# Z! G" h& @ O0 Fldr r0,=address1 J' N; X. v3 T% ^/ ~' {/ H
.pool
Y k2 I% G7 ?
2 h* B8 k1 `/ W6 I# X, [2 z函数说明:$ `# D" o, ~+ {( t
5 N C% e/ e2 \ J6 G( D0 K' F: L.open函数:
' i' j/ }! [6 v格式:
3 }+ E% h4 k6 @, I1 b.open "ROM FileName",offset& `- I$ R/ l. ~7 ^4 h5 [! Z
.open "Old FileName","New FileName",offset
2 g+ f2 }9 |3 t& @: w1 ^说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
/ D/ l4 m% q9 g, w1 Y! W
( {% W; A$ p6 Z( u6 w$ j F例子:
. k1 j3 u5 {9 F# [" I1 S.open "1234.gba",0x08000000/ f% J1 I! l0 G+ F; d {, J
8 c; a. d( x2 X. p
.close函数和.closefile函数:5 m3 t/ V) T6 _( Z2 d
格式:
8 k, O7 x! Y; R% t6 n4 g* W.close2 Z3 V7 j* j/ u
.closefile
5 R/ w& z& K+ F( P8 {1 W0 y) C3 t说明:关闭文件。; Y1 U9 x7 m( a5 A/ b
6 I6 P! ]$ K" f4 N
.org函数和.orga函数:
; k: }2 K; e( x: d, `格式:
& u( p& ` [3 x- b7 }7 Q2 R.org RamAddress) n2 Y3 o+ E# w# m
.orga FileAddress
# T9 m7 m2 b' O; }说明:. E! v* Z7 F' f/ J5 ~5 ]$ d' m
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
: g! b+ N6 } {, P( `# {% P+ o! `% b: S9 M7 \ \. Y N" ^
.orga函数可指定ROM文件的输出地址。* C& @" T( f- ?
7 b& V7 c7 e# v+ D# v. M1 c
.create函数和.createfile函数+ a6 `7 `2 A h' z1 M4 k1 \# y: l* Q
格式:, T2 @, c& }% ]$ V
.create "FileName",offset( \2 U, D# A& \6 k4 Q& F
.createfile "FileName",offset1 C+ a: ?5 O: O; ~8 o( {
说明:创建一个文件,如果文件是存在,他会覆盖掉。( e: t# h! k, K$ E/ y
5 d- b; _4 [. O$ Z* G& ~
.area函数
( U# P- G& x! A格式:! r. }6 s* V( E# E+ ^. @; G# |) z3 v
.area SizeEquation[,fill]
" U" ~2 i9 ]* d; k4 n+ A' E, L) L.endarea) j# m1 T- @3 x0 q- c; F4 a
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败% f: l2 D2 K7 v8 z& ]. i2 H
( h' D6 [5 a, k4 N% R# ^- }4 q例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据3 _ \9 Y+ |* t# ? @, y
org 0x100' |3 J" M5 X& L s2 }- k5 U
.area 0x8; ?! b4 k; u- f, c
byte 0x5,0x6,0x7,0x8) k1 W( d) B! B9 Z$ @ C
.endarea
* u8 d0 W2 l3 `1 c2 b9 ` m" P1 k( N' s, ~/ v" l# ~% w
.align函数. p4 L# j1 u* A2 ~; P, s2 Y" r6 E
格式:.align num
" ^" W' H. F1 ~+ D8 p2 C说明:写零字节,num为零字节数量,用16进制表示。& @( F! z m+ h7 Z2 Y
! h+ Z0 l' ^" n9 G I( P.pool函数6 C. f; q) |6 x* I3 h: |
格式:.pool3 v& {9 }. ]9 S" {! B9 \
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
' U4 V+ ^( S3 ]5 P, ?: |* G例子:
( h/ q8 A4 z* g5 Q3 sldr r0,=0x12345678;
3 x `8 i0 }: |& }....# {0 A1 O5 _ f8 U3 i
.pool3 k+ Y1 W& I+ ?3 _- Y8 ?' Y
5 E! ~. E0 K4 q* o$ f5 p
.fill函数+ h; `7 F$ V% t/ Z
格式:
+ g5 [. ^ h: i; s* A6 {6 @ b.fill length[,value]3 W. D( r. x! Z+ D! N$ K6 S4 S
defs length[,value]
% T1 C9 r+ l" u- d( Y说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。% e2 z% V3 o+ H' }' z
9 Q& X8 C$ y9 P2 Y- d- Z; G! O
.skip函数:) c, n8 ^: O1 M( v8 ]
格式:.skip length! c0 i& @0 @. f) @6 m
说明:跳过指定长度单字节数值,length用16进制表示。. E* e# _" ^& R" g
! k. Z7 j3 K) O J3 p, E/ f4 B写单字节:$ R: l3 Q* y; O. v( z
.byte value[,...]
( G/ i! o( X* S2 N0 `+ K5 q.db value[,...]
% q* x" |$ e' ?4 U3 U: R.ascii value[,...]
8 S2 o0 g7 K7 t7 d1 {.asciiz value[,...]
* S s6 v2 A1 y& idcb value[,...]
* f1 h! Q& J5 J8 ^0 n, \) r1 i; O C3 m* G, U
写双字节:/ ~ ^8 W% R. P( ]' _3 K3 ?
.halfword value[,...]
h, R0 `8 j% w3 x8 o.dh value[,...]1 ~: ?( G) y. j- u3 w
dcw value[,...]9 n: ~ {; q& S: a: a
0 q& ~3 e+ i( |4 D0 p5 Q& k写四字节:3 |9 T4 B+ V1 M3 ]8 K l$ I
.word value[,...]( L1 D4 k# u3 p. T- j! r
.dw value[,...]5 O- [2 {. Z, F3 V
dcd value[,...]# n, c" w$ r$ |; _2 y9 Q' T
; w' H& ]: B+ u, X$ {" S S
写doublewords:
) t$ U. M( o' P0 g# F% m5 `$ g8 q* k. y.doubleword value[,...]- @( L8 t$ y* K! S, _
.dd value[,...]4 W5 r! f* B) I0 l$ ~7 D
dcq value[,...]
# x% \1 O6 v) }1 w
! L) U! }3 z5 i! X8 \0 N: I写浮点数:
# C1 s1 j: E8 Z) c; F4 u.float value[,...]
( j3 n+ S( \3 z5 Z4 |9 v2 q.double value[,...]
( t2 z/ ?; P& K, X0 e) p, h. v" T& ^8 H9 A
ARM的ARM模式和THUMB模式定义:: ^5 N: @; D4 E9 }! l" O) }
.arm|ARM模式9 }9 p+ H" k& ?! o
.thumb|thumb模式, A* {$ ~, Z& i
' A: H- O7 v* ]. F' v2 R4 c5 t
设置架构:
8 \! o2 r5 S6 x( |- U& a8 O.psx|PlayStation 1(MIPS R3000)
1 c8 H! G R" Q0 W0 E% k. w# n.ps2|PlayStation 2(EmotionEngine), E5 T2 \: F b4 M
.psp|PlayStation Portable(Allegrex); ~2 }8 p4 p7 i8 f$ d9 `2 i9 u
.n64|Nintendo 64(MIPS R4000)
' p2 A# G+ T8 ^; z) B* `+ {( v4 \.rsp|Nintendo 64(RSP). g- K% [7 S! x# u8 z9 }
.gba|GameBoy Advance(ARM7,默认是thumb模式)5 C' H- K" c' m( `
.nds|Nintendo DS(ARM9,默认是ARM模式)' L# Y$ `4 C( G3 S% [: w7 Z, Z0 |1 W
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)0 R/ Q0 Q# j/ @7 x' E5 H! u% D
.arm.big|
, ~- ~/ e# Y* }+ n! k. h( ^+ A.arm.little|
! |2 v$ D$ Q; q. E! i ]) E6 G) t- I$ [
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。2 u1 j* m, k" m
|
|