签到天数: 2172 天 [LV.Master]伴坛终老
|
3 x0 W! e T# a7 K+ a
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000) w( A P% k0 @' u8 R
( A/ p" G/ i% ], @$ }+ q p9 w8 G
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
6 Q* l4 v0 t% S& c$ U f$ e: W$ X: K" F! \; ]6 F
Kingcom's website:http://aerie.wingdreams.net
8 X9 I2 k! f) z7 Z1 Y* o) V( f$ J# f" x6 y! ]* `
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
9 w; X1 y D5 V. J# k' r8 G
; m% a: T9 N% {: d) Z更新版本可去http://buildbot.orphis.net/armips获得1 |0 X9 Q- C* N2 M
' M8 n1 C! Y4 I* |- x& F" i
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
& ~( K0 l ^" [" @( B7 c& h* f% {/ g2 L9 _
ARMIPS命令行用法:
; u! d! ~. z( y0 h! S2 D. R
. M$ D9 X3 y2 F6 z' s4 O' c; IUsage: armips [optional parameters] <FILE>3 E" Q9 ?3 x# o0 b' n
; Z' l5 G6 C$ e' d' bOptional parameters:5 L8 J9 n* z3 I/ s& j7 U! x
-temp <TEMP> Output temporary assembly data to <TEMP> file$ n" Z, |+ l; d, K% I& M. {
-sym <SYM> Output symbol data in the sym format to <SYM> file# R4 G3 y0 ^6 E/ b7 H G
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
# p" L1 P2 Z+ g -root <ROOT> Use <ROOT> as working directory during execution5 Q! J* E( V }
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
+ d4 X) s. v$ Y1 X -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
. {# j: u7 T& J3 K! l% F' A -erroronwarning Treat all warnings like errors
1 j( W) E7 |' p+ w/ }' r7 ^& h
3 _- d6 W% t* a+ x' ]" A: {% h* kFile arguments:9 {) [6 J; I. M+ E/ m3 F8 r/ A2 p5 N1 S
<FILE> Main assembly code file5 U( m- `* j/ R8 h; P: q
. {* L4 w8 v/ @3 ~2 V-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件; g: ]% Z: _' v8 _ k& X% s; E
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
, o. N8 {% ?* n-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
* |1 Z& P3 F& d: _" p1 Z" I-root <ROOT>参数是指定执行期间要使用的工作目录
- S ~- Y! z- `0 { w& @2 K; U4 B4 m-equ <NAME> <VAL>参数用法不明
5 K1 S$ R* {2 T& e% T. }1 u+ x' U-strequ <NAME> <VAL>参数用法不明
! T6 t5 E& ^8 v% S-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译6 d& | M( N# ]& Z8 o+ C- R5 r
' k. w7 l: a5 o/ r* w, a<FILE>是汇编代码文件,可用记事本之类编辑- H% e; x: \: t. a
0 D+ f9 E3 x* R% G) N9 Y) J注释说明:4 q& x2 e' T$ _/ D1 o7 E! w5 }* [
注释可在单行指令后面“;”和“//”添加% s0 J5 K( K4 _4 { d
“/* */”式也接受
( _! A" K# K- U8 m8 P2 H) q1 y/ @' i8 b
例子:; |7 A: p, O+ x
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
6 S4 `' f8 p% \+ U! d& g
5 t: B1 C+ P0 t.close;/*关闭文件*/% o3 E! _6 K' _- m' @
# X/ }# q7 L; d/ g( B: u$ t
标签说明:
7 E+ O3 i6 {; v) Q5 m标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
, s& \3 M: w7 K3 o5 J3 w. ^5 J" o$ u6 \' Y& l. d
数值说明:! J/ k- t2 T7 h0 e! b: V
“0xA”和“0Ah”是16进制数值
# |/ s) I/ o5 H9 x“0o12”和“12o”是8进制数值
# n/ ^8 c1 A8 w- u6 [“1010b”和“0b1010”是2进制数值
1 u1 O1 c! D+ z6 G/ _$ I
" R e0 N: _7 Uequ说明:) j* j' ]& ~3 b! X
格式:text equ value
) c+ ]$ P8 `& N0 Z" Z8 p1 K- {( ^说明:用一个text代替value
+ M; A& D( ^ C, X例子:
5 F4 M! Z7 t* qaddress1 equ 0x123456787 O! h" r- J* w
ldr r0,=address1( E; h% g. z+ V& j, n% _1 H
.pool
6 o5 i; F/ ~; f( O0 B
' j$ a6 L7 T- _1 q/ r5 ?函数说明:2 e0 k( x" a4 i! J! I0 v, w
2 U- a4 N9 i, {4 D) h3 `
.open函数:
& s# a. o0 ^9 f+ N1 f5 H3 _格式:9 V4 |% ]& o- Q/ m
.open "ROM FileName",offset
5 @# p, z7 M. x, W- c0 M C8 Z. D.open "Old FileName","New FileName",offset
1 H& N& w; p# Y6 V0 r- `( M. L0 D' }说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。% e- C! Z) q6 J5 h4 [2 p" }+ K, c
$ D6 f+ W0 D$ ?. F' j' r- [
例子:4 O4 P5 K1 j" G. K' \
.open "1234.gba",0x08000000, r. U/ a) i: a: q/ M- k/ s8 t0 }
( e& s' z- M4 _+ V s
.close函数和.closefile函数:: q/ u( d; K( I: B$ s% D' n( t7 P6 {
格式:6 w, r$ |2 b/ [
.close. q4 H; F& f" e. z
.closefile
1 w" U* _! ?1 b0 B M; U说明:关闭文件。
- W$ ]6 g# ?9 Z2 h" M6 M4 O. r1 n0 j* `) J% _! Y' [
.org函数和.orga函数:
* [ [3 \) e& O格式:' E5 ]2 w: p7 t D4 |
.org RamAddress
% r) _6 s) Z! u, D) A.orga FileAddress
9 z' Z3 i) w# C# C: \% a1 t0 R说明:
) k8 r6 M l' V, N8 }前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。; T. J6 E! M8 g% S' I
2 N) w3 k$ y* \6 n' c
.orga函数可指定ROM文件的输出地址。: B: M# m7 }. {* P* {
! S) K8 @3 q( S6 v5 Q2 k
.create函数和.createfile函数
& `+ A6 T) H$ B- ?格式:
: @% g$ J! _) p.create "FileName",offset
7 W0 H2 u/ }: X: c7 v+ [6 o2 J.createfile "FileName",offset
) a1 y f7 ~) M" |. x0 Y8 s说明:创建一个文件,如果文件是存在,他会覆盖掉。8 P2 P! d# C' n/ s" M" _6 ~, ?6 O
! c1 T8 E/ W' F
.area函数
" {/ d. i( D7 [ _! k/ W格式:3 z. w! m7 x6 ^1 B0 T! {
.area SizeEquation[,fill]# `2 k, P, c1 N9 @1 x
.endarea5 c8 Q6 ^. \/ p% v# p) V8 M% y
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
! v( j" b8 {) A! @4 y- i7 R2 C; X0 ~
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
! k5 R4 S& L7 r% Y$ s2 d% k' Y) o" borg 0x1004 |% z2 p5 i1 R/ _
.area 0x8
% K" y7 Y+ ]9 Sbyte 0x5,0x6,0x7,0x8- Z! d# h1 d2 G
.endarea4 Y$ k# h2 c: C0 v, N& O
, w; @9 }1 Y# \2 u.align函数2 K q( c0 p* K' B3 o% U
格式:.align num0 g9 V# s7 g& i9 n6 ^. T
说明:写零字节,num为零字节数量,用16进制表示。2 B% O) {# M# t' v5 A* R' s
1 s' E* l0 }" h7 A+ A.pool函数3 k$ U1 ^/ H# v
格式:.pool
: ^; U3 [" d/ c6 u, _9 T说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。9 J1 ~8 V3 J! H3 F. ~ N8 y$ c
例子:: z9 l2 G% g+ s/ w) N( d2 h: Z# c+ C
ldr r0,=0x12345678;
$ \0 h, ^! a. `6 K5 L1 ^....0 r% u. {5 ]* g% S2 t
.pool
( M, o/ ]4 z; a: h v& C; R' T/ K9 u9 a" J# f. g
.fill函数
1 B$ `7 v0 N0 Z# A3 H格式:
+ C) p, E+ c; _9 q N+ x) r3 b.fill length[,value]8 Y; J) Z- R' m3 n1 }$ w
defs length[,value]
% N6 L h6 a% m( ]+ K说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。% H2 {2 X2 m$ U2 p5 l$ @9 E
4 s' q. M7 u5 T- G3 S" \% E.skip函数:( {3 D D! g* S, U1 f& n9 y
格式:.skip length
: P% L1 e. o# M- s4 ]说明:跳过指定长度单字节数值,length用16进制表示。
: n* @% a, {. L* n* y6 |; d2 C$ ~' @7 C: r: n B6 v) ?- f
写单字节:
' t- X. D; J- \.byte value[,...]; f2 ?$ }6 C- H# f# Y
.db value[,...]
+ U3 O6 I3 D+ {. n J.ascii value[,...]9 |0 ^* M2 @4 ^8 Y9 N
.asciiz value[,...], w6 P+ ^& a9 v2 _; Z% Y
dcb value[,...]* T2 V0 f9 z- J4 w
# g4 h% Q9 n- R ~% ^
写双字节:
5 o7 s" Z* |) E4 S. [- N/ c+ R.halfword value[,...]
/ O1 X. x/ r1 e6 o# Q. Y% ^.dh value[,...]! b: O8 l: G3 X- s
dcw value[,...]0 Q& b3 T- w) j
! ~+ n1 V' L$ p& V写四字节:2 E" }" Q s h s% y: s
.word value[,...]4 z& V) g& m% |3 i
.dw value[,...]
/ r( K/ u# e* f8 U& Idcd value[,...]
( I8 e: B# n2 y3 y; f& _' e5 v- V9 h- D0 Y
写doublewords:4 K; d7 f/ p! H7 b4 w8 P+ K
.doubleword value[,...]* P; J% t# A" K' k0 m
.dd value[,...]* U Y3 O) Q! L/ a6 z* C+ a( w
dcq value[,...] k$ H# C$ M* x/ M; d$ P+ ~5 i
, c( _7 z8 W$ f* S& x) u0 g写浮点数:
2 W2 _* m7 V$ J. c7 k8 h" J8 G.float value[,...]" _2 s- l$ g2 L7 N. p3 H
.double value[,...]
! `( Q/ e- J7 @
0 W) _; C8 n; o8 k6 `ARM的ARM模式和THUMB模式定义:' h' V" H: e/ N2 A; |; O
.arm|ARM模式
3 o% U1 ~9 X0 x. \& J2 @8 `.thumb|thumb模式
; t, X$ E' @0 B x* k8 O4 u& t2 j9 \' J9 _
设置架构:+ m& N: \* Y* m) q
.psx|PlayStation 1(MIPS R3000)8 g! j$ o. D0 a# d: I' K
.ps2|PlayStation 2(EmotionEngine)
: V, W( v n3 `$ j" Y5 W, G# Y.psp|PlayStation Portable(Allegrex)+ m9 L9 N: ?+ f/ B s. f
.n64|Nintendo 64(MIPS R4000)
9 c( j/ r2 w+ r: K6 N$ h# Y' X! G.rsp|Nintendo 64(RSP)& K' e9 f3 C) ^+ \" [; p
.gba|GameBoy Advance(ARM7,默认是thumb模式)
3 l0 u5 g' b8 C$ a! P! E% ?.nds|Nintendo DS(ARM9,默认是ARM模式)
. \/ S7 c2 `+ c" z& f.3ds|Nintendo 3DS(ARM11,默认是ARM模式)* m+ c, ?: y/ u+ K7 ~
.arm.big|
( n# r3 o+ K( }3 |7 |.arm.little|! j2 d8 [3 V. f
2 H9 C! w1 n( b+ E* ?
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。+ Q% u, v9 ]8 {! R; e1 s! ^! H
|
|