签到天数: 1993 天 [LV.Master]伴坛终老
|
& o/ S; l L5 q. |5 mARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000/ m2 o& @: n; ~; d3 M* r1 F
* e9 f: @( x! l
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
6 w' b: H/ O9 Y3 @ z2 k% v9 U, D4 P# J9 J }# y! a
Kingcom's website:http://aerie.wingdreams.net
9 h1 J U6 U- T f* Y ~" S) H% C7 V- Z/ B7 ?$ B
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
, b4 ^2 p! r& |3 b: f5 n1 d9 D" v+ ~5 |5 |& P8 }* {
更新版本可去http://buildbot.orphis.net/armips获得
+ b; }# c: _+ R" v
2 y# O ` ?5 z, OARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
# D- J% F! N1 q6 b3 Z* ]
: P) ^; W" W5 Q# Z4 mARMIPS命令行用法:2 y$ v* t- b* `+ }, ?6 b
0 v1 K& [/ G& R$ G* PUsage: armips [optional parameters] <FILE>/ a: i" G" H1 O0 e6 C$ q1 {
. W- f; E0 T$ i1 ~2 U" @4 sOptional parameters:
4 X O7 Y9 Y; ^7 l: } -temp <TEMP> Output temporary assembly data to <TEMP> file
& f: ^9 D, n. b" @ -sym <SYM> Output symbol data in the sym format to <SYM> file ]3 R7 z0 b; c+ V2 }3 E" @6 j2 |
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file( y# ^' i0 z; \( d$ i8 L
-root <ROOT> Use <ROOT> as working directory during execution
- w7 \( O7 l% w -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
5 C/ s/ g" R3 j& k$ S9 |% ` -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
, N9 I% U- x& b& |) ] q3 K9 K P -erroronwarning Treat all warnings like errors R4 _$ L3 S/ f4 a) D. I+ w) h
& Q3 l9 j2 u. J) O4 h1 O' VFile arguments:
% O8 J3 k$ I$ u) [' l <FILE> Main assembly code file
: f) o" r, C- \- Q- n
/ B N& [& d" g; h, U-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件' C! M1 r2 s; Q% M
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba2 U- q. R7 x5 w4 u
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp1 s" [6 x+ g/ g! H+ N$ F+ D, ~3 s
-root <ROOT>参数是指定执行期间要使用的工作目录
% p- A3 G. t3 T! V- a% \6 U, x- a-equ <NAME> <VAL>参数用法不明
+ j, c7 m1 Z% l7 o-strequ <NAME> <VAL>参数用法不明; b" d! J& @ ^; g
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译/ q1 S D& @- f7 b/ \7 {! ]
3 z) [9 R' a! m. ^
<FILE>是汇编代码文件,可用记事本之类编辑7 n, Q7 s. w$ s+ o0 z
( e, @8 _. [5 [2 s6 b
注释说明:. e& I$ t. K2 D- y) r; X
注释可在单行指令后面“;”和“//”添加
0 j- v; ~6 h* P/ g; `4 k. V2 p; I“/* */”式也接受4 B% H8 N; j) |5 y/ i8 @* `" d0 M
; T. [, g$ B9 L8 M- R例子:& P# [% O. M% u6 U
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
2 K# }0 t2 e! S/ s+ C1 T7 m4 U( \# y3 s) w7 S% C2 T) E
.close;/*关闭文件*/; s5 w4 l2 |* i9 U- L
) }; t" Z; q N; O0 r: l" P标签说明:
" v4 m4 B: Q4 Y4 `标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。# R5 D. G+ W9 X1 Y7 ?* {
- m8 G7 L# b/ b/ H数值说明:
: T O0 S8 u+ Z/ A. ~. L“0xA”和“0Ah”是16进制数值4 F0 }6 e+ Z( {+ ?. g+ G9 d
“0o12”和“12o”是8进制数值
- r$ n8 B5 B6 Q$ J+ u* b“1010b”和“0b1010”是2进制数值. y; H- k4 L8 p3 m/ C
+ G( M0 z# @2 R8 vequ说明:
% h4 I6 D; ^% G6 x# A/ V格式:text equ value
' A5 y8 k) e. y0 {3 Z; o$ a! U8 F9 G说明:用一个text代替value
4 \6 I; a- F; O: a例子:
4 C4 D8 {2 X7 ~! ? R' Waddress1 equ 0x123456788 P$ D6 ^; R! b5 C
ldr r0,=address13 G! H) b7 i& l) Q5 u0 l
.pool
6 l; W& `; Z8 B; U+ a
7 @2 K# x/ F* B* s$ l% M: v函数说明:8 N! Y; P8 J4 i9 @
* t, i: m" O X& w1 S: K.open函数:9 F& d6 U! ~, f) G" ~
格式:7 ~. I+ T& p/ Y! h; L- |
.open "ROM FileName",offset
2 {7 C4 \* m+ u/ y5 {3 Q# W) b |.open "Old FileName","New FileName",offset: k$ q$ H6 C: t
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
/ M1 @) j7 |. k: {
" _* R# q; M5 g% C0 r; B例子:
2 _/ K0 `* G/ [( x, ]6 A* G3 G.open "1234.gba",0x08000000
5 N& H: B. ] v3 ]4 U/ | {: ^/ B+ n, S
.close函数和.closefile函数:
- O9 O# W$ j: u! t" j/ M格式:
6 f3 m1 B8 y0 a# _8 y.close
7 @+ K/ ^& ~% U) ^! X: Y.closefile
7 z# Q: W" g! q) T说明:关闭文件。- I3 c' ~& }6 V6 B
( C/ S: o' @" \0 l5 |
.org函数和.orga函数:3 ~+ g' @: R* V% y$ r
格式:% ^, ] l! K, k9 j; _+ w! [
.org RamAddress7 F1 Y- M6 ]1 X' W% a- C* C' X! ~# q
.orga FileAddress! \6 |8 \8 s, o# B5 H) g8 L
说明:
2 P& s0 H# ^9 E# S: J! W9 G前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
4 x+ e+ u6 u" g) q6 n6 h2 X. h b# S6 N
.orga函数可指定ROM文件的输出地址。
# q6 h% U) Z6 [9 Q" e+ h* s1 d- A3 M; H
.create函数和.createfile函数+ C7 {3 P+ L( `0 }
格式:
& _& o; E, [, @& ~: y: U% j.create "FileName",offset
7 y! ^5 N+ e6 A& _ v.createfile "FileName",offset( U5 `! J6 u/ p# i$ k; h
说明:创建一个文件,如果文件是存在,他会覆盖掉。
9 `1 c6 ^8 X4 G0 J/ U3 _
" X& I8 u0 B) ~$ d' ]- X& j.area函数) Y* a! x6 T$ c3 U
格式:: K4 N; r5 r0 F* M- P; w
.area SizeEquation[,fill]
; X' X# f$ n$ Q.endarea$ |$ n$ y+ t) T' R0 m
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败# `; v# ^$ N9 W( Q8 w w4 A
4 b- W& n: L1 j
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
1 w! e4 S$ a5 a# |org 0x100
2 m3 \: ]0 w) x6 h9 d.area 0x82 y' ]) W, o/ k) [! F
byte 0x5,0x6,0x7,0x8$ r3 x# U. T2 }
.endarea- \: X( F/ D( s+ k: _" U) l
$ I6 c5 s& v' c- ~% _
.align函数- o) Z+ X. @: L
格式:.align num/ @( C U6 c% y& \# n. A2 `
说明:写零字节,num为零字节数量,用16进制表示。
; c3 u: i/ s n8 d9 F; r4 r e
.pool函数
7 l$ e# l; M# {7 E. F4 r格式:.pool7 M' O. B8 A0 {# J- {: ]2 w$ a9 z `
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。! @; t1 W6 q5 ?4 N( M9 h0 J" I
例子:. e; K' P$ m3 S- _0 W
ldr r0,=0x12345678;
1 @9 {% r( S( |) @+ V...." {" ~8 z2 L0 A. E r! q* O; f
.pool( V. [1 a" d" W5 F
$ b! ?$ K4 _" b! w) l. K$ @$ a.fill函数& i8 t9 j/ H6 j6 s8 p2 y
格式:/ F7 M" O! p/ O7 T) W' l
.fill length[,value]$ i2 [2 V3 z1 e7 ]
defs length[,value]5 i. P$ D* ]) G' J( h) U3 F- t# ?- k8 v
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
& [+ D, w& V1 b2 h- @3 Z' [7 y% X7 i; U8 Z
.skip函数:
6 h/ U% @( ?+ S9 [6 r格式:.skip length& K" E. T7 s$ o5 m* j# \
说明:跳过指定长度单字节数值,length用16进制表示。
& n. j5 d$ u6 }/ f* D: \) X1 ]1 M, s! m) h; m. G5 `0 b
写单字节:
8 X) y) g9 Y( u+ u' T.byte value[,...]( \7 J& ?0 J8 e4 K
.db value[,...]
; n! j2 j( p1 @7 H9 L# o# D8 w.ascii value[,...]
0 A2 E- v% ^6 n+ B$ V- ^5 n* d1 L, x.asciiz value[,...]% W8 S+ p% c. p/ E- q1 ^$ a
dcb value[,...]
2 A: \& z& m2 i' O" j, B$ x+ R' h' P8 Q5 U% S7 R, A/ B4 N2 F
写双字节:
0 E# t' p. ^6 Q& y4 N.halfword value[,...]
% a0 f9 T* {) Y7 Q9 t, \.dh value[,...]
* v! B, i! a" _' Xdcw value[,...]
8 v3 D, D% I% y9 i m. b
& z, F- l M' {* @写四字节:
' w3 o) b4 x* N W! `: A& j$ C- P.word value[,...]
" h( H2 g$ N3 f1 E' j5 B3 `: E.dw value[,...] p0 L. p5 Q) x( X$ t8 X, l
dcd value[,...]5 Q U& z. x9 C0 Z
) v& l" v( E& F( K' n
写doublewords:
8 {$ x* U1 S. H& g2 J2 a.doubleword value[,...]/ ^3 j$ Z4 F' H. G9 j, w
.dd value[,...]
- H1 e! P! ^* t5 @5 z# Tdcq value[,...]
$ f0 O X$ h) P/ @0 v
1 M8 X* F) h# z4 Y$ i4 w写浮点数:1 b' C0 ^% ~7 V9 j1 x
.float value[,...]. e# I' W9 Y) }- l, z- G
.double value[,...]& w$ M3 i5 e" D
! g0 [3 n: J6 b% CARM的ARM模式和THUMB模式定义:, w4 q, t4 v' B9 R2 m" |
.arm|ARM模式
* I" x$ z& p7 V! X1 M$ l5 }.thumb|thumb模式$ S' f3 o+ }/ ?6 O- s
! V7 ^) \0 D' I1 I" U/ a- o
设置架构:
1 A9 [6 |# F6 X; ^* L.psx|PlayStation 1(MIPS R3000)2 `& b; ]1 I9 G$ d6 b3 G
.ps2|PlayStation 2(EmotionEngine)
$ H' @3 J. q' Y3 t5 c- E m0 V.psp|PlayStation Portable(Allegrex)
% l d( o. h; g* t$ k6 k* w/ z: O$ ].n64|Nintendo 64(MIPS R4000)
/ |( N5 N' Y7 V+ P.rsp|Nintendo 64(RSP)
. h" H6 X* T. E2 W$ S) H.gba|GameBoy Advance(ARM7,默认是thumb模式)
2 g9 H0 s8 w, V# O; Z1 A.nds|Nintendo DS(ARM9,默认是ARM模式)+ `( u) k" m+ D, g ~
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)) C8 ?- O6 y. }- f2 @& ]5 C- D
.arm.big|
2 c7 B2 B9 L: i7 f.arm.little|! a& n& u2 a8 |0 N0 b
9 |( B) I6 p% ?常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
0 @" H) o7 G8 n/ d7 k) t" b' C/ } |
|