签到天数: 2191 天 [LV.Master]伴坛终老
|
3 h3 t! V' C/ @' u6 S! q7 sARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
K: _: C6 ], d$ a3 X6 R9 e0 q5 e4 |# {
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
6 I. O. @* M8 n) u* A7 S- M# @( p" W( r7 w: n0 P
Kingcom's website:http://aerie.wingdreams.net' v, w7 ]! E$ R! b: v$ K
' Y( t/ I w I& P7 M1 M
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得9 Y, l$ Q: l1 C2 |' O# D
7 j" f6 G% ?1 \0 x% F
更新版本可去http://buildbot.orphis.net/armips获得* e+ R% i1 s5 X$ y& c
2 Y5 a0 T( c: | s# F
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
- A( \. w; ]7 a3 G5 Z y) p
3 y. o2 e1 @6 ?. IARMIPS命令行用法:" a) ^/ y6 @- m+ q& g d" j( t
; ~: x3 Q, h7 V) x- O# K1 j$ v
Usage: armips [optional parameters] <FILE>3 f6 K5 v d* _/ N" }5 ~
7 m1 v0 f# W& L& h9 \' D5 bOptional parameters:
# B) @/ u$ {8 \* l -temp <TEMP> Output temporary assembly data to <TEMP> file: m; Z8 Q3 ?2 T* v
-sym <SYM> Output symbol data in the sym format to <SYM> file
3 R/ [5 U; S3 f, q0 b -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
3 i) P, v0 k$ e9 ~6 z5 S -root <ROOT> Use <ROOT> as working directory during execution
8 z2 G% o k( v) o7 @4 V7 t -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code* }4 _6 K9 M8 @; E: L
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code8 Z# W# E ~3 X' p8 k$ A8 X
-erroronwarning Treat all warnings like errors5 F' N, [, E7 F) l2 U1 Z9 K
0 \! u8 } s* fFile arguments:
5 p8 U' B+ \! b! P6 N4 g- E1 n2 b <FILE> Main assembly code file3 E) `5 Z, x- R a" H, ^
; ]) V: `; t. G, a: R0 p-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
, B0 J+ d. O8 s# T, W' y-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba+ j3 \- A& A0 h$ j$ s0 L. A
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp7 `! H! R+ D1 D: U
-root <ROOT>参数是指定执行期间要使用的工作目录( H1 Y2 E/ e/ c4 r0 R9 n+ \. z- B
-equ <NAME> <VAL>参数用法不明
6 Z7 }/ b: ?1 k+ D-strequ <NAME> <VAL>参数用法不明2 p& P2 K2 }6 m( t0 `5 N( F
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译 ]# X) p7 X/ t s) z% ~2 D
, a8 S5 Y6 m& K1 n<FILE>是汇编代码文件,可用记事本之类编辑! p0 P! [0 t( [: G* O* \2 g
; u4 E1 { M7 }& T7 h注释说明:2 i+ V+ { |; f
注释可在单行指令后面“;”和“//”添加/ _, ?$ h8 E( w7 k
“/* */”式也接受7 Z! M. R2 c8 H0 F( B9 f( ~
! O; i" N% o+ R" I1 C" J# m例子:
0 S+ b( _0 Z n. K.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000% P" k, W4 J5 G( A) ~ _9 p
; h' k$ A/ j1 x& P, R" q.close;/*关闭文件*/
0 A1 m3 T ^8 o1 P4 \8 G
$ J g* C% R! T0 \标签说明:! m, m) }, g& v, w
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
0 p; Q- m' O: a+ u
; s# ]+ A' E2 u; \4 A* i数值说明:
6 C& P4 |; t% M! r3 u. u9 ?5 B“0xA”和“0Ah”是16进制数值+ s! g( |0 h! d8 P( D! }
“0o12”和“12o”是8进制数值
\: o$ }, [/ E“1010b”和“0b1010”是2进制数值
' S8 z5 o6 g& s8 K! S7 v2 a6 y J( f4 G6 V5 n- g. e& B1 y) \* B. K
equ说明:$ S4 a$ A# U9 o6 a' R
格式:text equ value
* {. x8 _. ]% q4 ~6 o- z说明:用一个text代替value
! s, j. J8 Z% U$ C& g: }例子: ~ d( c6 U1 [ A! |& I `1 z5 `
address1 equ 0x12345678
# p# Z4 q- z) i s. d+ a+ h6 nldr r0,=address14 {2 q* U9 B5 g! S7 x. D/ Q) [
.pool6 p) U% {( d6 Q, n1 t9 C
1 r* {; x0 | Y( i0 i函数说明:6 Q1 \! d9 V: g( S7 N1 x5 V
6 z$ G R- s, U; K2 Z5 o. k
.open函数:
- r/ I0 S4 `( s" c0 e格式:
1 D0 k/ d e7 t7 F% h.open "ROM FileName",offset
" f o# Y7 v, a6 G.open "Old FileName","New FileName",offset$ L5 I9 V! A' F4 ^$ j) ~
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
0 W u9 w! {" s* B# k( s5 q! A# w' b. c/ R% D( [
例子:
: C6 m g% T9 D) ]3 S* Y.open "1234.gba",0x08000000
v0 l- Q3 J7 L% ]; K5 k6 ^+ Y2 ?; Q+ Z8 d9 V- n9 x
.close函数和.closefile函数:- Z0 _5 a/ U2 a9 n" z' d0 B7 n7 x
格式:
z: z3 I/ w, q2 e5 a.close' Z- i0 E8 y: F# k. h+ |
.closefile
/ s3 s0 x6 h) |6 f+ D说明:关闭文件。& c+ d" V( G- O! a
& x* @1 _0 w4 m! F2 d5 _: K
.org函数和.orga函数:
$ x, z" D: i2 B& t0 Z! [2 _" v7 m格式:
% r3 ?+ U. f8 n. t9 d( P a.org RamAddress X. I k4 A3 o& n1 r: s# A
.orga FileAddress
* }( x2 @, H" u5 W说明:
& V0 @( w* K. B% u: S/ Y$ v前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
. ]) U2 k& P' |- M" m n
6 ?$ y4 u5 g& ^5 M+ Z- W. j3 B" t+ G.orga函数可指定ROM文件的输出地址。+ n! I* u, m& A& N
1 E$ {+ q9 n$ D
.create函数和.createfile函数
2 |6 N$ I7 }, W z% e% z' f( a格式:
9 G k, t9 f5 q0 k.create "FileName",offset
" I, S6 ~( T) [$ `.createfile "FileName",offset
I% _; g" q# @: }9 P* }' Y c说明:创建一个文件,如果文件是存在,他会覆盖掉。
' q1 s% I8 ]% c, H2 J6 w9 o
, \- T- u# n b0 a.area函数0 f; H* G' f5 l. v! a5 ~, s4 r. F7 |
格式:5 Q/ P; B8 i4 q
.area SizeEquation[,fill]% |1 b" d) P- B
.endarea
7 Z! {- T _& T+ e* K; X; V说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败4 {4 D+ m8 X: k6 |
/ l# h- l& }9 G. ?6 W k) b3 a例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据9 r# K2 p2 R" ~& A. k* h$ [3 M3 p
org 0x100
' A6 ^1 g0 b2 b" ~( O.area 0x8
$ K# c- j4 k# O2 }/ h7 C2 p2 Ubyte 0x5,0x6,0x7,0x8
0 |3 ~1 b' \. u1 q& C/ b.endarea5 L' @ k( u6 p* U+ _) X8 |$ C& N
2 I2 ^7 C/ A7 X# w.align函数
- v7 B1 m6 l" _格式:.align num1 p; D9 A1 {' c8 X
说明:写零字节,num为零字节数量,用16进制表示。9 B$ j" S" }* F L: M- }
% I4 w- Y: Y# y: _$ o2 D/ G
.pool函数
$ i' Y2 Y' n' M6 L# ]9 Y格式:.pool# f% d4 U" N" A5 k, N) |7 m
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
' F* U8 m$ r: z+ ~8 H例子:+ R) {. B# N' `% v( |- J# j
ldr r0,=0x12345678;
& ^. {" N4 }% L...., E* [! M6 b5 ^
.pool
- R* F7 C) M$ ?' b9 \
- |/ ~% u" ~* z; C6 x! h.fill函数
9 Z) ?! X- l! E0 ^$ u格式:( y R; s6 q2 v3 q0 ?
.fill length[,value]; C4 l* a5 D; P0 J0 X- u! b+ W
defs length[,value]
$ W6 `- l. q/ ]说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。2 x1 H- U. d& ?8 H3 n
' M/ K2 B2 N$ v p. @( ?6 n.skip函数:
; J, K- W% W: k l, l" h. G格式:.skip length
9 e7 X3 w* ]1 ?说明:跳过指定长度单字节数值,length用16进制表示。; V y( M% n9 |* R9 } z( Y
" ^" u# D I: M8 ^1 C" @: D写单字节:) x( ]4 `! t. i z
.byte value[,...]
; {2 ~- i5 O4 x) N) T.db value[,...]
* a9 C3 j/ _4 k+ u' S.ascii value[,...]" Y* N8 g7 n$ `( _- U7 a
.asciiz value[,...]4 o7 \3 q( ]0 \) }3 F B7 `5 ]
dcb value[,...]! O9 g+ ^% Z4 Z
$ q( s. A. _4 R写双字节:' G5 ^/ ]+ `+ @# K; s( H1 z
.halfword value[,...]% W0 Z t9 F" D3 |" _4 C5 v
.dh value[,...]
* J$ X9 E8 L) J6 Q# j; ~% N! B3 ?: ?/ wdcw value[,...]9 w% ^. _' B) `' W _( I2 ]
7 m' F5 L7 a( V$ F% m* u
写四字节:
; X J/ h$ e" O! g4 K f.word value[,...]
% t9 L( p( o8 y2 P( h+ y.dw value[,...]6 `: [; I3 o! a P1 S+ x `6 \% T
dcd value[,...]
, f+ Z* O. [ U$ Q" Y5 {; o3 b( J0 g9 ~; ~' a& x
写doublewords:3 D7 ^. u% P6 |( o
.doubleword value[,...]
z: R# [; F: }0 [ [7 w.dd value[,...]. A& }) Q' l+ E3 w' R; i* O% U
dcq value[,...]
& S1 y1 {& }, C! |5 ^2 p" ]. Q( h% x4 a7 u* }% W
写浮点数:
3 E# P0 W$ a( ]3 Z a.float value[,...]
% }$ c* I4 L# N% B$ t.double value[,...]# Y9 A3 s0 E% S7 v9 B
3 y5 ~% ]8 L" ?1 w
ARM的ARM模式和THUMB模式定义:7 D; \9 r5 Q j* }
.arm|ARM模式
' B, ?8 H. v$ ~0 Z( D- ].thumb|thumb模式6 Y3 D5 e7 W6 _) G* m
; G. }; ]7 d- d0 b5 {2 T
设置架构:
4 d c) X/ w8 v4 M4 {# n.psx|PlayStation 1(MIPS R3000)
6 f: w2 y, W* ^' {. h7 |.ps2|PlayStation 2(EmotionEngine)
' v, }5 O! y1 j8 R0 I/ H! F; y.psp|PlayStation Portable(Allegrex). W& Q, {. _& k' R2 l- {+ x: Y; f9 @( k2 R
.n64|Nintendo 64(MIPS R4000)
% w0 C5 a; _1 n% \.rsp|Nintendo 64(RSP)/ ]" y: [; r) j' p# p4 u6 M7 K, _
.gba|GameBoy Advance(ARM7,默认是thumb模式)* V- ] f3 Z; \+ ]3 A
.nds|Nintendo DS(ARM9,默认是ARM模式)& N9 @" i. F4 h/ B+ _1 p* H
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)8 L( c' D5 y2 j t4 H
.arm.big|
/ N9 |9 f T2 T.arm.little|6 e2 _% n: f# |% D) R$ ^/ x' z
; A$ D. H; Y5 s+ R, X" d常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
/ G& F; n, L0 _: E |
|