签到天数: 2191 天 [LV.Master]伴坛终老
|
! c1 n/ i8 F7 z* B
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000! H2 G: b' y5 ]( q4 [
1 \" N: P% d9 _/ \ARMIPS assembler作者是Kingcom,目前发展到0.9版本
7 {! N* n0 v/ K! _8 \: k+ v8 R4 \# i
/ a* X/ ]. T/ [- x8 FKingcom's website:http://aerie.wingdreams.net
# b( B" o. B- F8 e; f: b; k3 V( A
1 C# G/ |" N$ z9 v4 \. g: v/ zARMIPS assembler源代码可去https://github.com/Kingcom/armips获得: s7 k' ~( t. j5 ?' I3 Q
0 l- \& u A) G( a& A1 Y
更新版本可去http://buildbot.orphis.net/armips获得
5 G4 I" _, {# F0 o1 U! g$ _2 ]) S7 c1 n4 @! I5 v0 S& d. r
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
) s9 g* i% A. c3 ^
4 s6 ]+ T; w+ A/ YARMIPS命令行用法:
9 f/ M" y9 M2 t: v9 t+ k6 b6 A& a: Z8 K: M5 G
Usage: armips [optional parameters] <FILE>0 o! q& V) W: ]6 e
9 T) K: W* L# j7 H8 B2 S# e
Optional parameters:
" y' @. A+ w' d; h -temp <TEMP> Output temporary assembly data to <TEMP> file
" q: U7 j# W+ k; |6 Z/ z0 p -sym <SYM> Output symbol data in the sym format to <SYM> file
$ P- p' a6 Y8 @1 V0 b" r -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file. P/ T" N" l. m
-root <ROOT> Use <ROOT> as working directory during execution
5 ?1 n R/ B* P* y' K$ X -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code9 B) U6 O8 Y/ T+ O. N. a/ t
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code( I# M9 o! _+ g+ d r9 s+ b
-erroronwarning Treat all warnings like errors
8 @2 g4 r* s0 ?3 @0 n) w" u
+ m- q7 k6 b, g5 V: x* i3 RFile arguments:0 K( A/ I) K6 e: Q; B8 }
<FILE> Main assembly code file
: ^. t( E( M9 O/ e. D6 m2 b" \- f( ?
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
. F% E V# T& N; d. \-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
3 j* Y2 C1 ?. C6 G) | i4 j7 V-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
2 T9 q8 k& [+ B' @' N! p! Z-root <ROOT>参数是指定执行期间要使用的工作目录8 s# x# |$ v; v, s* B
-equ <NAME> <VAL>参数用法不明( }# c) f+ U3 o# z* R1 o6 R
-strequ <NAME> <VAL>参数用法不明! `( W- t7 y" l: m2 G4 q
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
7 W: o9 L) `1 q( c$ G1 @- i6 V! d$ ~: V7 y) J
<FILE>是汇编代码文件,可用记事本之类编辑
* B6 x1 l1 J; M7 N& j' s
7 k4 U. @2 K( w) J/ ^& G3 _" A注释说明:
2 u$ F5 } v8 d. P/ s# u注释可在单行指令后面“;”和“//”添加
6 e; W: j4 c* X3 r“/* */”式也接受, S* J% F% Z2 f( d, N
8 U, M7 ^ d' n0 D5 V0 c$ K, `例子:
, g4 K0 A6 ~0 ?( X4 x.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
8 ~; k5 W7 R! I2 d+ H; X$ r) C$ \% A
- ?) N4 f6 l" G3 d) B9 P. o.close;/*关闭文件*/, W4 `" }* Z' q% E. k7 ^, J- V
: b1 R9 g' Z0 j4 k1 K标签说明:
& _9 P, C3 Y. u标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
, Y9 z* w1 }7 l- l" y3 k, M ]- Q; t0 t0 D! F n+ v
数值说明:
4 s! K7 h# J- x" e" Y6 ?) |“0xA”和“0Ah”是16进制数值+ e2 Z9 ?7 D& t4 C" j9 h F" F
“0o12”和“12o”是8进制数值
' }/ Y5 V9 d5 Y: F' t' H“1010b”和“0b1010”是2进制数值6 a& k) n1 r( g; X% V
$ _; I$ @* p. d
equ说明:
C- [' ?$ K, ^- u) e# m. ]% c# ]格式:text equ value
, I" l8 C, L9 R( v9 Q! [- P/ e9 J说明:用一个text代替value
- E( u5 g4 ~* L( g0 X6 M. R( i例子:8 q) @0 Z9 _( |; E
address1 equ 0x123456783 [$ l$ m7 v4 T& H: Q9 h
ldr r0,=address1
1 h- Y+ ?# c# x! c; ^* K.pool
3 X0 k8 \$ R9 s# w8 e/ O- l& T8 I, `+ B! D; }+ |! k! E
函数说明:
5 {% N3 e( H: ]8 f/ P* G' e! R1 |/ Q- Y! y
.open函数:: o; ^: w0 W' k; ~; O' f% f* m% Z
格式:
$ b1 D! W2 q } `.open "ROM FileName",offset
3 D& a. y, v# ~- Y! q: t; K.open "Old FileName","New FileName",offset
0 p$ M) _/ M: Q说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。. ^1 ?& \7 I' h4 W( e0 P
, T$ u5 B( j3 O4 M) H例子:
. _( O: Q" ~' i& a8 y% ^.open "1234.gba",0x08000000
" ~: b" |4 W/ D/ t" R$ X! `0 c; _# p
.close函数和.closefile函数:* m7 L- t1 c/ J: W& X) c
格式:
% {: X, }( ? e& X, u.close
5 k1 C9 H- N* M* x8 _.closefile1 u$ V- t9 E9 e( D) I( G
说明:关闭文件。: S! G5 i* V; f0 a" \0 E
/ A: r8 \# z% U' `- k% G8 I
.org函数和.orga函数:( X4 F3 j9 { H, D
格式:
; ^8 E( z5 f7 ~/ C.org RamAddress! f7 ]- }8 [6 @+ b* S
.orga FileAddress, F$ v2 ?8 x& m0 J
说明:- q- x+ j1 t" G2 T) ?. I
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。7 d* ?4 z/ O; }8 A$ C0 Q
6 o U$ n7 y2 p O.orga函数可指定ROM文件的输出地址。
" r# x% q/ Q6 C; X2 z* E# c( {. U7 R1 M: [% Z+ g% |8 g, H L
.create函数和.createfile函数3 s( H5 g# I, J* z" J/ ^
格式:/ b% f8 N6 s, D5 I% v
.create "FileName",offset
6 C8 @! y3 z9 R7 b/ p. h.createfile "FileName",offset2 g* S3 l Z7 @5 h) E7 ` v$ {
说明:创建一个文件,如果文件是存在,他会覆盖掉。
2 m9 [+ O/ R e2 B
8 J+ \; d ~( A: r5 c/ J0 m.area函数
; y/ N$ G$ N$ V8 H/ X) m/ z" e格式:2 K7 Q3 B7 `( x X0 G a
.area SizeEquation[,fill]# {+ s% ~# @* X& w. t. s9 z* _. O
.endarea5 f/ h# ?7 N3 I5 |& o4 m4 [
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
- y6 ~( }$ J% M4 C2 f: I5 u1 ?
/ \) C8 {/ _" y3 ?8 H例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
8 o: {! x( T- x; m" p! m( Y( Uorg 0x1002 f2 B4 o& [9 N9 i# z+ J
.area 0x8
" z- L* V- ]% \- x( H$ n( tbyte 0x5,0x6,0x7,0x88 U' C/ Y& G% K& Q1 G# q
.endarea
% G+ f2 C V1 T' D- {8 v. c( B( w" y% g
.align函数
: Z# Q3 B7 P# H1 }9 v格式:.align num3 g: ]3 H4 V* Q- E
说明:写零字节,num为零字节数量,用16进制表示。6 ?- A; l3 f6 S5 Z$ E
B1 q( y6 @9 L- y9 t7 _+ f9 J, P3 M.pool函数
z8 J' e. \- ~. Z0 o格式:.pool
6 z I) M/ I! k' o+ `( B( D, s说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。' V/ \( K. I4 D2 Y
例子:
5 h' d8 Y% x7 W3 Rldr r0,=0x12345678;6 Q# x2 m" s$ A0 q6 S. S9 P
....
: X* m y0 T- `' h1 B) W.pool7 M$ [5 H/ a" f5 b9 \
# w& Q4 r1 Y- @.fill函数
* ~5 y0 ]# L9 ]. m1 D3 R$ Z格式:
" Q. }8 W+ g: c: B( k.fill length[,value]
- J6 s+ Z F- ~; D# [defs length[,value]; ?- a" B) {" G8 I& h) y ?& q
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
r, }: |9 @+ p8 G& c, ]& B' }7 v4 u3 T! o4 K# i! u
.skip函数: @" O( u) V- V- A( l1 T
格式:.skip length
8 L& |+ t, \9 h9 M$ n. z3 V$ A说明:跳过指定长度单字节数值,length用16进制表示。) R ]2 \; {8 N. C Z3 d
; J2 H* \; c3 P; G写单字节:; A4 c% P* `5 W1 L+ ] o- d
.byte value[,...]
. i/ A! n; O9 ]0 ^1 Y6 Q1 C.db value[,...]
. m( c4 P9 d! A% s8 ^5 E' {8 @0 O.ascii value[,...]
& _8 M) A4 |! d) N/ @2 Q% G5 Q- _; M.asciiz value[,...]2 @; j Y8 S5 \; p& q4 K* w: t
dcb value[,...]/ M b$ j" R5 f* z( F5 \% I
) @$ J: X( U. @' y% D! e写双字节:
) n0 ^9 i& ?, q.halfword value[,...]9 N* y. v3 I* M" `
.dh value[,...]) v! d/ s9 s* z$ `8 O: A+ ~* T
dcw value[,...]
: V" A8 L! T, n# L/ j* e$ }8 V9 f$ G/ i7 z" m( A2 H, `
写四字节:0 |" E4 a! A0 T
.word value[,...]! G% x2 W7 @1 h+ @, O% i
.dw value[,...]
9 r6 r5 M" L- W8 r B" Odcd value[,...]' s5 A- ]& s1 p$ C5 q% j6 N
@" E' C9 z T6 C$ \6 S: R
写doublewords:- z' ?% W% P. k2 j! c
.doubleword value[,...]
4 J5 K1 n$ M8 l A# C.dd value[,...]# v6 |$ _+ p. M( ]
dcq value[,...]
/ L! f7 f; `5 O; |! m1 @1 y8 A! j* e, V7 H& @& K
写浮点数:7 Q$ ?" I$ y( m
.float value[,...]
3 }( j# N, X, l# ]& B8 R! C) b# i.double value[,...]
) N2 l* k$ x2 ^1 l7 w1 H5 d1 i1 ^9 R) j( `
ARM的ARM模式和THUMB模式定义:1 x5 n+ v( q% J2 V* u' N
.arm|ARM模式0 a( g1 Z2 @/ b
.thumb|thumb模式
' S, H5 K t$ \4 j* E2 i7 }* b; l8 z
设置架构:; f) W+ U$ e% K& f4 w! i3 G# t
.psx|PlayStation 1(MIPS R3000)) K/ E& x3 B$ A- r) Y
.ps2|PlayStation 2(EmotionEngine)2 B: U! v6 e- l7 y! T6 |
.psp|PlayStation Portable(Allegrex)7 S0 K8 z& m: Y5 B6 E( k5 r
.n64|Nintendo 64(MIPS R4000)
' |, L+ m1 i+ |6 U.rsp|Nintendo 64(RSP)
. X# D7 R* g2 ?0 l6 K$ `/ [.gba|GameBoy Advance(ARM7,默认是thumb模式). P6 s& k6 G7 z( N9 U W
.nds|Nintendo DS(ARM9,默认是ARM模式)
, }: F5 b- L: o.3ds|Nintendo 3DS(ARM11,默认是ARM模式)% G+ x& a7 N; b/ t# S/ p
.arm.big|1 ]& p& Z' t, w. [- t _4 [$ Z
.arm.little|' p, b0 k7 U/ b8 E7 a0 C
1 [# G; [& R; _, D- u8 V0 g2 |
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。% e& r. P' P1 p2 c1 @9 a1 Y
|
|