签到天数: 2193 天 [LV.Master]伴坛终老
|
: ~( l! k5 V9 r+ L
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
- }5 W! b; f. w% N& @! r7 X% u I! i% n
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
. g* q0 S3 V9 o8 x0 D; n3 }0 f/ q$ b- o) V: f* q5 ` r4 W- _' y, C
Kingcom's website:http://aerie.wingdreams.net
& T, K6 x" @2 C& r- M! k) s7 R9 I4 _) l/ g
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得$ J% i7 w- r* m& [) L: p& \
8 N! |1 S, `9 k. U. j$ w) k
更新版本可去http://buildbot.orphis.net/armips获得2 k$ H& c: _* a$ p4 Y0 o
6 S$ b) m8 v1 c( R, J" C4 L3 {ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
6 i& s' e5 Y) M# E* H. j( O- E- n% [6 h' e$ j
ARMIPS命令行用法:
5 v) U0 w% A( A3 I
( @4 I9 u( H& D: i$ L6 aUsage: armips [optional parameters] <FILE># u0 \3 c' S) X, g7 H
5 d! C9 `. V/ d' Y
Optional parameters:8 O! X" ]) g9 Z+ w5 L+ m% ]7 s
-temp <TEMP> Output temporary assembly data to <TEMP> file
# B: f I( c. g* E -sym <SYM> Output symbol data in the sym format to <SYM> file! N6 G. }6 z/ i! l4 j
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
9 E) }( I6 i8 B" V& t -root <ROOT> Use <ROOT> as working directory during execution" e* \- }3 Y, M/ R: b/ t& g
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code3 m/ X5 Y# e9 z" j2 P, |
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
8 z! }& @- z3 i( y' Q% S -erroronwarning Treat all warnings like errors
# `( L) ~; _7 H c8 h) I8 p, O$ j! E3 h, B# [' y) q) y
File arguments:# u! \: @4 p& Y
<FILE> Main assembly code file$ c, i) @ m% b$ P) {& x
9 J K9 v+ I A* L/ y3 Y+ Q
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件3 m7 u* c& F9 Z! K3 q9 c. `9 t
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba# A. V6 k5 i6 j# ?4 v0 W r
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
/ K; c8 ]) }8 S; t-root <ROOT>参数是指定执行期间要使用的工作目录
3 o6 G' s* [, j. G1 \-equ <NAME> <VAL>参数用法不明
' [4 y. A% A3 u-strequ <NAME> <VAL>参数用法不明( A1 u3 t! B- l5 R
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译5 d, ?4 h$ _ L }
" P5 _( k5 A, G& ~- L" q
<FILE>是汇编代码文件,可用记事本之类编辑
y$ s! W8 n) N6 h- S! N6 v
* q$ ]$ O) |4 Z1 m注释说明:3 ~" G; z3 w4 ^- `% ~' p
注释可在单行指令后面“;”和“//”添加
+ ?: v7 N6 |' T- b3 z: p“/* */”式也接受* u$ n( g7 I# {4 r- \1 H
2 b) Z7 m/ G- |9 m5 f6 n6 A) I, T
例子:, g0 d; C8 i. ]- O- d; M/ S* ?
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000004 l5 k" U) Y( q. c9 h4 D
" T2 T x( {0 X- Q: G! ^* ?& t.close;/*关闭文件*/+ p+ ~: f+ N E- X4 v% y, B: j
' Z% A, d y7 ^0 E F标签说明:
' v1 H9 A3 f J4 d标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
( X+ K! |6 q* \! B8 t4 D
* g9 I) T( ]0 P( l数值说明:
# A( U) ?! J+ Q6 g“0xA”和“0Ah”是16进制数值' Y; y$ z# b+ g9 x2 b: D
“0o12”和“12o”是8进制数值1 a% C& `0 c- G, r) o& [! r
“1010b”和“0b1010”是2进制数值) ]( N; V7 R! S' ]; H7 b- J
& n5 j# r- } Y3 N# J- o' ^6 m6 _9 Gequ说明:
& ?9 c/ V* `3 `- d; c$ ]% h格式:text equ value
7 d, t! V4 F7 q% Y说明:用一个text代替value
% e) f8 c* Y R' @ L/ h; F例子:
# @' |2 t5 T# Raddress1 equ 0x123456786 G- f c3 ], P5 Q* y: l* |
ldr r0,=address1
w( A0 m" Q; X% U; n; C6 b/ A% [.pool% @7 s: }. f, r. ]& }0 w
* g# J' A8 V( o3 K1 r/ Y/ y
函数说明:
0 r2 S1 q5 M5 X4 T) u# d& x! G. F. d$ v/ a& F- d3 G
.open函数:
5 p1 s z3 f' b6 G9 b格式:3 Z, R S9 V0 k
.open "ROM FileName",offset
, [5 v' Q- i- {2 S: C.open "Old FileName","New FileName",offset( c8 D- R1 }, }' g+ O% C: d
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。+ N! @% b3 o# R: R
! J+ A9 L9 w% Y! U; g3 Q例子:
2 }, ]6 h$ _- b. E' u.open "1234.gba",0x08000000
+ V7 n6 M7 A6 {9 T6 P! P
* w- M/ N. r1 U.close函数和.closefile函数:
' `" B" x- X: I# _$ m N格式:5 s1 X4 G8 [- m2 m D/ p+ l. |
.close
- `+ u$ Z/ ?2 h.closefile
! ^/ p y* z k" |! x5 d& t7 U说明:关闭文件。
" K; q! x. n& ?' [4 ?% K. x
4 z2 L+ x; ^6 I7 q) o" Q.org函数和.orga函数:- Q8 e% ]' h- U1 q9 x# Z
格式:
( l7 t% _* e+ t5 z! W& ].org RamAddress; {0 i: t/ m5 f4 h* C" P9 K3 N1 F
.orga FileAddress
i. B/ R- m5 x; _$ w说明:( {) p; p' G, E# F9 h4 A: x, {
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
. `8 W- K6 ~9 S' |1 J7 r) p b1 ~2 V \. g
2 H0 p! _2 w2 w( {) j! ?4 Y.orga函数可指定ROM文件的输出地址。0 a# Q% a4 f) P
D1 j% K' K9 A4 L9 J9 g7 }.create函数和.createfile函数1 c' ?% W( z% p& q; O3 H! W$ ^" S
格式:
$ u1 q+ z, P4 X0 P; o1 ~1 n+ J.create "FileName",offset
' ^2 k9 |8 E8 _; B- i.createfile "FileName",offset9 G+ S% P: ~9 C
说明:创建一个文件,如果文件是存在,他会覆盖掉。
! a1 i! e$ ^8 h7 @$ N7 I: j4 Y# E8 y$ `, F! B+ q% |
.area函数% R" |& A3 S0 O- @
格式:5 L/ |, N" ?4 A" H; U1 q: s2 `
.area SizeEquation[,fill]: }0 C2 u0 C% F2 D
.endarea
( s1 Z5 o# [6 w& m说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败' \+ X& b9 V, ~4 q& i
) y* c4 P; L- {0 a4 G) S例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
1 u5 ^6 B; H! i$ z$ E( R( Gorg 0x100: O& A# @8 v" B. I, M+ G8 R
.area 0x8
7 r# V" w1 p) l- q2 j J7 Gbyte 0x5,0x6,0x7,0x87 {8 P4 A1 u! G6 y3 a6 X( h
.endarea
7 l/ ~7 v8 c3 ?, a6 S* W4 K" M) q; Z2 t# Q. ?: w
.align函数" |# F0 `6 w+ U1 K: f/ d2 W; w
格式:.align num
: j; m! v# }8 t' J# a( t9 r说明:写零字节,num为零字节数量,用16进制表示。
7 I$ g4 p& D1 p+ _( N3 J3 ^: [$ d" w3 Q% v( Q- h. w" e
.pool函数3 D+ s! g/ j: i" G
格式:.pool
* o% ]. q6 X( |2 N说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
" E4 `* Y1 Z% v# I例子:
9 h' ^% H* w1 k, L" i Mldr r0,=0x12345678;
) g" Y, v1 i8 q+ z5 P.... t" A* `/ n, N: q# z
.pool
" @ D$ a* `" j1 Q. C# S; l$ X
! Y; t# u( W( {2 b. a.fill函数
z; P! l, d$ E; m$ M' t格式:
# e C. K& c% s" C+ E; x8 ~9 d& I) S.fill length[,value]/ \4 g! p8 S3 H' R+ x
defs length[,value]% {2 w, m1 m: p
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
7 T. `8 k/ h& b8 o
- w6 ?5 A! k2 @, ]9 `( j, w.skip函数:& | {; J" p& b# z4 }
格式:.skip length5 ?; n7 h) U, C( D" ^
说明:跳过指定长度单字节数值,length用16进制表示。, c5 L% a& V* j6 v
! l- @2 X/ k! G/ c, C6 S+ L* y
写单字节:
. W' N7 D% T- a1 g6 L" b: S.byte value[,...]
x1 j9 \; S1 V' E8 G; S.db value[,...]/ |& Y+ W! A! F8 s
.ascii value[,...]
) m7 w6 l% c. o.asciiz value[,...]0 ?. ?# l3 }2 r }! g7 I
dcb value[,...]+ Z6 ^/ w! Y. H/ P
: V8 o( F' [. |+ y# q9 v( U写双字节:! |. l' a0 I \9 J' q
.halfword value[,...]' Q& X- l* l0 [+ b; n# Y) a
.dh value[,...]
0 j9 N0 r+ q" U7 O- P# P. \2 zdcw value[,...]+ _' ^4 d4 m! j6 Q: g. U/ |- M
R8 v9 V4 {9 J- I* a$ ]% ^3 O! O
写四字节:
) L5 Q S* L- X.word value[,...]
0 p1 S6 ?1 A/ o.dw value[,...]/ J0 a5 _4 ^7 k j! ~4 q& f2 M4 @
dcd value[,...]: K7 l, ?: Y% G: J2 R' ^% J2 M
$ U9 U1 b/ Q2 Q2 w* E写doublewords:
! U5 n5 H+ k5 H& A p.doubleword value[,...]! z- _7 r3 b" A* W. ~: e
.dd value[,...]4 x0 H8 s; n. ~/ m
dcq value[,...]
' E! W& w8 r7 y: M t( ?- E- \8 L8 R, d+ m9 M- ^
写浮点数: {$ D1 S/ b7 p( D- T v1 n: e" C
.float value[,...]& P5 }3 G' v0 B5 v8 p; y
.double value[,...]( G, G# q1 R5 I, ~, {8 u
7 V) G) @+ M0 R9 F7 P# L) zARM的ARM模式和THUMB模式定义:
' p8 L! y8 C G8 c" u9 |.arm|ARM模式
. F, j/ F; n7 i: s% V# l/ x" x.thumb|thumb模式
, r; ]* {5 b% g9 x/ D$ ]$ A& b( m: |
1 ?2 [7 s, u4 |5 ?7 q' T% i设置架构:& Y' ^6 `5 s2 I) E q
.psx|PlayStation 1(MIPS R3000)# G' W# W' j6 H& `6 y0 ?
.ps2|PlayStation 2(EmotionEngine)
6 m2 M; U0 |8 g' ]0 Y.psp|PlayStation Portable(Allegrex)7 W3 ]: `* m" Y4 G9 q
.n64|Nintendo 64(MIPS R4000)2 h; Z% e: P% L& w7 h4 m! K7 O
.rsp|Nintendo 64(RSP)
: e7 [4 o* ~' P1 y.gba|GameBoy Advance(ARM7,默认是thumb模式); D6 n9 w6 Y' w
.nds|Nintendo DS(ARM9,默认是ARM模式)
; g" B1 a( j6 o.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
0 s9 l: l' ?' m.arm.big|
: k1 P, A0 o- ^; x* t8 s.arm.little|
2 H2 y$ K4 g/ i9 \1 q( l/ e9 l" p, p3 C
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。% y1 s- C: `& U/ G+ ~
|
|