签到天数: 2074 天 [LV.Master]伴坛终老
|
}8 v5 a9 O+ u5 d+ A$ iARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000, {" y; B3 `" W; N- h
4 A7 Z' a$ P* C2 NARMIPS assembler作者是Kingcom,目前发展到0.9版本
j, a- z4 ^7 O0 \9 @
5 M' A/ [5 w; G( nKingcom's website:http://aerie.wingdreams.net
+ {. M9 { ]3 E' z! n: q
y0 r# a1 X( ?& G3 |- w+ b2 i9 }ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
% G @7 Q# g! p* y$ o! f; l3 O0 T) u' m& n; c; X
更新版本可去http://buildbot.orphis.net/armips获得
4 M8 [6 k. w6 h, {
7 h2 P Y2 p3 e# BARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。) e# ^! _& P( C0 m/ f
! `3 K8 B; K- X3 ^0 oARMIPS命令行用法:& [) ]7 d3 ~' V7 @
K+ S' v6 X- g' EUsage: armips [optional parameters] <FILE>: \0 P- _9 ~$ F, h9 h$ P) s
9 x; h! k0 a' e7 ~/ `Optional parameters:
5 c- O( k0 q2 b+ ?, J2 p -temp <TEMP> Output temporary assembly data to <TEMP> file7 L/ ^+ p$ h9 N. R! O+ l
-sym <SYM> Output symbol data in the sym format to <SYM> file
7 w; T( J: j+ u; A5 I( R -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
+ Y+ o: q3 g0 m3 O -root <ROOT> Use <ROOT> as working directory during execution
! y" ]% W5 F( k -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code z `: J+ F) I5 w2 Y
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code4 K7 q# ]$ I. f3 f h3 F
-erroronwarning Treat all warnings like errors
9 {5 S' E8 [+ m
P' ?: S4 L! Z, uFile arguments:! ~' l% o; V7 T( u" j- }# J
<FILE> Main assembly code file
3 I4 \6 F# P3 @& l0 x' T) A: l9 u6 W. i% Q
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件2 E" E& w( ?3 d, c5 j$ A
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba; t; g# _1 @3 P9 ?3 H
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
7 z; Q5 ?- B7 B+ `+ k+ |1 ~-root <ROOT>参数是指定执行期间要使用的工作目录& y, `! Z3 `2 }7 _: \6 S
-equ <NAME> <VAL>参数用法不明
. I6 K! g5 F- b# @! W) ]$ Z-strequ <NAME> <VAL>参数用法不明8 G, o- M1 c- \$ j, \
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译4 b3 w: ]5 x! H) C
- L# J1 s8 G6 i$ ~8 n# b
<FILE>是汇编代码文件,可用记事本之类编辑
: Q, P4 r h) P( N, F$ O
& q/ x! V( K& F1 }" S [注释说明:
% u* x; s. e1 C7 l" ]4 V# ]注释可在单行指令后面“;”和“//”添加
8 @6 f5 R* F4 a$ y- E; u“/* */”式也接受; H% \# G1 P' R% R3 F8 Q! n
1 _; C$ z' q& z- @; {1 M
例子:
f& Y' H a$ h N' q- l% M.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000) w+ b2 {' m3 X M
+ }6 D' ~+ V% m5 \7 g.close;/*关闭文件*/
- g8 e* i0 i. `, S) q' R6 u8 g
. j% [7 q" K$ i% j* `8 }标签说明:# R; B# _# `0 E0 v' L% W" \7 L
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。6 i+ ~! U6 I2 t F. Z% t
; c) ]7 P/ H3 g; S9 Z
数值说明:
6 l" ~9 ^; h$ d) e) Y5 s“0xA”和“0Ah”是16进制数值
9 ^( d1 r8 L4 Q) ~0 v+ T4 f! n8 E“0o12”和“12o”是8进制数值5 X. d% B: a. W/ v. m
“1010b”和“0b1010”是2进制数值
* l8 z5 g1 K% h1 h
; f6 A% v0 F, K- x% B/ oequ说明:7 v/ q& U2 ^! L, _& T* ?' Y
格式:text equ value* l" j- z4 P* v2 z8 F, ^4 d
说明:用一个text代替value, @" v- N: C8 E' ^8 Y* x
例子:+ @; }, c2 D) ?
address1 equ 0x12345678
: T: U: V5 R9 Y; N& c. Gldr r0,=address14 n9 V4 U* A! p& p4 K& ?
.pool
0 P+ y9 c `& W# E- z1 F/ E! H
3 z8 {( n! X* | Y1 U% W# Q函数说明:
9 d; i/ q4 i( I' T/ X! _% b- @" L+ W- {
.open函数:( e# W; _% i1 d1 e
格式:
8 z/ _1 J" z4 l' n: L) C8 k.open "ROM FileName",offset
' A" }! T4 A" e( l* U.open "Old FileName","New FileName",offset, v- T9 N+ N# K+ ]
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
( J+ t' e- M. W6 O' v2 Y) T+ j( z+ m+ g- O% C* b
例子:
# n/ Y% H" X% m! ~. E5 v.open "1234.gba",0x08000000
+ d4 Z2 b; n1 |5 N& ?
0 l% S; [" B+ K1 A.close函数和.closefile函数:
: O5 B- r( y" j# K8 @& w9 J/ v# F% K格式:6 N1 C- l8 Z9 {4 B# [3 M
.close
: X+ d' L; X5 T.closefile
9 u$ n$ M! S$ U9 ?- U说明:关闭文件。5 b& m0 C4 h8 [2 k9 k0 X! X }+ E
3 ?+ |! ^% ]! R/ ?3 r1 q- y9 R.org函数和.orga函数:) N* ^$ s1 S5 g/ b1 B* N7 w2 n
格式: Z0 |2 F& O% l7 @' p, @
.org RamAddress& G* B) G# P/ I& I& t3 c* |0 s
.orga FileAddress( [0 C) @. x2 _5 f. v; ~) b
说明:( J- e" R% N* e5 Q3 h
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。8 b" N( v( T# |) l J# m* `) M% D
/ ^6 A% L+ w9 {6 V
.orga函数可指定ROM文件的输出地址。
4 @% |+ W7 h9 K+ }5 _$ c6 W' B
$ Z/ [8 U2 s( H; F- g+ _$ Z.create函数和.createfile函数
7 O Q+ @4 q/ B4 Q格式:
) Q7 p+ q' y# x; T6 U0 A, c y.create "FileName",offset# S+ I' M( e' g* @" Z
.createfile "FileName",offset8 \9 F! R5 Z0 Z. A' b
说明:创建一个文件,如果文件是存在,他会覆盖掉。6 q2 C, m" n; K* P1 O
7 O& d% w! G& i
.area函数: I: _* H; U0 P2 G; t
格式:
/ [; Y: V7 x; F2 i; Y% p.area SizeEquation[,fill]8 e* Z6 {# |+ x; s! x+ l
.endarea" G/ f) c2 t/ w7 U1 V
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
, a" E" n0 `* g0 w l6 k5 {2 q0 ^' M1 Q J; L! D, ^4 p
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
* }. P" J, V' }0 {" m- `org 0x1000 i! M% G$ t1 n4 V: @
.area 0x8. G+ U1 i+ _5 ]" a
byte 0x5,0x6,0x7,0x8& w9 h T) k7 E: Z3 l) {
.endarea
8 i: g! X. k' [* O9 n( ]
# M1 Z# t6 G% \5 n- N9 B% U.align函数; K/ p# u ^6 L* {
格式:.align num9 `" w1 V! @ b, d8 o" O. s* L
说明:写零字节,num为零字节数量,用16进制表示。& V- o" [( p' s1 |* U1 k
! J+ s, j- P/ z$ F% i.pool函数
6 M: G0 G3 g' K8 c/ t; y格式:.pool
7 a, K, {. _5 k7 I2 `: B/ C说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
) [) { U9 z$ P2 T7 G例子:. G( i2 F8 p; b% a
ldr r0,=0x12345678;
5 d2 } J1 q4 X% v; o# R. _; Y....
" A/ B7 i5 d( K3 O7 ].pool; ^2 Q* _' }' k4 i( T
8 S3 [& i6 C* P- p.fill函数
6 K) v+ G2 m4 o7 A格式:7 U, b& B. S# O% a7 ~
.fill length[,value]0 Y( D+ B0 |/ Y& I1 L
defs length[,value]/ R6 ~5 R: f% g4 K' b
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
4 F. [2 a: D. p" ^! x3 l. r" q) B
.skip函数:
) @ i6 D/ a9 O, k1 P格式:.skip length
5 b( k3 a* G# B- Q+ a* W) P& P* ~# \说明:跳过指定长度单字节数值,length用16进制表示。
+ B j# `, Y1 B' z- k$ l% K6 \/ z1 Z4 \7 V# f" y) B
写单字节:' a7 |9 J7 I* l) t+ O8 q8 b
.byte value[,...]
: _: S! u3 y+ [1 f$ t$ [7 \.db value[,...]6 y2 @! B' [& ]3 ^) v1 E
.ascii value[,...]
1 y9 `% G C, m: u d.asciiz value[,...]
/ \* X0 n, x/ n% \dcb value[,...]
# ]3 h* y3 U. @% p% ^2 x' l8 A" S" v5 Q6 C+ D& j
写双字节:
2 R+ l. W7 _: L.halfword value[,...]4 @, \9 R9 X5 K" o& a, a
.dh value[,...]; R3 n, t. ~: I0 t
dcw value[,...]
* L k- H2 ~; J5 Z, O7 B
% l9 [ o0 ]5 p/ O' ^写四字节:+ U1 R$ B/ C6 R7 S4 T
.word value[,...]% e% P0 k O+ w! n
.dw value[,...]) e) {. ]# w7 r$ ~; A' W8 t% N
dcd value[,...]2 U6 o/ ], I \& ]2 L$ K
* r: C% h! |: L1 M: O
写doublewords:
' Y% }. `4 o! t3 A# ^.doubleword value[,...]
+ ~) ?7 ~. u0 g- W; a.dd value[,...]
1 P( @; g2 s' p' ~8 Z. a- B% udcq value[,...]
) ~/ l# w4 g' U: N% I; h
2 v' S2 [9 Q3 \! U& u" I7 ?写浮点数:
1 Z- A x' q2 M: Y& S# O# z.float value[,...]2 \* A% _% }8 L/ X' @2 L, d
.double value[,...]8 G; _/ v% B7 t5 g9 u. L
" ~: ]5 x+ }. T8 V/ r, z
ARM的ARM模式和THUMB模式定义:0 h9 l" s2 S- A6 ?2 A' p
.arm|ARM模式9 A" N% i& @1 J- \! g
.thumb|thumb模式
2 h* X# f( v. C/ J% n8 e, q3 R* g! h7 S. c
设置架构:& H& h* U7 U1 z8 M' w" E' F, r
.psx|PlayStation 1(MIPS R3000)6 D3 Q. ]+ [( _ @' A. L# }; w$ b
.ps2|PlayStation 2(EmotionEngine)
9 X) F* A$ K, F: m# x; U( ~+ e' e.psp|PlayStation Portable(Allegrex)9 @, M: ]) s) w6 Y9 X
.n64|Nintendo 64(MIPS R4000)
8 U% b: H* y* I# M.rsp|Nintendo 64(RSP)8 B7 d) E$ M4 o8 @. W; E
.gba|GameBoy Advance(ARM7,默认是thumb模式) K$ ^; }0 @5 H+ d0 ?, b; i; M& ~
.nds|Nintendo DS(ARM9,默认是ARM模式)
. _; A! U4 D4 q. V0 |.3ds|Nintendo 3DS(ARM11,默认是ARM模式); M" n( J: ~4 k1 X! P% r* e( n
.arm.big|
& i. B; d6 M/ c; s$ C) V( z2 y.arm.little|
# o t& f4 Q/ `
: {9 ?6 q+ Z8 E9 u4 \, D* G, q, V, y常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
, @$ z8 {% F* |2 j |
|