签到天数: 1999 天 [LV.Master]伴坛终老
|
- D1 t5 o% z* ?, B6 F" l0 XARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
' G) Y. W) L+ S& t7 ~3 ~: G! m( A6 q/ ]3 @. V
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
$ W5 |) x# ?; P: [. f" _* p" G8 L( T4 C/ j, b: g7 h6 W5 \
Kingcom's website:http://aerie.wingdreams.net. Y' o) r# Z( b! V* G2 D; I/ h# s$ [* X
, q8 N% O) r* n( n& z2 F7 A- L
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
0 Y3 H$ ]+ s% q3 f9 i4 ~5 ^ D6 M; N
更新版本可去http://buildbot.orphis.net/armips获得
' \3 Q( F2 a4 \4 Z6 L# F0 x# i) a( a) o9 o. |; d
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。$ E: s3 f, ]. [! `& e
: V3 }+ k* |+ G# j
ARMIPS命令行用法:; x; }4 K. i% S* Y" q7 q. ~
& I: P2 ^) n) ?0 H; d6 j8 _9 iUsage: armips [optional parameters] <FILE>$ H) Y7 w8 L: z3 @0 E2 ^* ^$ C! G
( m" I! r' X+ q. s
Optional parameters:
. u0 ^; ~" z1 q) H -temp <TEMP> Output temporary assembly data to <TEMP> file
( O6 u: G- r/ U" N1 q -sym <SYM> Output symbol data in the sym format to <SYM> file
0 @7 a* P' L+ n3 z! ]8 c8 r -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
2 \9 G2 U3 Y' F$ i2 c. F- L -root <ROOT> Use <ROOT> as working directory during execution
, Z, {' r; s0 V! K0 Q$ Y M/ P -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
8 O9 @4 q+ p/ Y% b3 O6 F9 L$ P, q -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code9 u& }5 }6 t- U7 Q8 f4 o: [
-erroronwarning Treat all warnings like errors \) Z# K9 o1 H
8 H% J; Q+ b( }: c9 v5 [File arguments:- i" D& d& a# T' p" ]+ H
<FILE> Main assembly code file3 W7 I5 M& B: r' i* r! O
: J( F6 g6 }: A9 Q9 a3 G% i- z-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
: u% b' j2 s6 K+ g-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
, T+ |! q2 I, f0 w% P9 B-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp- j4 W5 n4 Q" v5 j% O: _; G
-root <ROOT>参数是指定执行期间要使用的工作目录0 e$ z- ?: {1 G4 u/ Y$ }8 Y9 a
-equ <NAME> <VAL>参数用法不明
1 @5 k: R; L, ~ w: u-strequ <NAME> <VAL>参数用法不明
: o: X" Q6 Q) m7 Q5 {6 L, q-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译2 W' I, m& [" ^" q% a
; Z! w7 n. r: S7 a<FILE>是汇编代码文件,可用记事本之类编辑9 G3 ~2 p' Z1 V7 j5 J0 I
9 ?0 E0 P2 A5 Q注释说明:
8 M0 M2 A5 r4 `; Y# T) S1 |/ F注释可在单行指令后面“;”和“//”添加$ ]; P, k# p; M& v- K' T& F
“/* */”式也接受
3 `$ c! J" j4 [& z' I: s4 L- L8 p0 S$ w' B/ r% z
例子:( B4 x# Y2 e4 H/ m7 u, z2 ` o
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
: n2 _5 f1 \! r8 W1 J0 i/ G7 g4 @0 R2 a) R! |5 I) w, z
.close;/*关闭文件*/
6 F* l% e2 O6 A: z, S4 t. ?
% g" ] H$ n7 R4 E3 R标签说明:
% a, a/ q8 l# A9 }+ ~标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。; F2 [' f' e' _0 v1 g
9 C6 V1 [3 d y% b, ~+ @% |, t# ~
数值说明:
k8 a# }; ~ f: H2 _“0xA”和“0Ah”是16进制数值4 x3 H' |3 X$ P h
“0o12”和“12o”是8进制数值" u. R9 p" r* w+ v# W y
“1010b”和“0b1010”是2进制数值' U7 U* h! P! W
G/ l) _# D$ r
equ说明:
- V9 a0 z0 F2 ^( a; g' l0 f格式:text equ value* J1 H8 l3 @0 g
说明:用一个text代替value0 h! Q+ `+ f c
例子:- a. y( y! b, }3 F/ x6 ]8 ?# p2 K
address1 equ 0x12345678
+ y( F3 {9 A# a1 q; W( n7 a3 Cldr r0,=address16 `8 A ^9 G" `- h& f
.pool/ `8 Z/ S- ~7 Q$ Y$ b) `5 Y
% }/ | ?, H7 H1 \! _! I" I" w8 T函数说明:1 ]) Q K6 k4 }- ~ x
# g3 H9 y( G4 w; c D, Z$ V.open函数:
' q2 F1 T2 E" }/ n0 p* s+ ~/ e格式:3 w8 S: p6 ^/ ^3 G" Q
.open "ROM FileName",offset
, u5 `; w, U5 \7 m* f.open "Old FileName","New FileName",offset
+ ` \2 }, U. {) X9 d说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
( J) m6 x0 m7 j, d+ b- [/ s- {6 {+ Z8 Q& E" P- \. C7 H! `& y @4 D
例子:2 c4 N: V. y1 I- Q
.open "1234.gba",0x080000002 S \; O1 F& a) j- s7 F
; H: [# Q, l* E: O/ h9 m$ ~3 f
.close函数和.closefile函数:
3 U/ O$ R5 X5 h# J格式:& b5 R/ s9 \# d9 L) z
.close
' O0 \* H) V: Z4 y.closefile4 ^& M; a5 q$ n/ E' _5 X9 B8 m
说明:关闭文件。
, m% D1 I. ?5 K- g% ^/ m( i8 u, Q
.org函数和.orga函数:
$ C' ^! K7 c2 }- G格式:- w4 u, u: R4 ^6 k0 k4 U- X$ P' M- P
.org RamAddress( y9 \, t5 r# P) K1 t
.orga FileAddress3 d) ]7 }6 t0 U8 F g) X
说明:1 w R' s' i$ ^$ a/ N/ l
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
1 R0 W0 Z4 e7 q# f$ r9 _# `3 P% S! i$ F; u7 N8 {
.orga函数可指定ROM文件的输出地址。3 F6 K$ R1 h# l1 _ V6 j
* V2 f4 e: C2 T$ E6 b1 _5 l7 ?.create函数和.createfile函数
( K* M9 u& G6 G2 j格式:2 r* g t7 ^# Q, x8 K) [
.create "FileName",offset8 ^4 r: t. J. K$ ]7 g
.createfile "FileName",offset9 C' e& S/ x& |( Y" G: R
说明:创建一个文件,如果文件是存在,他会覆盖掉。8 J5 x+ Q5 Z: n" Z8 `0 t9 R. V
$ ?# ~/ m6 C. ]2 M: q: L.area函数
{3 g \1 T* o* u6 J格式:
7 p3 w* `5 p# [2 u& t1 g.area SizeEquation[,fill]
% }- E+ |9 _- |.endarea' W. x5 _+ O" T/ Y# n3 O
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败% \/ e+ S6 ^- `5 R, A) q; M, C
% w c) A8 j5 G" v2 q* }" |$ T例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
1 Z' l0 Z* S5 E# x8 Morg 0x100+ b9 o2 p* Q; E6 C8 d; J
.area 0x8
8 f6 ?$ E& R0 N3 t2 s9 h' Nbyte 0x5,0x6,0x7,0x8
% m6 {2 ~- K: n; `, D7 Z6 z, M M.endarea, n/ I# d9 X8 A
3 ^* u# O: t) y/ X; O
.align函数
. O$ c* t# X1 A% z! h格式:.align num
$ r- I* K- M" ], @说明:写零字节,num为零字节数量,用16进制表示。. p" A! M9 Q6 l, U- h
$ N" C( l/ b s2 b8 A.pool函数4 L. D Z" u" k4 C
格式:.pool, x+ P7 d; x) @% o. k' N
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。) s$ D( t0 i H
例子:! R: U" N& X' d( a" h
ldr r0,=0x12345678;9 H* I' v0 Q0 J7 h
....3 a+ q& V5 |3 n/ X* F% F
.pool1 k' ?% x: h) D- ~/ G. q
, Q+ g0 ?. D6 E; n( P$ a* S$ z.fill函数 H' _" ?. p3 _% I8 V
格式:
7 L! m* R# h0 O7 d.fill length[,value]6 _% ]- W% C) |! r9 L$ B
defs length[,value] v H* N: m: {/ A z( e! F8 R
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
" ], z" O" z4 J8 J0 h; e& Y5 B8 ~% O* Z% M/ Q( c+ e
.skip函数:7 v* q. u$ S. M* |
格式:.skip length
7 H% b, S' o n7 t8 U; {8 ^0 L说明:跳过指定长度单字节数值,length用16进制表示。9 A4 G/ y( C7 U V5 @. j, {
+ t- Z, e" O5 m! [9 |3 E. `
写单字节: d1 Q4 I7 e' \1 p
.byte value[,...]
( N% d: Q* N1 k$ g/ b0 F.db value[,...]
( }- L! s3 D- Q; k$ T0 F.ascii value[,...]
5 ?! q# Y$ M9 H7 q: g$ P, y.asciiz value[,...]1 |4 ]# p3 o6 @; @1 w1 {4 ]
dcb value[,...]1 [, e4 _/ k1 }" p1 ]+ N
?3 @3 k/ J0 X9 n; N0 n4 H
写双字节:
" I/ V. p9 ?, Z6 @.halfword value[,...]6 m/ z7 J' ~% n# B; T+ j7 a, Q: P
.dh value[,...]
6 j2 X+ J) j8 w5 ?* Edcw value[,...]& S( l+ O; r- R
- B/ e3 X( L4 p8 O" p! M# X9 e" L写四字节:
. G& c* P1 j, R5 Q& {( Y. y. I: [.word value[,...]
4 i$ x6 \0 b2 b1 Y.dw value[,...]6 I: m" o% d# H% C
dcd value[,...]
4 K: y2 O9 q8 N+ }1 |* S+ B
3 Q8 k3 W2 B( f7 W# E. s写doublewords:
. Y2 D/ U- `' p5 S6 F" y.doubleword value[,...]
+ P! u& Q5 u. z w4 |( C2 v3 s+ [.dd value[,...]7 Y# m0 Y% A0 _+ z$ v& Y1 f) ~0 L; p
dcq value[,...]% _0 G1 @7 Q2 X z
: d9 C9 ~. E e, E写浮点数:
. W2 @ p1 v m! b2 d- c.float value[,...]& Y: z, Z# j( s- J
.double value[,...]+ O- x& A% ~5 ^: ~+ ?+ g) ~/ H! _
0 i4 N) d; Z% g& L: \ARM的ARM模式和THUMB模式定义:
$ U+ V$ Q; D; h9 z.arm|ARM模式
/ V9 C( r1 U; n' E. B2 X! v.thumb|thumb模式$ k6 n* ]9 D& v" P
+ j) Y- p! R; W设置架构:$ r# R3 E6 _9 N6 e3 [8 ?- ^) O; d
.psx|PlayStation 1(MIPS R3000)
! Z1 ^, D4 O, S: w" j* T# x.ps2|PlayStation 2(EmotionEngine)
" D# V; f$ \. N' W" ]. r.psp|PlayStation Portable(Allegrex)
* d% \ D; b9 Z$ y5 p.n64|Nintendo 64(MIPS R4000)
* J% ~1 z# U- T) s( H1 v% _" C.rsp|Nintendo 64(RSP), x% O1 [. ~( }8 ?; [
.gba|GameBoy Advance(ARM7,默认是thumb模式)
: l* S2 C) B ~; y8 ].nds|Nintendo DS(ARM9,默认是ARM模式)
: e- `" p! s) T$ S: c.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
: g. G7 X+ ~" p- B- v9 S1 u0 `.arm.big|
+ @8 E( Q9 s, K1 X- ^) f.arm.little|+ U0 S1 u$ i [- q. Y/ x" L
9 H2 ?) l7 @( Z' f8 _4 p常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
: P1 a' o6 L' V. \! M |
|