签到天数: 2141 天 [LV.Master]伴坛终老
|
, {8 B/ ] H+ _1 [/ A
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
- G5 F0 F' O+ r6 [2 J. m8 J5 ?$ l( H/ t6 _# x) \8 u O
ARMIPS assembler作者是Kingcom,目前发展到0.9版本0 r/ X+ d% C8 [! @- u0 M
2 [ q5 B& t* X- d p4 ^+ V$ lKingcom's website:http://aerie.wingdreams.net
6 O1 i; h5 T/ w: F: a' B% o4 u* R9 P- [ V, i
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
# r9 Z: u5 g$ K; L3 c* h" n" B! {$ U, x# L8 l
更新版本可去http://buildbot.orphis.net/armips获得% F$ u; g+ b# f( Z# r! G( ]# \
; F- g& O* g& K0 ~! t# F
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
1 M- ?" u L; ?3 V$ q
8 V& l; r% I3 v+ z0 U8 qARMIPS命令行用法:
0 f+ W* C6 D' Q" C5 y( T% i
5 ^2 }0 J; J4 n% t+ N0 Z1 D) v" NUsage: armips [optional parameters] <FILE>
( k/ ^! v) G1 F- u. f6 u
" _' O7 s5 r5 x; n7 C/ x) bOptional parameters:& P D7 k7 V% b- U" {& I
-temp <TEMP> Output temporary assembly data to <TEMP> file. E c( W; s* _; i$ l
-sym <SYM> Output symbol data in the sym format to <SYM> file: F2 | G3 u2 O" y/ \: D
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file2 b9 b+ J2 X1 L! `$ e# j3 @
-root <ROOT> Use <ROOT> as working directory during execution# M8 w9 Q+ F& A: B; e
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code( }% S. C# t$ V; ~; M1 }
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
- W# w" i/ f& W -erroronwarning Treat all warnings like errors# z/ p4 G+ L3 r# S4 m
! n9 T+ E* w) ^9 L8 W
File arguments:
( A4 C( s1 B9 Z% ?! R1 T+ r <FILE> Main assembly code file
) b. K) }5 \, j. s+ j; H; e8 R8 X
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件7 T; y2 Z9 ]% @( W4 y, c$ l
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
1 p' D& H$ J# ?; Z. P/ T2 `$ @-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
6 e; @$ R& m9 e' \-root <ROOT>参数是指定执行期间要使用的工作目录( @/ e& n! H1 c. D/ @3 [3 t# K& F
-equ <NAME> <VAL>参数用法不明
, H/ G9 k% z. n" u6 ?-strequ <NAME> <VAL>参数用法不明/ c9 ^/ C7 y0 I% a5 o- k
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
. n! |3 F( N+ T0 m6 B+ I* g
% I& }" o* H1 B( r+ N1 H. T<FILE>是汇编代码文件,可用记事本之类编辑6 h8 a9 Y2 E, t3 Q0 C3 ?2 j! l( C
4 r4 S. K$ z+ R0 d$ H- V' I- ^! A注释说明:8 j8 ]5 ^* I" X( Q
注释可在单行指令后面“;”和“//”添加
/ J. N$ \4 C8 G' i- m8 [! ^' E“/* */”式也接受
% E5 ^( I J! d; [9 U! d
* K, N2 q% n' T+ ~" N% s1 N例子:4 s) i6 {7 w* \: @- n
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000( E+ W" f" r- L
$ M/ F/ a | V* A.close;/*关闭文件*/
- G* }* b3 d& i- x7 Z! l! T, u/ Y/ u8 e( {# f0 \$ }- B7 }: }
标签说明:
: d, c) {2 d/ _5 V' {6 a标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
" ^! k: q. |! F( S& T' |# A# N g1 z- M8 A/ N. F. C
数值说明:; O' o" J' Z w9 h- @. A
“0xA”和“0Ah”是16进制数值3 f0 W: T3 e5 y; n7 g0 l$ N
“0o12”和“12o”是8进制数值4 \; d7 T/ d* G% c6 I* n+ M
“1010b”和“0b1010”是2进制数值
; G! v' O+ B. S/ C+ |, [. x# o9 x$ C' a) g, m( _8 v m
equ说明:
% d* t/ c: W3 Z格式:text equ value
2 g/ z! f9 ~" d) n- a说明:用一个text代替value: r9 a. d) g9 P5 S
例子:
& S7 U! q' A; n$ s' a* K" |address1 equ 0x12345678' ^3 G6 ^- E$ r3 L
ldr r0,=address12 x, d% Z! z5 t
.pool' X3 \* G! w C
, a2 M* `0 E7 H
函数说明:3 F: t" O. p b! Z7 Y; z
! T$ ?$ l- s* s
.open函数:
& x2 n+ y$ k+ G' d' z: D格式:
8 ~4 O2 r3 x; {: U.open "ROM FileName",offset
b4 Y2 e$ P. P1 d.open "Old FileName","New FileName",offset6 r, I; }2 h3 h: I |
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
2 A' }" t( I7 E" a$ r8 \4 h7 c, S. D \& \: E m0 A4 h
例子:
( A5 U+ b$ y; v' {8 c9 v# q6 ]! o.open "1234.gba",0x08000000
$ t$ {* N/ q8 L& I H. [" h! z9 R( \3 B2 R* T# s( @
.close函数和.closefile函数:6 \$ ~, Z/ H" p9 d" N% X( [
格式:( Q# F! X. H; c" t s
.close
" A7 v \$ F, Q* Z: }* ^4 N.closefile, [" U1 A, k9 F) P
说明:关闭文件。: | C; E5 k0 g2 g% [" n
3 ^+ w/ w! C; z2 b
.org函数和.orga函数:7 p3 b t/ E. p2 a) A( h9 o( ]% ]
格式:7 Q( J m/ B+ l! b) v6 Y1 A
.org RamAddress! W' u8 F2 K- I3 f+ K; E. D0 c+ u
.orga FileAddress
7 N9 W( H5 l& `& I! ]9 |说明:
6 S4 F8 J$ E7 B& k- _# e1 M# Q前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
; Y" l# D& X, V% r2 c' m4 B0 Q4 z# y5 x! H1 h
.orga函数可指定ROM文件的输出地址。
y& O; q0 S [1 Q$ l$ `3 B
' |3 b0 e L: A) ?3 _.create函数和.createfile函数
0 |7 Y0 ]: H P5 _格式:
' m& b4 Y7 F2 R" ~* B# V" v7 Y.create "FileName",offset
! \- y) I( B- m& l.createfile "FileName",offset
7 A2 `; H8 @( h! L( i, M说明:创建一个文件,如果文件是存在,他会覆盖掉。9 x( k2 m# h& F0 R
9 l4 ]' h9 U4 I7 q0 w' S
.area函数4 a" k8 {9 e( ^( t7 N' p
格式:! O9 \% e t8 l; y. r$ ]1 N
.area SizeEquation[,fill]
& Z- w1 ?& D- P- ]3 k.endarea) l$ ^$ _' ?* y0 ?" ~. T: z5 }7 K; C
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
( T0 E$ }: Z8 r! }( k
6 n `: h/ j) K例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据, z3 {! E: }9 \, G$ g5 ? ?) |
org 0x1009 A+ h" L+ A* ? K4 d0 K8 ?1 j
.area 0x84 I) O Q0 e, `# k2 u) [3 ?) X
byte 0x5,0x6,0x7,0x8
/ |& ~1 f4 ]% ?+ [. z$ Q.endarea* q5 j& b8 L& l7 [, {+ [
) d0 d( u# s4 ~ z% F, x
.align函数
1 t# a& x3 ^( u$ n, G0 O# B) s格式:.align num
/ p- `$ u K: ?9 c8 ]0 p2 r说明:写零字节,num为零字节数量,用16进制表示。4 B9 X$ ^: o/ g% O8 \: |
' B% ]5 ]& s/ A% k' |.pool函数
' x" v1 C X: K) V6 T格式:.pool
9 g2 P7 l% R, B3 L/ |说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。! @, ~0 t1 e* i# w0 x- S
例子:" ^6 E$ T+ W% H! x6 S% [
ldr r0,=0x12345678;
% t$ p; x6 l# `; q....
9 _+ o/ c P J u2 e.pool$ {: S) Q* [* {; n4 c4 J6 @% I% O
7 @: Z+ n1 A& C" E1 ?( Z/ s V
.fill函数
5 ^0 t0 t6 q4 [" R格式:
# a5 v7 t0 G/ c* N3 z/ ]+ Y.fill length[,value]- U; y* }6 e5 C* |' P/ ?+ E5 e
defs length[,value]
% j; n, V9 n* P6 L4 _* G' G说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
" [1 X9 l% c$ W6 u; x' h$ T1 s* z& x2 U+ ]. @% L( I; @
.skip函数:# y) b( @& J0 z" y0 L
格式:.skip length7 a8 p" `" ~6 C) b
说明:跳过指定长度单字节数值,length用16进制表示。. j, J5 T2 Y) h; r7 M
. b q$ B4 }( z9 I$ ^; S2 |& Q" _写单字节:
# h+ E# P7 i7 {.byte value[,...]
3 N: {' T2 T; S- x6 b2 f! C.db value[,...]5 U6 Z2 T0 q0 `4 C& y4 M" @+ K! L
.ascii value[,...]6 R0 c, a9 ~; H1 ~! J* p# T) |
.asciiz value[,...]
c! s% Z/ d n- ^, U" M8 mdcb value[,...]; k- B- L* m, Q2 F! H
* q& }" x) C2 T' @, ^* H4 D* _
写双字节:, T5 K- \7 F Z$ V) N h- T, t5 |- ]
.halfword value[,...]
f0 b; U4 P6 I- L' c6 t.dh value[,...]
q E: {# m0 j8 ?. ^2 _dcw value[,...]7 D4 R b: `; I" \, V
& }2 E! w' R& M9 V9 x2 i
写四字节:1 R- ^8 B% a0 \$ }+ S3 v9 v
.word value[,...]! Z/ M$ U+ A, k& m' k
.dw value[,...]
) T+ |4 Q: X8 |! O7 Adcd value[,...]
; P/ h; @% ?( U" e' t% @. ~: }( \5 r5 I! E( U) `: ]
写doublewords:1 }6 A( z, }- T! \
.doubleword value[,...]
0 \: |5 Q1 B, Q1 ?! O N.dd value[,...]' j+ j, c C! R' @; O' W5 L
dcq value[,...]
4 G; w; g& p1 [1 p$ @# d: T6 Z) z5 i/ X/ m2 f
写浮点数:" S3 g) H0 W# n& ?% Q! L: }
.float value[,...]
8 `7 x1 g+ R _.double value[,...]6 Q; P- B0 b/ Q" H
# s8 R% g& l: e: l; }& A3 s. R, c9 [
ARM的ARM模式和THUMB模式定义:
& Q2 g: G0 Q0 F6 R.arm|ARM模式- D+ D- i" E( {& [- Q( v% h& V- L0 _2 R
.thumb|thumb模式
$ x8 `. S4 `6 l, ] ~7 ~7 ~/ l! Z/ d D; M1 j5 Q
设置架构:
5 |$ c, v* R* w0 x4 a/ ?.psx|PlayStation 1(MIPS R3000)8 {6 T. p+ r: t- K
.ps2|PlayStation 2(EmotionEngine)
5 s( g$ [; I4 m% Y. v.psp|PlayStation Portable(Allegrex)
# a5 Q. j j$ M' E.n64|Nintendo 64(MIPS R4000)& _2 {% m# g" A# i" q, V7 f
.rsp|Nintendo 64(RSP)
, C# T7 {3 w' `! u8 T0 z.gba|GameBoy Advance(ARM7,默认是thumb模式)& P8 r7 L* E# X# a1 F
.nds|Nintendo DS(ARM9,默认是ARM模式); [0 j* T; I) ?0 R$ R2 C
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
1 t7 g0 w3 W0 s2 w& Q; F2 O1 H.arm.big|) k" Z7 A) k4 L5 _
.arm.little|, c! K' x1 {1 X! b
/ A( a; l y; V- J
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。) e- M, {" Q1 R& U
|
|