签到天数: 1804 天 [LV.Master]伴坛终老
|
6 h! f" N0 x" _& R5 n6 {ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
8 s+ ]( q! J' }8 w' d1 [! F" j; d: R& R* P0 E6 e! r; @) t
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
* d+ i' P( V0 V. h5 Y' [& L- |; D8 _) r, R0 p7 d8 G
Kingcom's website:http://aerie.wingdreams.net7 x1 e- B/ |. W1 K5 R6 U6 ]
; f7 r) H% _0 e- c+ E- e& Q2 ]
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
' \0 c3 M- r- h3 n; N2 @+ ?
% |6 ]* p. d0 B; R# [更新版本可去http://buildbot.orphis.net/armips获得
7 V+ z: n, m4 u; H; z# c' ~
: \" C& r. x* k2 }/ N2 W% p, D" mARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
/ X6 V/ L) O0 A7 X) T, O8 T
& R0 I. |, \4 ~4 @/ l( Q) N+ \ARMIPS命令行用法:
L( n7 u8 C9 q
8 U6 O# q+ X( F/ S* S" \% tUsage: armips [optional parameters] <FILE>6 Z, _- m+ y8 }6 K7 X! D5 Z
' U# |' Z% E8 g3 B5 [
Optional parameters:6 |2 ^# p7 i% y3 v1 h0 ~ c9 X& G# S1 _
-temp <TEMP> Output temporary assembly data to <TEMP> file& _4 A; V9 b0 z5 i4 r1 w
-sym <SYM> Output symbol data in the sym format to <SYM> file. L6 p) N# k- R; X& Q
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file) m0 H6 Y! n1 B" a7 @
-root <ROOT> Use <ROOT> as working directory during execution
7 e' k: [8 Z) h! r! T -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code. Z* E4 H: x/ F
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code4 M( b4 E( B( }4 m& U% w' |
-erroronwarning Treat all warnings like errors6 ^% ]2 m% \( f1 n
; W" s0 V6 o, o9 s+ T7 ~File arguments:
2 d" v3 x" F( \6 _ <FILE> Main assembly code file
9 Z e" g5 r7 V) I( j: z
! x$ d2 m0 R: w3 `6 T% P- w$ \* G9 K-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件3 U8 A, K9 ?6 e1 d- }2 ?, A
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
" J# [ Z" _" E; D V' T0 A-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp3 [1 t; t; {: O$ a2 c
-root <ROOT>参数是指定执行期间要使用的工作目录
3 ^6 I$ H) _' q* g( w-equ <NAME> <VAL>参数用法不明+ y+ Q1 q( {/ u/ P
-strequ <NAME> <VAL>参数用法不明% @: J: f0 w9 b6 w) U/ t2 x& _6 t
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
, { {) q1 r* g u# y8 G# t! k* h% |+ _: k, e) g/ M q, n
<FILE>是汇编代码文件,可用记事本之类编辑
( d+ R: i% D# j7 [, a$ c* {+ L" }
注释说明:7 b/ r2 W! P6 w; ]: d2 }
注释可在单行指令后面“;”和“//”添加
% l! V9 b5 w: X e“/* */”式也接受" b$ x z/ }8 M) v0 m
& i# `% w* ~( Y$ \4 E
例子:. K9 c& o4 ^2 j& u
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000# |; |" Y3 Z6 H
: }- Q9 V3 y! X1 E$ l2 i* x! |& v.close;/*关闭文件*/
! _5 Y9 ~( Z. Z, G4 B
" N7 d3 E3 _/ H A5 y标签说明:
( F- S6 l: m' w# _标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。: b3 C3 ^1 d: ?2 I( {
H) j( G" N* G& _! h( X' e6 o数值说明:, l4 }( F' I C- f! @& B) q1 h* M
“0xA”和“0Ah”是16进制数值
4 i" S7 r5 \. p" J5 ^/ d“0o12”和“12o”是8进制数值; p/ J# Q0 ]6 ]- y2 `
“1010b”和“0b1010”是2进制数值1 g) M# r0 O, `3 X
% V9 z' G+ M5 a+ x9 g4 L1 y
equ说明:+ F) G' }1 l c% i
格式:text equ value
5 Y* l, Q) @: c/ F; _说明:用一个text代替value& v2 f% M4 {; \$ p3 y6 r/ d8 i$ H
例子:5 m! S8 ~' u% ~) b( C* f: u1 I0 s
address1 equ 0x123456788 z3 c6 H0 J1 c {: h* Q
ldr r0,=address19 K; h: G0 t4 e) B& h
.pool
6 m2 Q8 t! Y) q5 V( v2 S, `, d6 _+ x$ B$ e( A
函数说明:, O1 x4 g! X! s1 U
" E6 O- A9 H8 [% s* A0 |
.open函数:: c" p9 P8 M9 L4 e9 u; R# W
格式:
( w- c A5 X- `& F* [( a: `.open "ROM FileName",offset
/ m' _3 k7 a4 n* ~9 r3 f8 C s# s.open "Old FileName","New FileName",offset
+ u A/ M$ }; G8 U9 U. _说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。5 i" P: z7 G5 X; K5 e1 R) ^
f3 e0 Z8 u# l/ c例子:
+ J& N# K2 a/ T7 y5 z* I/ P# e6 f1 U.open "1234.gba",0x08000000
1 u' T% a& N! e3 k; w. V6 u+ C( n7 d, k: e
.close函数和.closefile函数:
+ V, S1 J. b/ z3 _7 }3 p格式:. B+ Q% R+ a& e% N& n: X2 W+ c4 t
.close
4 T* ?9 o5 p5 H& F& {.closefile
# _- [% H& _. V* L# y0 z$ g说明:关闭文件。 A- W- c& _% {1 s
# |3 L J0 r& q& M: ]' }.org函数和.orga函数:; P9 f/ x( i5 ?5 y4 T8 l% \
格式:
+ `6 E: Q+ [: C) [.org RamAddress
% z3 Z9 A$ T9 \.orga FileAddress
# w, b% b# t" p K% i+ `7 b; b说明:& a4 j# v( W) f- P
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。0 O J; y8 i) }( M
% D" a' Q8 c9 q& @& G
.orga函数可指定ROM文件的输出地址。
3 Q8 S+ l/ c8 X; c* |7 ~9 g/ ?+ R! r3 B
.create函数和.createfile函数7 ]1 s$ t9 E/ M1 P
格式:2 s! X4 } K3 T
.create "FileName",offset
8 o5 k" {( A5 l1 z% y5 u.createfile "FileName",offset
2 n6 T! e( y( i( m& g& l7 }: ?( i# V说明:创建一个文件,如果文件是存在,他会覆盖掉。9 d/ d$ u4 N3 r" _3 F
5 C G2 D+ V# O.area函数
5 j! F0 j* b7 i3 v2 _1 m( g格式:- Z& Q" j, w4 Y: |) c
.area SizeEquation[,fill]6 \7 B/ d: h l( K$ B
.endarea' }2 S* `6 `: j0 `/ D. q t
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
- z, M8 _7 V: B9 M
5 U0 a; X" p$ {例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
0 M2 r7 x8 M) worg 0x100! a* K7 i, Y4 ?! y: i' U* X0 y
.area 0x8
! a# ~0 k8 A7 ?4 c* |byte 0x5,0x6,0x7,0x8! }( o! p2 {# }, C( D
.endarea: u! D; d: \1 I( Q, e3 y, W; a& c
: T7 u0 h- y* w3 p7 \
.align函数
3 R l2 z5 Y: }5 A1 N& o格式:.align num* h# c% k3 |1 r( S8 a {
说明:写零字节,num为零字节数量,用16进制表示。
' V, \) d$ l2 D
0 T$ ]# A) g3 l) h1 }* u.pool函数/ G: ^! k8 w* C! E- ]+ Y7 k! m
格式:.pool
+ ~; g# p' T) M1 \: C( X说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
# F/ l0 ~& S5 H- l! R |7 G例子:
6 i6 v' Q5 A( |6 ildr r0,=0x12345678;
% E* |) d4 s& p; S6 r7 g' }....
- O: |% a, ]. x% s( x.pool
: L5 O0 @& Y2 A2 B% a- j9 ]
; {( ~2 i' H+ z8 {- U* J( r.fill函数' b6 C6 `8 B& J, R) u
格式:
3 U Q, k3 D* Q5 z! e.fill length[,value]
' t" p3 \: E' ?! R" zdefs length[,value] p/ n1 K' F1 i9 h! @
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。) [) P5 q1 E" x, ^7 J' K2 [
$ K9 e6 c9 l& P
.skip函数:
- u/ F7 X$ Y/ ]: c格式:.skip length
. h1 X( a! u7 @% d0 b说明:跳过指定长度单字节数值,length用16进制表示。( }% @/ E6 z' X7 }7 d( U/ j. i
/ p5 D2 U' s$ M0 Z3 B
写单字节:
4 `; j7 o- D; T2 H, p% E.byte value[,...] \" d+ I" s$ `! `
.db value[,...]
3 L( y9 u! t. e7 o6 P& ~0 `.ascii value[,...]
9 S: v. f; Y( \) f4 L$ d6 r6 j.asciiz value[,...]
7 K+ Z" F1 o; p0 rdcb value[,...]
6 W; @ G- z& g! A$ ~0 J) N$ ~7 e- }4 H1 x- ^) N9 S0 C
写双字节:
( g2 k) {! R* ~7 O( u r.halfword value[,...]
" A2 `3 X4 K6 d. H% |.dh value[,...]9 S2 e) ]* b* j6 k+ N) q
dcw value[,...]& K) u( ]% m3 }3 k% E
( P: S. V. D' `" C- x' s l
写四字节:
5 n; y: d( i# i5 K' b: X.word value[,...]
& Q j$ c- l) e& h0 u; O# s% v* h.dw value[,...]5 _$ `, \( K7 c1 B' b9 r
dcd value[,...]$ T2 I1 U1 E' d/ `4 A
! Q& x, E U* t( A
写doublewords:! L8 l* d* }- m
.doubleword value[,...]
& J- l/ C b2 O2 e8 }.dd value[,...]2 ~8 \8 B5 ^& h3 W, @6 P
dcq value[,...]
7 d2 n& T; X q% y+ c
' v- U f6 k/ ]写浮点数:
" u) U( M8 O. t0 T) q$ V1 _.float value[,...]" k/ |$ U6 j# K% W! t! J+ a
.double value[,...]
& _% ]+ s' R; p$ K- Q D, \5 J( \
) K5 q- q1 ]2 EARM的ARM模式和THUMB模式定义:
0 E% v# Y# c. C, A.arm|ARM模式% l' |, C' U4 n
.thumb|thumb模式4 D9 h% v1 _1 P _1 t, u
* Y/ h+ u3 x% h7 F. C
设置架构:
8 S' s( m+ W: o# f7 a.psx|PlayStation 1(MIPS R3000)
# O' {5 C6 J7 H5 O3 x- V.ps2|PlayStation 2(EmotionEngine)5 |$ q6 r4 @/ V2 t' d m5 B* i
.psp|PlayStation Portable(Allegrex)
' x9 o$ n0 {1 m8 R4 C.n64|Nintendo 64(MIPS R4000): f; i2 D) g+ N& K* j
.rsp|Nintendo 64(RSP)
- t3 d/ w: Q: h0 D% }4 o' @! B.gba|GameBoy Advance(ARM7,默认是thumb模式)
/ Q1 ^# A9 r8 E( P.nds|Nintendo DS(ARM9,默认是ARM模式)
$ j6 M" q. d' J1 K% D. \2 `.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
! F2 E3 }8 B4 j( m.arm.big|
9 `" ~/ c. F4 u9 _ D a5 G$ u. s.arm.little|
3 M! P$ ^, D8 J9 D9 c. c
8 x* p; Z3 P4 Z* Z常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
# E; X8 L0 [% A% q0 q |
|