签到天数: 1770 天 [LV.Master]伴坛终老
|
$ i3 `5 A+ c4 U, h- c" U
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000+ N2 w+ b- _2 b2 o5 q- }$ e$ ~
k, {" K9 d1 s: I: E. F2 @5 P, q1 v; {
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
) g8 P$ h$ j3 X7 h: Z& z7 t. o$ v* h) b
Kingcom's website:http://aerie.wingdreams.net; A' w9 G& [0 c3 X8 \: H
8 H* Z+ Q1 a" I' `1 y# t
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
: {3 M# m8 V! Z5 L4 b/ @) F9 _6 L: K: B$ F1 L7 }: q1 b
更新版本可去http://buildbot.orphis.net/armips获得
. G* f9 S3 o$ {9 ~" R$ Z v8 y4 J6 I4 |5 g1 e
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。7 r- w% H) l; d. W
2 A' x( l4 N# t6 oARMIPS命令行用法:
' y; ~/ h! [: U! p9 h- _7 r( a; d( x* \$ _" b
Usage: armips [optional parameters] <FILE>
- a7 {0 `9 F0 b7 d7 P: x. Y. a B' g) l1 X$ V$ n
Optional parameters:
) y9 u3 S; w9 p7 {! m$ [ -temp <TEMP> Output temporary assembly data to <TEMP> file
. b" e8 M- p$ j5 a) E5 ^- B -sym <SYM> Output symbol data in the sym format to <SYM> file
& V3 G4 m6 l! j& t3 W -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file. E# q" H+ F9 a
-root <ROOT> Use <ROOT> as working directory during execution
" i1 W7 g; T1 P. D -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code5 x8 @9 d# ` v: a
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
% a3 h5 V* P2 |* ]2 [" z -erroronwarning Treat all warnings like errors
( q0 Z. t8 w. }4 g/ ]+ ?6 l) N& H0 l
File arguments:5 ]3 Z7 ]& k/ o# a% ]* T \
<FILE> Main assembly code file
3 A. @6 S* \ J4 H8 h0 U! n/ [/ d* b) p
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件) G2 v- m# n+ u7 M5 m! A
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba+ D3 R% s& U" N! B" E
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp" k J9 Y8 ?1 _) Q0 Q
-root <ROOT>参数是指定执行期间要使用的工作目录$ I& ?5 Q3 T c8 M6 ~" ]8 t
-equ <NAME> <VAL>参数用法不明5 ~6 m0 w8 [; e) U. w! ?
-strequ <NAME> <VAL>参数用法不明
$ n% r( C: D+ U: V: j-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
8 Z' ^7 x: }8 q; }9 ]; \' A8 v4 U9 k* N \" ?
<FILE>是汇编代码文件,可用记事本之类编辑
0 r1 n+ s, @ s
1 M# g! J! o9 c/ B [/ j' z注释说明:
' x. U6 G- @8 q+ D+ K+ [/ v' Q5 U注释可在单行指令后面“;”和“//”添加
' d0 L% d8 ^, }1 j. M“/* */”式也接受% n- r& Z8 O { H9 I
: f8 V# I1 H9 e6 c5 ^
例子:5 m. `* u; \. V# f, q! [) `
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
9 E* h' v1 v% ?8 M& {, g' c
" N2 ~) h& R, W( p' C$ O.close;/*关闭文件*/+ g' I- }/ \' z7 r5 l* w: h
& w5 Q0 O; D$ U: c; I) T: m3 w2 U标签说明:8 S6 n: C2 \$ n1 T
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。# v, s5 B0 k, g
" U' D# m4 G9 L4 P7 v* X
数值说明:
5 z- ^; a3 B9 }. J$ L“0xA”和“0Ah”是16进制数值
! b# R/ b. n) @ C$ r$ ]/ C$ ?“0o12”和“12o”是8进制数值
w/ f- r$ ?5 W“1010b”和“0b1010”是2进制数值
6 K4 h7 o& @* a$ o2 g* j7 c, l: Y) J
equ说明:
4 A4 j; _3 c4 o" O2 w9 U格式:text equ value3 ?! U" r9 R; @" [
说明:用一个text代替value
% ?& @: I/ R; U- N# e1 M例子:- i2 s! P9 T$ c7 f6 ]* k
address1 equ 0x123456789 e' b+ L! X) H9 O4 n! {1 [) y
ldr r0,=address1, T! @& s2 ^ h
.pool
0 z+ z7 ^" @9 v, d8 T" t
1 B7 p$ k+ |9 s& }函数说明:: N# s/ K. d$ G! a
$ K" r. z4 S0 e% K0 x W- E.open函数:0 E! H. B; r/ ?( }9 O; B- s; M- J9 \
格式:; `: @! |% ?7 M/ G& x- E% O1 u
.open "ROM FileName",offset
" u5 }+ L9 a% l- @& L, m. K9 y, ~.open "Old FileName","New FileName",offset0 J$ }. j1 z( K# F' Z
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
5 e& F& k" B* ^. O' C. _' n2 B6 }5 l" U. ?1 k4 C
例子:6 ]5 J, {0 p0 t: Y
.open "1234.gba",0x08000000
$ w: i7 r' B6 o5 A6 T8 N/ C" t3 {& B' H+ R
.close函数和.closefile函数:' B3 @( F1 x. Z& h3 {9 w, w
格式:
C6 w5 T/ Z% |: S3 r9 i1 f.close# H3 R' E1 z7 h; T7 T, B
.closefile7 _( \1 p- X6 }% @! i& a
说明:关闭文件。9 ]! s% ^& ]+ U! {" x
" L. X2 \$ ~; e/ n.org函数和.orga函数:4 ?/ {( ~8 I4 c/ D0 J# U& {
格式:$ c& s$ U% f: o: s `) }/ `
.org RamAddress3 t( i3 P5 \! i* T$ `* w: Y( _# p
.orga FileAddress. C1 u9 \: G! Z8 ]
说明: ]! W& M* F4 Q5 H$ T
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
/ j) _( I8 x9 y
# s) G& N. L( \7 d* G: r8 q* W9 e( x$ [; ?.orga函数可指定ROM文件的输出地址。
1 M) V e# K6 ~/ V
# v& l' _9 e- T0 A0 [* O* r" l.create函数和.createfile函数3 |2 o5 G: I4 ]( `4 q
格式:
# m/ N4 [& F1 ]3 W$ V.create "FileName",offset
/ }) d. T! N3 C2 D+ z.createfile "FileName",offset
+ O6 g' E0 O$ t% c6 x说明:创建一个文件,如果文件是存在,他会覆盖掉。
$ r% ~' A) e$ u! G& e3 L. t3 T" K9 L) L+ E8 W, y
.area函数0 Z8 I1 s% i; m' I! P. _+ e
格式:% o" k- \) X- D( j9 S# l" k
.area SizeEquation[,fill]' J9 T D3 c) n# r% u
.endarea
p' B7 u6 u2 D0 A' G' K说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败: f% Y$ t/ z. b; r) e
# K/ c! S& F) U s0 W
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据6 ?1 x- Z6 w; W
org 0x100
/ \) j9 a! G' O _; E.area 0x86 J9 R4 _- M; W0 \5 h N
byte 0x5,0x6,0x7,0x8& `9 W5 x+ a8 C" g+ H" Q5 l
.endarea
/ P8 O" u8 `5 r3 Q" Z Y/ W' P6 c% K1 ~1 q" ?' \
.align函数$ B5 q4 |9 }# n% j- @
格式:.align num
/ c: m3 F0 n" i9 x2 c说明:写零字节,num为零字节数量,用16进制表示。
9 v6 Y% D2 C/ f2 J4 u2 v4 N+ ]1 W" D+ j; l4 ^9 E. @
.pool函数
" ~5 u+ t1 ~* }* I格式:.pool
/ D( E, B- ^' c2 u" M+ \$ {说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
. q/ M7 y2 P5 j& d; c9 }) N: I1 ~例子:. D, i/ }* X5 [; q0 D
ldr r0,=0x12345678;
2 W$ e: w4 i" K9 o `7 v..../ j+ y! O6 l7 Z, C+ z4 G+ g6 w
.pool
* G% n% Y8 b8 D( D8 k, s
2 Y6 f2 D3 a o1 W$ U5 c5 Y* K.fill函数
% l" U, e: S! |* x; {# K) H格式:
4 m( D! r R G8 |.fill length[,value]
, ]* j' }2 M& [# w) C4 edefs length[,value]
/ V3 s" g' w4 ^说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。! S, g/ m3 @+ }# b- [0 n2 T8 W
5 V0 R' x& G4 J" K* G- j
.skip函数:/ n$ T, X, m6 Y' ^( h3 z& q
格式:.skip length
( F$ o9 s2 v z说明:跳过指定长度单字节数值,length用16进制表示。5 f1 r6 I- f p
! u2 w3 C# C! n1 F- J J; q0 q写单字节:
8 B& b. N8 G7 y0 [: v.byte value[,...]- y" H% d$ N' F/ y
.db value[,...]
% S" D& w4 _ }4 w' W5 a.ascii value[,...], w6 j. e, e9 ^
.asciiz value[,...]
1 f/ X3 T1 D, j3 j& edcb value[,...]
9 S4 _, L6 w' y, \( O( Q
+ i* s0 ]0 t, f1 ^1 s" \写双字节:
0 e3 b, }, L2 S+ N! v! M.halfword value[,...]: i! F* [- }0 g# X1 M9 x( r( b
.dh value[,...]" R- N- u- |" S) {
dcw value[,...]
% O1 _+ G4 `4 K" t
) j/ D$ T: H, k5 ~/ [9 ]: ?/ w写四字节:
2 F3 `( g/ V4 l. J! V.word value[,...]% m G; Y7 ^! ^
.dw value[,...]5 \. }0 l. Z8 X X8 S1 s* t y2 e& ~
dcd value[,...]$ `2 ~! ]& [( E9 s
5 q! V! ^$ G3 ?0 t* V: U3 f写doublewords:
. l8 W/ u- C% f) I: s8 t.doubleword value[,...]
$ q0 j7 p; r& A W: S% I' z.dd value[,...]
2 \( O# D7 d) _/ ddcq value[,...]
. ~& r& R5 a" M, g& ?9 X# l! F2 m2 g8 r/ A& [* y8 \6 W B
写浮点数:4 D4 U1 w( [8 T* M) s" E, n
.float value[,...]8 L" x8 B5 b1 s9 ]) C
.double value[,...]* y$ a" H5 i6 e- |8 z$ v
' d! s0 Y' R7 Q" b9 b
ARM的ARM模式和THUMB模式定义:& Z( X4 C) O0 M: j6 z
.arm|ARM模式
3 v- |( C9 R& P! h; g.thumb|thumb模式
7 w6 s( B; j" K8 U0 i7 S6 W
* e2 n4 B4 [& V% N3 L* E* _0 s( J设置架构:
! W q# |; W7 v# V9 C6 v( R3 _.psx|PlayStation 1(MIPS R3000)5 A D" q: O* B8 @
.ps2|PlayStation 2(EmotionEngine)8 n9 O$ X% o/ m! I' L* p
.psp|PlayStation Portable(Allegrex)
& |1 i' C! `5 V$ w5 P- |.n64|Nintendo 64(MIPS R4000)4 h0 x2 Z! g H7 C {( ~
.rsp|Nintendo 64(RSP)
, ]4 ~' w- c, t' R x.gba|GameBoy Advance(ARM7,默认是thumb模式)# v! m9 _3 r% J/ v1 b
.nds|Nintendo DS(ARM9,默认是ARM模式)
/ w3 I6 g6 ^8 P, b7 }/ i, A.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
2 A2 q- `( n: Z/ |( e.arm.big|0 H& {/ M; M5 ~. C8 y/ t5 |
.arm.little|
) t- z0 P A% x' y4 u: {( D$ z+ N- m% m9 c$ B1 Z- r; [$ q
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。+ d+ q, y) H# h7 e( T( U" k4 M1 o
|
|