签到天数: 1934 天 [LV.Master]伴坛终老
|
3 h% v7 z0 {2 i! S" GARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40001 E8 i {# ? ?; M
" R: P7 F+ M" p, m- F/ MARMIPS assembler作者是Kingcom,目前发展到0.9版本
8 h1 h7 d' a5 c# m& V5 P+ u9 W( A# b |( ?, }5 n e
Kingcom's website:http://aerie.wingdreams.net
* m: h% ~3 D9 `1 m x
8 G \* W" B9 ?: j0 v+ p% `ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
& ^9 ?2 a( m5 F' H9 \* F
* k0 x( ?7 T+ Q* B更新版本可去http://buildbot.orphis.net/armips获得% W `' {7 h% Z6 o, P2 X6 B# |
! \ L, f+ N& M5 TARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。0 R! q; h; a5 _5 p/ E1 g7 w
2 ^( B; I6 \( ?( M) b& O" x2 qARMIPS命令行用法:3 h( \+ Y4 E& V+ S, N6 o
) O. l. A, ~$ B/ y6 z- M' Y. S
Usage: armips [optional parameters] <FILE>" Y3 y1 O+ _, D: K
5 Y7 w3 R# t6 J" M2 R* A2 r
Optional parameters:
4 @2 f! r# p! i- P' t& g+ z' e) p -temp <TEMP> Output temporary assembly data to <TEMP> file! h: w( t( v7 c& X
-sym <SYM> Output symbol data in the sym format to <SYM> file3 }" P) Y/ P2 G% Z
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file" |! t% w- _- {( U! B) H$ @
-root <ROOT> Use <ROOT> as working directory during execution
7 a u% @& c5 A# x' G5 q* s' z2 z -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
! S7 c) I3 S2 z0 P; [' U4 z: w -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
" d+ |7 G8 l Z -erroronwarning Treat all warnings like errors
6 P5 T( B+ g3 e$ |+ U+ v8 `- ^8 h7 F5 b2 x& F/ v0 C4 \* V8 y% \
File arguments:% O6 \# N4 M& O- t
<FILE> Main assembly code file
- ~8 _' c4 Z; g9 e
$ x, d) d: W; p4 q7 c7 C-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
& m8 } K8 [. n2 Y. P-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
/ E; M! O9 W2 b-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp! v, h3 e4 g. o8 P/ ? J. v2 Z1 ^
-root <ROOT>参数是指定执行期间要使用的工作目录
: D" z; j6 U( _* ]( j-equ <NAME> <VAL>参数用法不明! N9 Q) ?0 n6 G9 h6 l
-strequ <NAME> <VAL>参数用法不明
( f" g4 K; x: z-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
* i) K; x% p; b; Q' o' C, X& z* y8 F3 b) R
<FILE>是汇编代码文件,可用记事本之类编辑
. _7 n- x8 b1 C8 g
6 d$ u% D7 N) F8 F注释说明:
3 A% a. e3 U4 `+ b注释可在单行指令后面“;”和“//”添加: X D4 b, |' F. c- H: V# Z
“/* */”式也接受& U5 F, c8 L/ M! T3 f. W% Q4 v; q5 ]
- d. \9 D2 K$ O0 I1 i4 H例子:5 e* `/ h4 a D& D8 _, b! f
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000005 {# K" L; n: @9 w
% n0 ]7 v7 o2 J! S.close;/*关闭文件*/& J- u' s) f( g% B! G. e
& j# _: z& d4 M1 V! w B: Z标签说明:5 X5 \3 X, O) Y" q2 S
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
& |4 E1 Y; f" O5 `1 l% f8 K- P* k2 \( y8 h- O! }
数值说明:( p% ~3 q' ~# I4 a7 l- j4 H
“0xA”和“0Ah”是16进制数值
1 o' v, c e3 C" R9 e; X! m“0o12”和“12o”是8进制数值0 l& ]5 j) n1 ^5 h2 D0 J) F+ m
“1010b”和“0b1010”是2进制数值
% h0 G; b* i0 ]+ w9 i) a( n
9 r1 `) g( e; R+ c ^9 @/ ?equ说明:# r* Z) C6 v- n9 f
格式:text equ value
2 a! M' d8 O. w! @6 M, B" K+ q. B说明:用一个text代替value* R4 p5 I5 |% k$ `! @# j: i. Y v
例子:
. G# `8 H: u$ raddress1 equ 0x123456789 _5 D* r, p: k u2 e
ldr r0,=address14 G7 w9 }! L7 n5 l: ?2 c
.pool1 i' ]0 e% ?+ {2 E8 ?
# p6 L0 e/ Q0 @- B: g
函数说明:& {$ n% q' E% l
6 {- h2 ?) ?6 ~/ U' O: k. H) V.open函数:9 o7 ~8 y6 _9 J7 S& V; V }5 ~, o- {
格式:
7 G$ a! z$ Z2 g4 T7 E4 ].open "ROM FileName",offset
+ _8 l$ k% _" u' }# l& w: V.open "Old FileName","New FileName",offset4 S4 C" c/ ~& P( D+ Z* _% f; Q6 I
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。' c5 Y; w# K* ?; A- ]8 W! Y
3 B7 f9 L* ]! C6 h- O/ ~" s例子:
& ]% l( V* d" [! Y.open "1234.gba",0x08000000
* F' w# w2 h) E6 v- S/ ?1 Z% z
a4 a/ C# w' a5 t# Y3 g.close函数和.closefile函数:
* B4 u3 {, u5 x6 Q0 U0 \8 I! v格式:) l7 l/ o+ A% ~
.close
0 N8 u7 i' Z+ X3 S+ c ].closefile
- M) n6 ] T6 G2 [3 ~* W. H6 N* h说明:关闭文件。
1 N$ g5 ^2 U0 v2 v+ E1 B' T$ @6 ^3 b; T8 P0 Q( p" c: R" Z; W* Y
.org函数和.orga函数:
% f9 K" c5 P: y7 F+ b格式:6 I, {7 z% m8 N3 j; |1 e! Z
.org RamAddress
q! X- Q3 j) v2 y5 w0 @.orga FileAddress1 r/ M1 b0 ]" H4 n: G* A# ~+ y
说明:5 t z7 z& V4 }! m2 E2 j
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
. a- g5 I4 w; d$ I: i: H( `( A
% e$ b- B# j' ^1 i8 {% e.orga函数可指定ROM文件的输出地址。. `! S, Q9 _. g) b, c3 ?
7 g! x% G4 o. M+ f" R& n* w.create函数和.createfile函数
7 q% c4 ?. o: j5 p格式:
, W( B7 D$ {) z.create "FileName",offset4 M' F9 U* R l o
.createfile "FileName",offset
3 L4 R* Y- k7 |说明:创建一个文件,如果文件是存在,他会覆盖掉。* O$ X$ {8 r v }+ H& T
4 B" H/ |. i7 k4 F5 X2 D2 y9 ].area函数
. ~+ v2 E4 F* X格式:6 J1 R! p, r b* s( _$ s
.area SizeEquation[,fill]
# l# A) |; V( R% o7 y) s.endarea0 j: B- z6 y8 F* Z" ~% d5 G) V
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败. g/ {8 V" T6 [; { \' z
8 V* W; Z( J8 d例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据$ D" c; H% s) G' v
org 0x100# C* Y$ S2 E: c. M: h, G. Q7 ^
.area 0x80 ?: L+ Z( e* M; P
byte 0x5,0x6,0x7,0x8
& t4 S. r, g: b+ b! w% Z$ P4 b.endarea* A9 S# G8 q+ `$ V
/ c+ Z- B- y. u4 T7 P5 S/ Z+ C1 Y
.align函数
$ d- V) q2 U! _1 u* g4 P+ ~9 j3 k4 v格式:.align num
1 _" A- a: ?( s9 L说明:写零字节,num为零字节数量,用16进制表示。. m( j% C3 ~: w* Y1 z+ N$ ]" P
, d& S9 L# r9 o, M U+ ^4 ?.pool函数' E1 t1 x& Z$ ~- [% z* ]
格式:.pool
% A& y/ S% K) l说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
" l$ v- B/ X. P例子:$ S. C5 B$ `: Q( r3 c
ldr r0,=0x12345678;+ s$ A# K% D: |+ @* y2 e9 q
....
3 l' i; A* F! u- G.pool
3 x7 r' Q: r8 L; \ S+ D- Z6 C; v, @! v& b; s0 X
.fill函数
4 c0 g+ R8 A; y# f' W/ `7 y格式:
5 ]6 b; e, R/ w+ p1 ~4 o6 A.fill length[,value]
, e9 k ~, }1 T l# idefs length[,value]
0 o$ ]' W, ?5 `- D说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。4 t! }1 h+ a/ ]$ ^- b
+ G* H' Z# } q* b
.skip函数:, [7 F" ?1 C1 p; W
格式:.skip length8 o' j. T% G9 h$ |( S
说明:跳过指定长度单字节数值,length用16进制表示。$ \3 i+ ^+ |( y2 A
) I/ k* ]" A: Q. O8 I' c+ l
写单字节:; s, U3 R, v8 F) E6 q
.byte value[,...]
/ B# N& ^- M; E/ M8 @.db value[,...]# v) ^; h& s" ]8 m" Z5 F, P
.ascii value[,...]% V) h' m1 u, U
.asciiz value[,...]% v0 c; b2 i- P% {
dcb value[,...] o( Y* P( ]7 s4 C* A
0 z* u+ I6 `! g
写双字节:0 n% Q; g8 [ ~ j/ Q& F# H7 S
.halfword value[,...] Q' D0 h5 m# R
.dh value[,...]
$ |! h6 {0 c, Qdcw value[,...]
, O y$ e/ H! A' G+ q
x, }1 T8 Z- C" T# L' M写四字节:' D5 L$ H& p6 c Z( k. b
.word value[,...]' k$ a" n& [, X0 o. U
.dw value[,...]
0 P4 w0 r* C2 P, Y/ j' ydcd value[,...]
# Z) t. N6 m! B3 L' `, }
$ n9 L" m5 g6 G& [$ @; [写doublewords:
: o$ V" N) q) U- ~.doubleword value[,...]- M- \2 a4 V( b5 M* e
.dd value[,...]* g- M9 K8 |+ r, `4 Z
dcq value[,...]" {& P/ N% F8 r
L6 S6 f7 e2 O9 g8 z写浮点数:$ b/ P! E. _4 y$ l! H: i2 s
.float value[,...]
4 x4 [% J" j% T2 D. [) P# ].double value[,...]
, G: @+ }- M" Y, Y- ]4 [' {! R; d( |* i
+ i7 ]; Q1 o+ G# OARM的ARM模式和THUMB模式定义:
% e" Q4 n) X% b- O5 Z& a @.arm|ARM模式. J$ l0 V2 |9 d2 G+ c/ X7 m- u
.thumb|thumb模式+ L2 m; `3 G) x! I
, y, Z# \ r" o7 ^1 h
设置架构:
' j0 c! U- }, S9 e6 g$ X.psx|PlayStation 1(MIPS R3000)0 X8 E' ~* G& l% z, e
.ps2|PlayStation 2(EmotionEngine)
! @5 Y; p7 J. u( T* q& ?.psp|PlayStation Portable(Allegrex)
' d2 B9 W+ e6 u6 Y.n64|Nintendo 64(MIPS R4000)1 n$ p3 B# S9 J$ r- y/ J g. f, J
.rsp|Nintendo 64(RSP)- ]/ S- D8 E" o9 }9 u0 U0 P
.gba|GameBoy Advance(ARM7,默认是thumb模式)
4 J' ]* D# W" M" W2 u W.nds|Nintendo DS(ARM9,默认是ARM模式)3 X. j2 Q% e- x) l) g# }
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)+ Q D+ j0 N0 F; n& |
.arm.big|' ~1 X. p& |- Y P6 o- o
.arm.little|
7 L& d! P8 k8 f& B, Y) f m" L8 {. i! F& A1 V, t
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
( p) O$ \1 l6 I, N, \$ i |
|