签到天数: 1927 天 [LV.Master]伴坛终老
|
k+ C8 u% B; {" ?ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
* E) N7 f$ Z! C& o
, _' \7 K! c( \1 JARMIPS assembler作者是Kingcom,目前发展到0.9版本8 V. ]' O8 K, Q) ^2 f( C
! M- f+ m- Z9 l# H' T" _Kingcom's website:http://aerie.wingdreams.net3 E* j2 |, z. ]6 A
0 u g3 @2 F6 s! R0 ?$ h
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得4 P: C+ O" [; B- T
. B& _: {3 s' s: s+ G5 t1 x2 D
更新版本可去http://buildbot.orphis.net/armips获得/ S0 ^/ V/ _# j( M/ j/ D) y
' ?, b% Z1 `- q# q/ W* ^: B# K
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
0 f9 ]+ R2 Y+ m4 l: t6 L8 D5 M2 N1 ]7 B; Z0 ]$ P6 }; r
ARMIPS命令行用法:- t5 z; A- m. j& b# X$ Z
5 r# x1 O- x9 K G. Y5 b2 J, A( TUsage: armips [optional parameters] <FILE>; L+ w' \3 M2 @) g
& _: k5 Q7 A H2 }
Optional parameters:
' z; }7 W- ~6 N0 d -temp <TEMP> Output temporary assembly data to <TEMP> file
8 A9 J U& i% P0 R5 j3 k, C -sym <SYM> Output symbol data in the sym format to <SYM> file
. @, S: S, Y p( j) N8 O -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
* I" C! B$ M5 O& ]0 J' V -root <ROOT> Use <ROOT> as working directory during execution
& [* n/ i) i- Z/ A% Z( E7 Q ` -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code+ t/ t3 M" [( R9 C* k
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
4 p# L! v! J; N; o: X% q6 }# } -erroronwarning Treat all warnings like errors
Q7 Z* @% `; m; u. c M3 o4 Q5 e; v; R) Y+ h9 @7 g
File arguments:
; N" v$ W/ y2 `1 y <FILE> Main assembly code file) M: k6 Z9 }, T$ G- x
) R X/ Z* ?9 T2 F/ h. P-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
Q1 Z* D5 e/ A6 N# O0 ~-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
3 Y) j7 O7 K3 ^4 J( f# M-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp1 T: k3 k: \# K8 H# D; k
-root <ROOT>参数是指定执行期间要使用的工作目录
7 Q6 b/ {- j2 k-equ <NAME> <VAL>参数用法不明7 W+ K6 y8 r6 s8 f& H/ i
-strequ <NAME> <VAL>参数用法不明
3 Y$ ]3 u1 D# v- b/ x; L, V& n-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译+ M+ o7 y9 `9 C
6 _( \# U6 h# O3 z
<FILE>是汇编代码文件,可用记事本之类编辑
; m* R; [, k/ o0 f' y+ R" t; c
8 C9 l7 y7 r! ~( [' F8 M$ k C. \注释说明:+ d- ?8 C# C2 ^. ]
注释可在单行指令后面“;”和“//”添加- R* Z* E7 Y. |. [: n; ^5 C- @
“/* */”式也接受
& U. D2 \. D. X9 U/ n+ L2 m; e: W5 D7 s% F0 n6 x( R
例子:
' ~7 l& _# w" a, |8 u.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
! a* U: z& }; D1 o/ w) H$ M8 e6 q* `6 \: `7 [( ?+ }4 x8 e/ c
.close;/*关闭文件*/
4 G- V2 S( m" e2 K! ]9 ]- m4 z
3 h+ l, M4 ]0 r; a6 ]' r4 O标签说明:; [; C, n6 }' ]0 q
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
7 Q( X% r1 h/ t0 |0 W6 r+ w+ G- u ^5 J4 q4 i) {0 P2 k: D I% ~: s
数值说明:
/ F* T: C* d0 t: d. a“0xA”和“0Ah”是16进制数值
8 |' |' x; k6 d; F" Y4 k8 w“0o12”和“12o”是8进制数值2 g8 F6 S4 o& |
“1010b”和“0b1010”是2进制数值; r9 F( H' `8 t% l. J
9 X2 M, G# S) x2 U" M4 R; J* u( [
equ说明:
, w Z/ _- |* U5 m( x格式:text equ value
3 J. Y5 B( Y# V* l. k说明:用一个text代替value
4 X0 y1 _8 B% U例子:8 A! D5 t* E( }2 r4 q
address1 equ 0x12345678' D1 w& I' r3 G, R4 t1 d) b; ^5 o* H
ldr r0,=address1
# R- S4 B2 N7 q' e$ u.pool. p4 V, g# x* p: W
. b" k8 s( L' u! J: V% q8 r3 p" \函数说明:
: P% {3 z8 ?7 L$ ~2 p) z/ |9 v( d( O/ ]' {: T9 N3 D
.open函数:
" K5 a; h3 {2 R% k格式:
% a* O' \3 F# y$ H3 ]0 s.open "ROM FileName",offset% L a) @: H- r* k4 ?* z' C6 F) `
.open "Old FileName","New FileName",offset
: z/ `' }, u2 I4 w1 _$ U说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
# B7 Q3 A- D* I, l$ }, o$ V3 j u* c3 f+ z4 w8 S9 t4 |
例子:7 H* c% ?$ c# Y# ~- Y7 E% i
.open "1234.gba",0x08000000+ ]* @2 {& ^1 _$ n3 k% C- G
$ s- g& j) U4 P) ~5 m5 r6 V/ n
.close函数和.closefile函数:
7 q2 s2 v7 q+ ]2 B7 W/ {7 T格式:
! b1 ?, j& g; ^1 L2 ^: f( A5 p% [" M.close6 H- k* N& ? m- m& }( C" X) C' i
.closefile
, H8 V) E2 O: ]+ |' @9 g8 n/ w6 U说明:关闭文件。7 \8 n0 e% H: T! E
6 y( V T/ K4 @6 |3 v
.org函数和.orga函数: {5 w9 s. i9 w% z
格式:9 _: s9 G. f3 V" o, U
.org RamAddress, V5 ~9 _! y) O
.orga FileAddress
: a, B! b W: Y' i5 b- \说明:6 m" j& g6 q0 u- j2 J
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
/ u3 V' \" m- k. `' y7 A
1 H4 D0 _9 U; Q1 v.orga函数可指定ROM文件的输出地址。: Z1 L9 S X ~( |3 R6 E/ U+ N* w$ j1 @
: {9 d1 l# v9 d, G
.create函数和.createfile函数
$ B0 Z F5 f9 V- y( ]格式:; O$ p# j: r9 Z& Z" }3 L
.create "FileName",offset+ t$ Q* M& a: W3 t- @ \
.createfile "FileName",offset" ^3 ?7 L4 x$ d! z- B
说明:创建一个文件,如果文件是存在,他会覆盖掉。
k. g" Z; X5 t8 U/ w7 k- x/ E0 r- w. l
.area函数
) {. [9 u+ R0 P- y% x% F0 q格式:8 E; H) j' N7 H+ l/ Y# }
.area SizeEquation[,fill]
' P t5 d$ X. W3 o.endarea
8 s1 f7 y2 S. T& ]说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
# Y4 @% q. ]- s, d2 E1 t: @
6 J+ b: R* _7 n }0 N H. r例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据. B0 e1 n. I# F! J4 [ B _
org 0x100; h. S+ v: g9 e6 _
.area 0x8
$ D4 {4 _9 [# ]byte 0x5,0x6,0x7,0x8# v) l0 u% a5 P. F0 \+ k# s
.endarea
9 V& l3 G" S) n3 X5 N
6 y* Z3 n/ q; x7 h9 l* c# q) T.align函数
/ Z8 C3 k- e3 X) y. B' ?/ y格式:.align num
. B# E+ R- k5 A, J说明:写零字节,num为零字节数量,用16进制表示。7 f2 c) P- r' B' B8 v/ U! E$ L2 @9 v4 l
# j0 ], |. z3 R8 `
.pool函数. N$ h$ }( ~' W8 o4 A
格式:.pool. @3 F" A3 y$ ]* B
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
u2 g' b" t0 g( S& C例子:
. L4 {& Z3 v0 r4 l% ^" Fldr r0,=0x12345678;- f; F1 R7 p% o# _2 z- J
....6 D" T1 U* N& R/ B8 \
.pool
3 e) Y/ C, R# X2 [2 w, c6 K- C! D/ I+ `' W! q R8 {
.fill函数
5 J7 z2 P- i( S, N! B9 p' `' n% L格式:
# n1 ?& T: p1 I% Z( a7 X% F6 ^.fill length[,value]
# {' C- j' ]; |6 _5 w$ @defs length[,value]9 T. |0 g7 i: r- d, [9 ]. D
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。) @7 _) D/ h- Z4 Y- x5 S( R- O q# q
+ f* @; |8 Z) S6 }.skip函数:0 H) j, V, m0 R! {
格式:.skip length
) R8 Q2 _; f9 N' d! u- I说明:跳过指定长度单字节数值,length用16进制表示。2 l8 p, R8 V; }
# T1 ^9 j- P% Y
写单字节:* X& X# \; r3 d6 R
.byte value[,...]
2 M4 F. g* B5 d8 A5 Q( |.db value[,...]
; H. u1 T) o' p8 h. a.ascii value[,...]
) z* T/ D' T, r" J3 k6 w.asciiz value[,...]3 |0 f8 ^0 C& r6 ^: C! Z# E6 l
dcb value[,...]$ V/ n% X4 U% X
% v4 _ X8 n/ [% B写双字节:& b7 n2 f- }/ U2 X
.halfword value[,...]5 H' }! G$ ^% X) K# K
.dh value[,...]' E. M" C! m! ]" H( e
dcw value[,...]
, Q/ b( f6 v6 T7 j g2 n
# c3 U% Y6 k+ |8 h% @: Q) _' A写四字节:
; P6 t- V" i }3 b+ q.word value[,...]
/ @+ M: W7 ^. p.dw value[,...]
" ~# w% T; }5 W# I" B' m8 |dcd value[,...]
& X" D/ J1 a) D6 U" S8 m7 p! o8 ]- ^4 E; R
写doublewords:
' m- e4 o! f3 w' U' ].doubleword value[,...]2 M ?# S; S+ q# E
.dd value[,...]/ c2 q% J, @8 w4 D& S' O/ o
dcq value[,...]
5 Z' ` a1 d' Z9 c4 p6 F" O$ |; D$ U R* L6 J; a2 ]' t; U% I
写浮点数:+ P- J% U* I4 w1 q5 A, B0 ~& P
.float value[,...], i0 E2 \+ a: g# t; s6 q* a+ |
.double value[,...]
" ~$ x6 B+ K( v
$ {4 O& _, X5 ?5 O/ [" p! V* U9 eARM的ARM模式和THUMB模式定义:* D; ~. A3 z) f6 R
.arm|ARM模式
6 ]! `5 [: Z$ \) f.thumb|thumb模式
; W$ I; g/ ~ _. ?% I' K0 r' A! M( E P* @$ n' O! z. U5 T
设置架构:+ {) Z3 n; Y e* ] R% x
.psx|PlayStation 1(MIPS R3000)
! Q3 d* f; G# X- l m.ps2|PlayStation 2(EmotionEngine)% t' b. G( Z( b M5 K& E
.psp|PlayStation Portable(Allegrex)
- y! v6 ]+ v% E0 i" N.n64|Nintendo 64(MIPS R4000)5 t* b: ]4 |# P9 h' \ c/ t$ W
.rsp|Nintendo 64(RSP)# L6 X( } S x* e9 L) x
.gba|GameBoy Advance(ARM7,默认是thumb模式)
% L; m* V8 f, @.nds|Nintendo DS(ARM9,默认是ARM模式)& c' o6 m x& I
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)& S9 y4 [0 u- E2 M: ?
.arm.big|0 {5 `3 T, A+ \( A0 ]$ x' b, z
.arm.little|
# o; x) D; U6 k: B" L0 X- d4 B$ i9 U( _ G
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
3 p6 I. {* {# ]* ] |
|