签到天数: 1897 天 [LV.Master]伴坛终老
|
8 M4 ?3 y0 j j( m" {0 W8 w1 G
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40005 @6 T# q' `; Q; @
; v/ m$ N, ~% I& _' l
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
1 ?! P. Q; y I0 |: [+ ?
* C3 Y! S: {0 n- }* L* vKingcom's website:http://aerie.wingdreams.net
6 p: g& O4 L& h0 i- @. F E* `1 Y7 I
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得9 B& \, P: \% L0 \4 o
a Z7 b- w) S* `; A0 T9 O
更新版本可去http://buildbot.orphis.net/armips获得6 A1 f% G) F, G7 P# d
. I( R$ X! T$ q
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
{6 u& E5 c* ^8 S
4 S# O4 y+ ?/ ~4 w( e/ }4 Y7 J; TARMIPS命令行用法:
/ G$ J. G0 V2 q* t9 k1 v* ~! V5 z( w
3 H' l) P! d/ i4 h' \+ ?+ lUsage: armips [optional parameters] <FILE>- X1 }/ G& n! ~0 X
$ n2 E3 G& Y1 _( G7 N
Optional parameters:; I" u& U. p, B1 }4 A
-temp <TEMP> Output temporary assembly data to <TEMP> file& d9 k7 j" T/ _( u
-sym <SYM> Output symbol data in the sym format to <SYM> file) T' |, k3 c* h5 t' ~( G
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file- u' U1 x w7 ^4 Q' P1 l, M8 y
-root <ROOT> Use <ROOT> as working directory during execution( [+ f. U3 [1 b
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
9 c4 ^ K& L7 q7 n -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code' A$ S: F0 V4 Y g7 D7 C
-erroronwarning Treat all warnings like errors
; L0 ?' H* i0 m# {" H( x- I6 S0 B7 T: |- v! D
File arguments:6 A7 ?( D% I7 K$ V2 w
<FILE> Main assembly code file X. f6 v5 {% w: L# I
3 Y2 E0 j- l4 K! y-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
; b6 a6 b( x1 C$ T$ F6 h" X% G. ~ B-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
# X+ F& c$ T4 H0 O l9 Q-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp P5 c7 R# w! @
-root <ROOT>参数是指定执行期间要使用的工作目录8 e1 z4 ^% g2 F! `- s6 F
-equ <NAME> <VAL>参数用法不明
& ^' y }3 `; M# [$ q5 A3 Q-strequ <NAME> <VAL>参数用法不明( e) t3 o; c8 X$ h! u6 I9 Q
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译# a8 B a( Z, T3 k- S- K
% r$ t+ Z1 Z) x! M$ ^( K% W
<FILE>是汇编代码文件,可用记事本之类编辑
( r1 a; f3 J5 }3 _* x
; B: V4 `$ E+ P, _注释说明:$ x# ?. ^; k2 A6 F1 H
注释可在单行指令后面“;”和“//”添加
2 J- ?0 k2 w* {2 z4 |“/* */”式也接受8 V/ w% O2 [; e" }, ?
% N9 l0 R0 Q4 c) q% ~1 o. f( G
例子:+ k: V! B' t O* J. J7 G/ s* {3 e) H
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
" z; V Y0 Q% g& a: s
- H( N3 X$ H5 b, k# Q.close;/*关闭文件*/, j- @2 z0 p/ A- m& `! o0 ~
& D2 A5 z9 b+ o, W6 Y5 J8 X标签说明:
, ~! ?1 Y# ~% H标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。 F0 R: u7 a6 Y% M7 s5 c
$ L; O( W1 i3 T* z数值说明:
) n$ C1 D& f# V2 }“0xA”和“0Ah”是16进制数值5 t6 b$ M4 K, G) Z
“0o12”和“12o”是8进制数值" o2 w9 D9 |" U1 x- R4 L h
“1010b”和“0b1010”是2进制数值5 [7 }5 u* A; ^( i. O, |
* y) { D; e- tequ说明:7 E# @$ [% W( W1 B. @
格式:text equ value- j5 Y1 }( K9 B5 O" R( f$ Q. b0 n3 G
说明:用一个text代替value w$ ?8 J4 A! m# B! M9 u
例子:
7 k) O' y5 k9 Faddress1 equ 0x12345678
% m. N U0 n5 G8 l6 `3 ^' j/ aldr r0,=address1& z0 N# H V. ~# Q* W
.pool
; }; h6 w& I1 W G4 d
6 n2 y) n/ a, r' `5 s函数说明:2 n, B3 B5 j0 i+ @- C# ]" E$ p
) V9 A+ c! w0 @' z ~$ G. p; v.open函数:) J+ ?+ A2 W8 K* q* w+ v+ Z
格式:8 Q5 L8 o, J- |' @; Z# k
.open "ROM FileName",offset9 \' `+ H0 a; m$ ~) v# U2 _' f0 e
.open "Old FileName","New FileName",offset
/ l/ Q) s. D: M& \# ]2 e说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
e& y W/ p5 n; M, l
( E. a% j! S, z4 O7 Y7 m) ~例子:' }# j/ r) I! N/ \7 Z" J% Z# k
.open "1234.gba",0x08000000
, K; k5 U5 O& x& h
2 z9 @6 f: N* t8 G8 Y.close函数和.closefile函数:
1 x) t3 F) |( M+ q9 f格式:! m5 o9 T0 P! Z8 B) k& D; w- k
.close* b( `. z3 B$ O9 A7 _' a
.closefile- D9 r- B3 \" u- ~
说明:关闭文件。9 t V2 Z9 t+ U2 L' \* Y" P+ F; j, Z
7 P- R" q( c1 [& j
.org函数和.orga函数:
, ^* a8 W- N5 K+ @" A. Z8 s+ g5 m格式:7 D b' o' v1 W( s8 t" x2 s$ k
.org RamAddress
7 G+ }5 }# D/ t& ^.orga FileAddress6 L$ H) Q; [* c' x3 C F0 j
说明:
2 N) S+ @5 \- i3 {$ i前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。8 C- k0 U( Z; W1 H
9 E! y# Y. G1 x q4 u1 w.orga函数可指定ROM文件的输出地址。# p1 A( N/ W9 ]6 C# |5 W- ?
2 {4 _. G. L# i" B+ T9 J
.create函数和.createfile函数
" Q H. Q3 e; l$ z+ B$ t- J# f4 L% [格式:
7 v0 e( D! ~; x* B- {! V3 D6 w.create "FileName",offset4 S5 @/ `6 l" x8 ^
.createfile "FileName",offset: w0 b0 a" o) d- e Z7 X
说明:创建一个文件,如果文件是存在,他会覆盖掉。
u# g8 Y% O F' v2 } j; y) p) h* W# ~$ I# |
.area函数: u% P7 L: {) a
格式:7 I' Y; M8 U8 J$ `! j% Y$ ~+ b2 T
.area SizeEquation[,fill]
$ u w# z' G5 d Z* i.endarea
6 Z$ v( a- I" y; _! t; p4 A说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
4 d. H0 j5 Y7 y5 ?) i) O- b! h& j
* m8 W) Y- A$ ~3 i例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
- ?* J8 U4 a' S0 [8 b7 ^org 0x100) C- L9 ^# e" _( l9 e; R4 k
.area 0x8) g0 D) M' |$ L8 Z
byte 0x5,0x6,0x7,0x81 q+ d8 X% V: m+ c" g. t, o
.endarea4 n' l5 I. z6 [
1 R' m0 Y. E4 D! S" R+ a4 J2 @
.align函数 o" H) I4 g$ d0 \
格式:.align num! l$ x& T! C/ I9 i' T. Z
说明:写零字节,num为零字节数量,用16进制表示。% A$ e" e$ k) z: B7 R
- x- R8 z- _. b; Q: @6 n.pool函数
+ n' I k$ e2 U9 ?格式:.pool
* r* e2 J& B/ E' T+ X o说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
( a; U/ A$ n! Y% @! i0 N- O# r4 R例子:
" ?6 R g7 E- H: h6 a% q5 R. Tldr r0,=0x12345678;1 C$ m. A7 _* R. @1 ]) M9 f4 o
....
4 b, {2 Q: G3 W.pool: v y1 |9 Z6 ~+ a
9 O% \3 U6 |5 a1 K9 o, b.fill函数/ {8 K6 q9 S. g0 ?2 w" T+ V2 N
格式:. e& w0 S7 ~7 c) L, Z/ [
.fill length[,value]8 U" B7 X2 h$ S% b4 U6 R
defs length[,value]
' [5 D) N& ]; |% @9 a说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。) H: N6 |! v/ y1 r; A
4 H J- Z$ i- e5 E# h6 D i" ~.skip函数:3 D+ U0 i [/ ^) q; m: G) F
格式:.skip length
& M& Q* }9 _1 B& _. w说明:跳过指定长度单字节数值,length用16进制表示。
{" k! P0 Z, d$ ~2 }9 C1 T" r" | F/ ]* `
写单字节:, S* X$ c* h9 m. P8 C- [* r1 ^ c0 N
.byte value[,...]
7 k, z* L# _" ?9 U& _# H1 A.db value[,...]
# X+ m) n8 c& e' j, W0 c.ascii value[,...]
: i* B% C9 }! r V; Q t: d& J.asciiz value[,...]: V2 `* {/ i- e8 `6 `4 ?' a
dcb value[,...]2 W+ ~6 [$ T! l* P8 B
2 K2 e+ O8 \1 M. J
写双字节:" l# Z% @0 x1 S- I$ P; h
.halfword value[,...]0 C& {2 s8 `- w7 D" Q+ |( A
.dh value[,...]3 O/ j8 I+ K, Q4 Y+ d
dcw value[,...]: n) H" r- Q9 @: e h
1 a9 c) D9 v! @' N6 d. V
写四字节:
9 F/ u. e# @/ p7 q, }5 @( v6 J.word value[,...]
: z6 P5 c- Q& n, A, I$ J% o.dw value[,...]" q2 R( a/ x h$ q( O
dcd value[,...]
& v+ [$ P u7 e' g/ F+ p+ P7 [1 i, q5 F; V
写doublewords:* L, n2 m6 W2 u& A1 e. q+ x# c) R
.doubleword value[,...]
5 q# X8 X* o X" B.dd value[,...]) C' m. _# d) L0 [
dcq value[,...]
! y, s* c, \* B/ T
- d! f8 p, z) ]- D写浮点数:+ J, H: K' y+ k' a6 p) n
.float value[,...]
4 ?, A# C$ y1 K% ~+ ?.double value[,...]8 {4 V1 T& P6 @" P" t# F$ `
2 `$ i# | N" a: k6 _4 ~ARM的ARM模式和THUMB模式定义:
' k6 Y) A' z k$ D; g- |7 C.arm|ARM模式
9 H# M: ~# o9 |2 n$ i, V; S.thumb|thumb模式& O2 o Z3 ?8 `0 N: ?1 d) C
) O, E F* F; M! N7 U; v* c
设置架构:* }) C: t* C% J* n
.psx|PlayStation 1(MIPS R3000)
/ Z+ B- z2 h, o( {7 B9 c+ g; t2 p: p.ps2|PlayStation 2(EmotionEngine)
# A3 t$ D$ \- a& Z9 ?# w.psp|PlayStation Portable(Allegrex)6 @. i5 I" b$ ^
.n64|Nintendo 64(MIPS R4000) y- b2 k. D, k! \0 Z
.rsp|Nintendo 64(RSP)
* Z1 W6 L& N0 P! o& s/ k.gba|GameBoy Advance(ARM7,默认是thumb模式)
w: \' Y% O- N; e+ U! E7 M.nds|Nintendo DS(ARM9,默认是ARM模式)
( h* j: X8 W: Z. f1 E8 E9 k.3ds|Nintendo 3DS(ARM11,默认是ARM模式)/ x) ~ ?. t( A
.arm.big|, e# ^! ^% r- e- }7 a' K
.arm.little|
5 r9 s$ u( \. P( K8 I
* d3 d+ z& O- w1 \! p常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
. Y0 W9 A0 e+ V& C |
|