签到天数: 2152 天 [LV.Master]伴坛终老
|
4 _& d2 R- n+ NARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000+ k9 q/ F2 R0 R4 \0 B. H9 M
& B+ t9 B; t8 n# S! x: `ARMIPS assembler作者是Kingcom,目前发展到0.9版本1 j# K) K0 A' s0 Z" |7 l* U- R
2 U% q) V z7 n. {, W6 @
Kingcom's website:http://aerie.wingdreams.net
$ R& o) Y1 B6 ]: U( j N3 k$ j! a3 a& ]: x- G
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得( _7 s: T# x; K7 b8 A6 d& O
" D: v8 h# [9 k2 `
更新版本可去http://buildbot.orphis.net/armips获得9 ]$ Q7 M. k$ Z/ B
6 o+ O( c6 G' [ t- Q; w, GARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。" t! v. z. k. W: b
5 |, x% h, y/ d. B! ~2 w! ?ARMIPS命令行用法:
" c7 ~$ l, N7 n
* S) a# J: r% S, I T- W3 m% lUsage: armips [optional parameters] <FILE>
) e( d8 y6 G4 A5 {8 I# M, r7 R( j: b& i3 @, ^! p. U9 i5 c" @9 G8 Z1 x: C
Optional parameters:6 y2 E% w% G ]$ t9 ]% ~
-temp <TEMP> Output temporary assembly data to <TEMP> file
" e* Z' _8 h6 z/ n# M( x -sym <SYM> Output symbol data in the sym format to <SYM> file
6 s7 l' y2 ~3 w -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file) O$ x* l3 a# [7 s3 E6 o8 V: F
-root <ROOT> Use <ROOT> as working directory during execution7 l" @" R% t: O0 [
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
/ g8 C2 y* V( S3 W7 e9 ^ a -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code3 Z( m7 R* P! p; |
-erroronwarning Treat all warnings like errors, ~, \+ J, j& |, I- t
: ~- P$ x* R6 Q1 | S4 U
File arguments:
. `9 t8 {5 J. d W+ n: r# j- Y6 Z <FILE> Main assembly code file$ n4 o! Q( U- _4 `$ w( u/ E
4 H& Q( `5 U k. a# @: j& Q-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件+ w! A; Q3 z4 _
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba3 \8 r; |6 K& C/ y- C( O/ J9 G
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp! s0 \) M* r$ A0 y
-root <ROOT>参数是指定执行期间要使用的工作目录
& U& N( t8 M2 a-equ <NAME> <VAL>参数用法不明
g- g# d8 u7 Z3 J: X-strequ <NAME> <VAL>参数用法不明8 h' b# R4 ^1 u/ a: O
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译. N$ c. s: r; s; P; O+ p
# J+ J/ h2 |/ J; }<FILE>是汇编代码文件,可用记事本之类编辑
. A" @4 J- T8 E) F' ?1 \5 `: T
! D+ _# L* E# q# M Y- K4 d& u$ t& R注释说明:( M+ I/ f) h! {# h
注释可在单行指令后面“;”和“//”添加6 v8 \+ ]+ n! ?; H
“/* */”式也接受& h! I/ |1 \7 ~$ R* e3 {/ h
! g t: \) ^% u4 Y
例子:
, Y3 L p/ ?! q.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
6 h0 z7 Z( G6 }8 i: N% M8 f# z, y# j5 K7 j
.close;/*关闭文件*/4 | d' v9 P' l! w5 C" w1 V+ o3 @
. R4 A/ H' P( a! j3 Z% c# Q标签说明:) |/ _# C U. _; f% T/ H
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。9 X) Z, i( K8 h9 L
{% b) b- N5 T+ p: g+ Q$ {
数值说明:
0 _' T) _2 @ J“0xA”和“0Ah”是16进制数值
8 z) p; m1 j! n6 @; o“0o12”和“12o”是8进制数值5 l2 {- k8 Q3 ~7 M) f* T
“1010b”和“0b1010”是2进制数值5 X% ?+ K0 [; Z9 W9 y) X" n2 j0 s$ e
0 I: F o- E3 l# P/ q& ~$ Z
equ说明: E3 X' q/ u; p% b' A: p( P) {9 v# W
格式:text equ value% g+ j' H3 B' V6 H) S4 P7 g" b
说明:用一个text代替value7 n4 F8 Y1 @3 L
例子:% {# F2 }! W2 a, G6 @5 N
address1 equ 0x12345678; c. S; R2 e3 e1 f1 U
ldr r0,=address14 l g4 H% U4 j" D: t
.pool
- ]3 b$ A* l: s0 ^; V2 k
# m+ O A4 C8 o函数说明:- O5 {9 Y& }: X1 t; {, N* C
( B- j5 P1 S6 F.open函数:! {4 p j0 ]2 e( A( f3 c4 K
格式:2 c! k7 @: r4 M I
.open "ROM FileName",offset
) B1 S% A/ _1 M9 c+ }# t.open "Old FileName","New FileName",offset r- X1 z$ T. I, X/ [3 P: A7 O
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
# Q, x/ N, {8 n. _& Q
& U- A; u( \9 b: k1 P& q9 l例子:6 v. o2 r1 F6 A0 w( E) k+ J
.open "1234.gba",0x08000000
1 f3 c, l+ g/ T) [( c8 s+ j0 M; C( Y1 S" ^) S
.close函数和.closefile函数:* y6 e- ~- x" w; _4 F7 V( \
格式:
5 b5 |9 ^0 c& T2 [.close7 h) \: ]) |7 f$ K
.closefile$ e2 C& h1 i5 o! j
说明:关闭文件。2 {" n( H% Z4 O
" o# U" e7 {' w1 Y' |
.org函数和.orga函数:
7 U5 f* _, ^6 ~格式:
0 V) |8 k0 ?5 h4 J% l$ x1 W9 S.org RamAddress* _* J' G& ^) {
.orga FileAddress# R2 ^& V5 y3 a( Y( v7 c& U. t
说明:* E& ^. R- V( @4 Z8 Y+ N
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。' n, @$ \ X! `. G: Q! }" Z
2 y$ H- m8 ?8 t; A; H& w! Q1 g.orga函数可指定ROM文件的输出地址。
4 c C7 L* [( v/ ^: W' z" H
3 z- n, l- Z# P# k [.create函数和.createfile函数/ k7 k$ c# r' ^0 T9 \2 k5 C5 z
格式:. k" i( C2 s7 ^( ^: L0 L
.create "FileName",offset1 y3 c4 q/ [3 A5 O! ~, L
.createfile "FileName",offset
& } X+ k5 Y. j9 K1 ?/ u; M4 r( c3 O说明:创建一个文件,如果文件是存在,他会覆盖掉。
$ U7 b4 u: T5 y2 O, a' O! M4 i: }
: e1 x: B9 O. f }- L& v9 |.area函数9 A1 A+ t5 H0 @6 u: H5 L* _, X
格式:5 C; v& S1 d2 X% k+ J* H! k! G
.area SizeEquation[,fill]% [; j( l4 k' e* y
.endarea
% n0 D. v8 o; n5 [4 i# p) G说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
7 v( B4 g h u v7 R
1 h0 r0 t4 T0 I( T! b; ^3 X例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
* o' P( ~, v* V# horg 0x100
3 I2 y* G4 M* m2 P4 G; @.area 0x8
: _; X: ], S D! |1 }. v* n& ubyte 0x5,0x6,0x7,0x8/ V3 l, [5 G+ U6 ?' I4 C% |; |
.endarea& g, I9 R" q `2 e F1 Z- y
" |! f- [ G) z# A6 M# D.align函数 P7 _7 g! N8 F9 r0 s
格式:.align num1 y: D' P6 { s4 j* Z+ y; x
说明:写零字节,num为零字节数量,用16进制表示。
' u/ S6 m: q, s$ u& l$ O; U
+ Y5 ]" F3 h ?- T.pool函数
' H# v+ G5 C5 L, h格式:.pool! k: M8 Y& G" m- g, K
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
9 f9 ^& R& ~+ J- J) V k! y/ ?例子:
& m/ C$ o' S; x+ g% `+ Fldr r0,=0x12345678;
/ N0 c* v2 B2 Y0 Q5 c....3 J! y* H: s2 q- Z C/ P* R
.pool
" o' T5 ?4 ^" F
2 e4 p) R; P& ]4 O.fill函数7 S: V' b) y' w6 P! O! U
格式:
' O' c+ R- @3 W- H9 X5 E9 C, W.fill length[,value]
8 \4 E: |/ W8 q: Sdefs length[,value]! t) ^3 |3 _/ U( S
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。$ C7 @8 I6 y+ X5 H' t, l) Z
- v- K8 b2 J4 c4 q1 Y.skip函数:. O3 e' o8 r$ Z
格式:.skip length5 h$ P& \+ k: h& Z' P
说明:跳过指定长度单字节数值,length用16进制表示。
* _# c0 t) x+ h" _& Q; R
v" i' \3 d* W5 I; F写单字节:
: l5 d8 Q& ]0 c; p, k7 V.byte value[,...]) C1 j+ T% H& J1 h( q' z# X
.db value[,...]0 t8 i0 E! }" v L( l, Z9 D
.ascii value[,...]1 D3 X3 d- g" p0 ~! |" h) L0 ]
.asciiz value[,...]
! I/ g. r8 d5 y) c. ndcb value[,...]2 f3 W: z5 G4 M! X4 W
6 Z! S" d4 w" C" t. B% X$ @写双字节:
+ c* M2 ]5 |2 x8 t9 @.halfword value[,...]1 F& }" B# e* k' F# e! p
.dh value[,...]; r+ S% g. e2 A3 m
dcw value[,...]' u% \ |2 d+ N: [' ~8 A
1 V) z# g3 c/ K# ^# Y% t% y: g. T
写四字节:
4 r7 L4 g$ O, _1 u& @6 z+ M! i.word value[,...]. H' d5 k: K4 W. n8 K% A
.dw value[,...]
; d: ]2 d( b/ R% x+ zdcd value[,...]
j5 M$ Q2 [5 |% N1 b! D4 i% W% h* c* ~' z( E# z
写doublewords:
' c) s* [6 Z* B- k.doubleword value[,...] L8 B2 V& g! v
.dd value[,...]
5 v: _" P0 W0 L; H. v$ @dcq value[,...] c3 K( f8 C% l& E2 l2 D' G
% a7 ?; I; m- Y6 U5 T+ X写浮点数:4 g9 x: K8 E1 b+ q- x
.float value[,...]
: L, {; @# I& t. g. g! M.double value[,...]5 f8 W1 \/ F+ N$ }
# {0 V( _; @4 b9 ^! a4 p
ARM的ARM模式和THUMB模式定义:8 Z+ Y- q- Q- l
.arm|ARM模式
7 W7 [/ \ U0 h) r ].thumb|thumb模式' ]' M" ^ X; C
" m# H6 l$ E/ q设置架构:' L# W2 B: F2 h+ g+ d4 J; c$ w" s9 g7 g2 Q
.psx|PlayStation 1(MIPS R3000)8 W4 b; x; t* w- K4 Y
.ps2|PlayStation 2(EmotionEngine)
9 ~/ f7 \2 F2 ]: u) w- I# u! y. i- E.psp|PlayStation Portable(Allegrex)# _# p: F" Y0 Q' T, E) S. P/ f
.n64|Nintendo 64(MIPS R4000)
% t# S( v+ U7 R6 Z+ F1 L.rsp|Nintendo 64(RSP): ] ~( R& t9 f p+ E+ H6 q
.gba|GameBoy Advance(ARM7,默认是thumb模式)3 ^- X2 b, U6 a% }
.nds|Nintendo DS(ARM9,默认是ARM模式)+ b( i! m' i0 v# H& f6 T% n& z
.3ds|Nintendo 3DS(ARM11,默认是ARM模式). p, U0 m6 }/ }0 Q4 n- ~5 M
.arm.big|
. C$ K& v3 X* U8 H% h* `2 q.arm.little|1 c( l! D \4 c: I, T: S( B
/ B& k7 e. _! w1 N* I& y
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
& d# ? F6 z5 p# p- x |
|