签到天数: 2142 天 [LV.Master]伴坛终老
|
v: T4 N9 R' I/ J% R% N9 z1 N3 f j; QARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40007 ~" h- V( t0 `( h" `
* l. u7 B' F0 g0 s1 ~; o
ARMIPS assembler作者是Kingcom,目前发展到0.9版本/ C0 q$ c( G+ U i' W6 d1 L$ E+ ^% f
& v0 m( i9 l8 X, }Kingcom's website:http://aerie.wingdreams.net a$ h% R, A* @ w% N8 X* C
/ T) D$ j* e% Z _( oARMIPS assembler源代码可去https://github.com/Kingcom/armips获得( p3 q+ }% n3 a4 h
# U% D6 u7 t3 W, d4 L1 X更新版本可去http://buildbot.orphis.net/armips获得
0 C/ h( j- K' C2 f% h
9 L# T f8 j5 F0 Y' s. G: wARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
8 Q& y3 @; V1 ?3 X+ a; o( ^0 h. M* ]" \
. l s, M2 R/ I5 _ARMIPS命令行用法:" H$ r( o) i; |
. i9 h) [$ C/ R! U/ |Usage: armips [optional parameters] <FILE>
& S( V& ]3 @6 }$ z6 X' w! d( ]! c8 d+ `# k
Optional parameters:
% X# H1 b& g! R9 M* [0 D -temp <TEMP> Output temporary assembly data to <TEMP> file
; U9 r u# _9 R! v& W -sym <SYM> Output symbol data in the sym format to <SYM> file
5 k0 }+ r4 V; C- o s -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file2 G3 @; V' ]7 |$ W) t$ C- m* R
-root <ROOT> Use <ROOT> as working directory during execution Z. |$ V) r* b+ ^. _0 Q/ I( F
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
" ]! X. T; z# g1 [ -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
" A: Y) u: [# z9 B. m4 h& h5 W* K -erroronwarning Treat all warnings like errors3 ]4 d- @" W) `. c2 w8 a# y( z& q. C
# V t) ?7 M1 h
File arguments:
4 T" F c6 K! H5 B& {, Z <FILE> Main assembly code file8 q2 P6 f, k9 B* i# D" \
7 T$ E+ `6 G; P/ Z. t* P-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件$ M4 x' ^' b, v( Q6 N) b, y
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba" g) o2 q( L0 T$ S! p* m: M' e" {2 i
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
3 b! y+ Q2 z/ k. w, W4 R* ]-root <ROOT>参数是指定执行期间要使用的工作目录
6 a ], k. r7 z# z! ~2 ~* Y) E-equ <NAME> <VAL>参数用法不明
5 S$ ~; F: W5 y' L$ n-strequ <NAME> <VAL>参数用法不明
3 a& H) w, S* r-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
+ p3 i- L& o3 X y" k, U h+ W% V% D; }
5 J+ v2 Z7 l/ p, Y& U<FILE>是汇编代码文件,可用记事本之类编辑7 B* U/ N7 Y" ~' ^' \
! S. i: M7 G' k+ t! x4 M
注释说明:
! N7 H5 C; e' ]$ i1 U* S注释可在单行指令后面“;”和“//”添加
4 F' y7 ~: Y! m& h0 {“/* */”式也接受; `$ l' P, }7 F* @5 _ r" @
7 o3 U2 |' y# P/ M
例子:
, F9 D' u$ C" \2 U7 c: x.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000008 f) _8 T* U0 Y3 h
4 X5 h7 `% b- }8 P, q& Q6 |$ [7 g
.close;/*关闭文件*/* ^( `5 h' S; S
% m4 `& h! ]. P, ?, P% v4 ?
标签说明:
* c! _; K& b; o' w标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
/ S; n# I4 g8 B+ O3 ~9 k
W) h" h+ T. I数值说明:& o3 v1 U4 f5 n$ H) r2 p
“0xA”和“0Ah”是16进制数值: v" i9 r: V6 J8 r$ ]
“0o12”和“12o”是8进制数值, [* H; B* K! P
“1010b”和“0b1010”是2进制数值
7 P c( Q7 J" Q( b e+ B7 Q/ \
7 V" u) @% K5 aequ说明:1 x; f& Q- d! M/ `
格式:text equ value
7 i; m x9 l S9 q; y$ |5 T说明:用一个text代替value
$ N" T' U( r5 E0 `! G, q$ c/ ?例子:4 Y: N% s1 g \8 x; ~
address1 equ 0x12345678) S, U8 |% S. n: X1 J
ldr r0,=address1( |7 e" M. w- }+ A0 o. |8 i8 e2 Q
.pool$ e* u* u$ p$ S. L8 a
( C- G5 t2 g( D1 _8 k+ [函数说明:% H- U6 q) d: v, ^# O7 K( }
, b* Q2 H* O, w& n
.open函数:* d" O; m+ z, Q# `3 `
格式:' X/ ]4 H$ K/ g) S
.open "ROM FileName",offset; M* r3 Z- p, S. |- p) Q4 e6 S
.open "Old FileName","New FileName",offset
2 C4 W5 [% L4 Z+ ?说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
0 M" b/ h+ I% n# ]4 _0 a. J/ ]$ r, e/ y8 C8 g. [
例子:
* x$ o; i3 f: s1 c) ^.open "1234.gba",0x08000000
+ @" A/ [, Y7 c- E" q3 Y: L% e$ e- p* C- J
.close函数和.closefile函数:' {& E O2 B% [& w
格式:
$ U/ K7 X& F! L% h.close. O( o S# P& o
.closefile
% Q0 l5 L: R- A说明:关闭文件。( u% D5 A4 w% L3 F) x
2 Z+ G0 h- R! ]% D+ X8 m, v) o
.org函数和.orga函数:
5 T1 L6 d8 T* l) m( f3 t格式:9 V7 {1 T# ?! t
.org RamAddress
% a2 \* c. @) r1 K.orga FileAddress% }: k7 K+ a* Z/ L E) }
说明:
3 _$ u4 x2 m' J& |* w% u8 P/ Q# m前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。: x3 B$ @7 y$ Q3 u3 q5 O7 ^
. B, ~% o% ~/ q* y( R: x& Z$ W( p3 N
.orga函数可指定ROM文件的输出地址。: ]+ p5 z" g& t1 k8 T+ c
6 h) z# [, M) u.create函数和.createfile函数) a: P2 u# b1 j, G
格式:
% d- v! O+ U: z8 _* z |' s/ K3 s.create "FileName",offset
; c6 L0 u' u& E7 a.createfile "FileName",offset
' u0 F5 V( e7 g% z( w6 Z- q说明:创建一个文件,如果文件是存在,他会覆盖掉。
& p i; I0 k. \- C n1 R$ Q* {9 t; ^
.area函数
7 ?4 e# C! z9 ~8 J, Q- O" L格式:& e4 e* D' ^* H+ v- Q
.area SizeEquation[,fill]* L2 D% d7 ]# V' ~7 y, N3 B/ ^& L
.endarea
( d6 |2 j' Q4 Q1 Q4 N说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败( a; {% x) m2 h. w8 W$ h3 F8 K8 k
- K# y$ t( o6 c ]3 t" [% `1 y例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
( k) ]- F' j" m( ]" torg 0x100* P( w( N# P/ o( o( m
.area 0x8' H8 Z3 B* p4 l! L+ e; p0 w- K3 p
byte 0x5,0x6,0x7,0x8
# P( G, j: x2 `.endarea
; T1 R4 J Z) R% X! K+ Q- @- }6 }) Y6 n
.align函数
) |) B; @6 x Q$ |格式:.align num4 F- O( \6 d$ V7 J9 r" u1 W( D5 p
说明:写零字节,num为零字节数量,用16进制表示。: x( Y" ~& f2 q+ {
$ ? T# | c; g) ~1 p, ]& Q
.pool函数
( K6 |$ V7 o% x格式:.pool
( A* d: E3 A" K说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
2 f8 l% N" h( K4 E8 X, u例子:
$ r; H. i. m$ |ldr r0,=0x12345678;
$ H2 w; N' u( f....' h) t9 Q+ `9 N. S
.pool
. D! k+ \' c3 K& o3 o3 E3 Z; K* k; {3 x4 J% y
.fill函数( Z: A: U) _ o' E) t
格式:$ c4 M- E( }* _( [: S
.fill length[,value]3 |0 B7 `' E2 a' |/ k
defs length[,value]0 |# ?1 H0 a; ?. j. P
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。) s1 @3 ]& Z9 u
5 q" ]# k1 @2 @7 ?( {; k: n, `# y; x.skip函数:
: Y+ `9 {; y. }4 n) Q6 W格式:.skip length) O) s; @# L, n3 x
说明:跳过指定长度单字节数值,length用16进制表示。
" C1 m% A; c1 S: h6 U1 j E
- a9 e% G4 [0 Z! Y( g" E' e写单字节:0 ]4 u6 e: H6 d, C
.byte value[,...] @5 U( ^' y0 S) H4 v7 E
.db value[,...]
q9 O% f! d3 ^; B# ^2 D2 ^4 m2 G.ascii value[,...]$ A5 x8 l7 D& {# Q
.asciiz value[,...]
. G+ X" B8 y' c0 r. F4 edcb value[,...]
0 h0 F7 u% N. ~/ r
* k$ A/ s ~+ @4 R写双字节:5 F4 X5 i4 K6 v0 g
.halfword value[,...]$ R7 \: o; z" |7 }( |. t5 }! c
.dh value[,...]! }# e$ ?/ F) n$ R* E7 R: _
dcw value[,...]( I7 l0 }2 u1 b) S
* T0 L2 }' q; D& v) I+ G写四字节:8 g& C/ \8 V+ ]9 r
.word value[,...]
) \% z+ J1 s" W: k7 V.dw value[,...]
/ @, c/ v$ x+ s- y4 L$ sdcd value[,...]
/ D. w5 g# x+ s8 ~4 \! C8 |
9 F- m9 R* g7 O* N写doublewords:
) w) g4 ?- A. Z) h& G.doubleword value[,...]
" v! Z6 W1 f. d- [ L.dd value[,...]# |3 W9 `" u4 a' l8 |
dcq value[,...]
9 n$ |9 Y4 c$ F$ M# Q" d0 D9 n; y. Q6 J& X
写浮点数:& Z) D0 L3 c6 Y: b( z2 }
.float value[,...], g4 y# @* u+ e, x5 V
.double value[,...]
' f- i8 ~6 z7 q1 O1 r1 P& g" Q8 J
ARM的ARM模式和THUMB模式定义:
5 O7 q- V4 I! y.arm|ARM模式
, ^' i7 }) w ~6 ?6 j8 ^.thumb|thumb模式
5 J2 `6 D3 _3 o" f4 ?
$ p! C3 K& S7 x2 J% O设置架构:1 z6 n% I& v+ m& x
.psx|PlayStation 1(MIPS R3000)" n* c7 y4 B+ a- n0 N
.ps2|PlayStation 2(EmotionEngine)
2 T0 y# V7 W/ ]/ v9 c.psp|PlayStation Portable(Allegrex) x$ N1 o; J7 M# k' ?
.n64|Nintendo 64(MIPS R4000)' Z7 y2 d M2 N2 I
.rsp|Nintendo 64(RSP)
9 g+ \5 H9 i4 B, r _8 Y- S% F) m.gba|GameBoy Advance(ARM7,默认是thumb模式)
6 {9 P1 U5 x) S1 D7 l0 Q( `0 Z# K.nds|Nintendo DS(ARM9,默认是ARM模式)
/ c P" p; T/ i' N# c& f7 j.3ds|Nintendo 3DS(ARM11,默认是ARM模式). a: u( R F- m
.arm.big|3 C' z0 h4 B. W) _/ s
.arm.little|
& s: n% V9 H" w$ K0 r2 l
V: n+ K7 s2 r4 S \4 ~' x8 F5 |常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。2 J5 p9 B9 ~- P0 S0 s! V1 l
|
|