签到天数: 2161 天 [LV.Master]伴坛终老
|
! H O! @* d' T1 n1 PARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000$ `( s. Z7 h! l b
6 V" }$ H& S' L/ iARMIPS assembler作者是Kingcom,目前发展到0.9版本
7 ^- ^" k2 _. a) }0 n( _( l
3 D4 Q& W/ X/ ]Kingcom's website:http://aerie.wingdreams.net
2 Z' a. u2 \' D3 p
; J# a' ~$ n* ?( P! C3 CARMIPS assembler源代码可去https://github.com/Kingcom/armips获得5 y2 H8 m& {6 v2 X. Y" _- k" G; v* @
7 b, B. D$ i; e0 p
更新版本可去http://buildbot.orphis.net/armips获得
- O C. K' Y0 d: `# n
( M6 [1 Q4 T( B' B5 a" M! e" MARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
. @* e6 A& y' \5 j+ M* Z Y6 m4 h* K/ @- a0 U
ARMIPS命令行用法:
9 r2 I s% E$ x2 v, H& U4 j/ p2 ?/ {4 I3 Q! c
Usage: armips [optional parameters] <FILE>
, v8 `& w a% r, m) r# N" V5 w3 ?5 @) y! K
Optional parameters:; t( ^, `+ ^" H
-temp <TEMP> Output temporary assembly data to <TEMP> file
0 m9 H5 B6 E% A8 t; @+ i -sym <SYM> Output symbol data in the sym format to <SYM> file0 g4 m. P- l ]
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file" n" e/ T6 `& P4 v2 v
-root <ROOT> Use <ROOT> as working directory during execution: b- z B4 w( n) N0 M, e
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code# J3 |" Z/ B- N6 P
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
" o4 L' a" t6 V9 b9 x -erroronwarning Treat all warnings like errors/ F! C/ f' C* f
, w, h* [7 o) }2 E: H8 c
File arguments:
4 O. G( {; q3 w/ Q- q n7 v3 ?; y <FILE> Main assembly code file4 \! U6 _% ^# j9 p/ @2 D, }
0 ?; K; L/ t0 R-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
# D- |! n# n+ M- c-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba& J& |# I- z& Y9 _
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp J/ M# b# G1 s3 B8 ` L1 {
-root <ROOT>参数是指定执行期间要使用的工作目录- k ] @% _1 q1 y8 q7 ?& p" O1 L" G
-equ <NAME> <VAL>参数用法不明. D5 |8 ]. x d" s. M
-strequ <NAME> <VAL>参数用法不明0 {6 }) N& H9 d, D+ b
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
}) I' d6 {; `& u5 H: x! Z0 {* f! ]/ E" q: V N* h2 b" [' O
<FILE>是汇编代码文件,可用记事本之类编辑& g! A1 k8 B& ]: u5 r8 o8 Z% f
5 G/ k2 ~ L# N$ L, k
注释说明:
6 B' D' \. x8 d/ z注释可在单行指令后面“;”和“//”添加
7 x6 a/ T# k/ z$ ^, r4 S“/* */”式也接受" m) V# ~5 g: K6 Y% Y/ ~4 _8 Q
+ M; E* f0 e( X" l* I. `6 i
例子:
3 P$ W5 c+ P! y! Q9 j.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
* }/ z; H# i( L1 p* B) B. A2 }
/ v! k& B% W% i* h5 e. x/ V, @.close;/*关闭文件*/9 y; H: L8 [7 `3 k
4 {' w/ r" `, O( Z* ~! C7 h标签说明:
2 r: J9 _5 O- _& I7 ]标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
P8 l- `0 s0 i) L1 K) ^6 O
# t7 s6 f+ b& O/ e数值说明:
8 o5 F6 z& ?- G“0xA”和“0Ah”是16进制数值
$ |! c H4 Z5 W: `4 c“0o12”和“12o”是8进制数值- @( b T; D, [- R, o* e, F: U; h+ D! w
“1010b”和“0b1010”是2进制数值8 @6 `' J! n0 T5 t0 D; ~; E% `
1 I9 x8 C2 y8 [ y
equ说明:
- l1 f" w+ `, i5 J% `格式:text equ value n8 l0 b' ]" m$ D& W
说明:用一个text代替value
* n+ d8 `1 H5 ]0 L! M; j例子:6 v4 z. }5 L( ]; P+ D* X* e, u
address1 equ 0x12345678
$ z6 G& ]) l8 |0 g& k+ w8 `ldr r0,=address1. G K5 f; [5 |3 o8 i G+ Q
.pool
% C; \7 C g; a2 @! j7 M& z9 N
函数说明:
2 m. ]- ^+ z3 E" x5 T2 R# |4 B$ B$ {; A+ c+ T% y- K
.open函数:: J3 [, b: C# E7 i
格式:( w! I0 v- K0 @% p8 w8 Q% c" |* _
.open "ROM FileName",offset
' Z8 j3 n; t, w" \( n. b.open "Old FileName","New FileName",offset
0 v! k8 m' s; }0 s2 s) @( h9 V9 D' n说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。- p' P2 [) C0 X
7 @$ b5 E$ d0 R7 {
例子:
& l3 c8 ?9 j% x2 ^3 r4 U1 |5 b.open "1234.gba",0x08000000
# N2 P( y( [* z' c% G# Q, u4 Y; J# H$ a% D* t
.close函数和.closefile函数:
% [& w' f% X: O1 _7 }- N$ T格式:
+ ^, S9 h+ b' y J- T! t) u/ `.close W Q" ?" o% B( M
.closefile! p& \# Q+ R$ b- q" K+ I
说明:关闭文件。
9 ]/ M$ p4 R6 k8 c; Z" H
5 |) R2 w8 {- ~ t.org函数和.orga函数:" ?' P- K1 {6 u
格式:3 H9 Y! ?' f2 |, t `. _7 a- f1 D
.org RamAddress
3 o9 E3 ?: S: r. }) A.orga FileAddress
, a0 q8 e! z% ]说明:7 e& Z- l: h# S
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
4 _; b! l" y. \
1 h V3 v! Y1 O" C4 @.orga函数可指定ROM文件的输出地址。
7 ]& a& U6 Q9 C
6 E7 U) u4 p8 m: E" S9 K.create函数和.createfile函数
( f% Z+ S* V- |4 y, t格式:# g1 y' q- J% K0 x9 s1 @- O
.create "FileName",offset
" u4 E( N2 @1 d% O! Z9 W.createfile "FileName",offset
. w5 `1 M$ Y; @, O说明:创建一个文件,如果文件是存在,他会覆盖掉。& F$ k) T* `+ Z* Z8 t: ^1 ^, _: _
# H1 e; W$ J. p, i, | }
.area函数
; k( u2 k) a& K8 t! a) v格式:" l; a- e: X V V b% m" @8 h5 G
.area SizeEquation[,fill]
4 d }* K0 H3 a, T2 [.endarea9 L( E# y. G1 L) S2 i+ r4 E+ o
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败* R% I* ]3 s6 Y8 Y7 r: j
2 K* M7 u. P5 E' U8 W2 c例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据2 m5 t+ g# `4 U! v. n4 X
org 0x100
9 `1 n2 {3 }. L' O8 C% N( C) P.area 0x8" {$ {% Q. ]$ Y5 d b; f) G$ V! R& p7 h& M
byte 0x5,0x6,0x7,0x8
( Z. \( k; h. c; C4 {* B* _# ~0 o( ^.endarea) o* @$ b- h6 }& K3 z. ]
3 L: F: D2 w# U6 b4 K
.align函数+ g* D, R! I+ a/ X0 y/ ~' y
格式:.align num3 [0 p& R8 p/ q# G$ I7 g! }
说明:写零字节,num为零字节数量,用16进制表示。" W* V' b8 j' @6 t
/ W( A" x4 C0 K, I4 @9 x: i
.pool函数
" \- N# I% V7 E格式:.pool3 I+ Y; b, n) t/ M! K
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。) ?/ C$ Q5 }/ ~9 R# E! ]: D5 e& ^
例子:
+ o( F" i) l0 G8 hldr r0,=0x12345678;
# l' U3 a' j7 x( h7 A& b t....
% {' u. ^- P% i/ e( [.pool/ J! c, a1 i% F# N
* s$ i+ |8 C3 S U/ H# z7 T; S& q8 z
.fill函数8 ?4 }5 z# M4 D
格式:6 s. ~+ U2 M! x/ p
.fill length[,value]
+ W( o0 J- `$ W% `3 Udefs length[,value]5 p( t y% d: a' {( r" t" U
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。) A- D U* ]8 L7 u* Z p
2 x$ U- [1 y+ ?( E& b9 Y) G+ F.skip函数:
& y' H5 L$ V' Z* S+ P& b7 x0 p格式:.skip length1 H4 R: e/ ?0 J3 h1 J) A! a5 F$ ]% L
说明:跳过指定长度单字节数值,length用16进制表示。( f" f+ y$ |. Q" M+ ^0 m# c* o4 U
* z( q8 z3 ?0 E: E. T, \
写单字节:9 {% ?4 r: U3 E: p$ X; x# _8 j
.byte value[,...]# p& f: D& j) O, {
.db value[,...]
3 ^. q7 H" z2 C2 V; Z7 R.ascii value[,...] z3 O$ V, W9 @, l6 V* E* M6 ?6 u2 h0 O
.asciiz value[,...]9 f* ?4 N0 e4 D2 X C- h z9 F6 d
dcb value[,...]; l5 M7 K9 Z% e& D
9 X# U0 {4 \& E; s& E$ {, X写双字节:
4 ^ e5 f/ q: d1 X* @: a4 }. N( \.halfword value[,...], R; x/ @# u. v/ C: Y
.dh value[,...]
4 x/ H5 p* G/ `$ v( g8 Jdcw value[,...]4 a" m$ [' E. i
8 }5 F7 w& H( ~9 e( J1 @
写四字节:
# [/ L- b# t; ^5 t$ {* k.word value[,...]6 W4 @: c% x& f9 s2 U3 I: _7 ]
.dw value[,...]
+ N' D8 M* n% b7 Y" edcd value[,...]6 r4 n- ]6 q! r$ L" b; ]
9 u5 ]/ e! y7 [% r0 |- ?$ d/ [
写doublewords:
+ @* F. Q7 G- M3 a.doubleword value[,...]
+ q+ M: W, Q& `* p2 Z1 }2 }.dd value[,...]
* Z; h: `6 ~) P# b1 H x3 T: jdcq value[,...]
8 r9 n& t; j9 M. E/ l
# Z- {( v1 D$ {. F7 E写浮点数:
' K' n) j: ]1 M8 g' g1 s# ^/ ~6 p.float value[,...]9 z/ V# I& X! T. f$ { B+ I
.double value[,...], K+ B) ^1 b5 B
% E& q# P3 N( K
ARM的ARM模式和THUMB模式定义:
3 [0 r4 u2 g2 T2 u& u( `7 p.arm|ARM模式
3 [9 R3 |0 u0 h X6 y' ~.thumb|thumb模式
0 X" J& g: \% j8 A. g8 o$ n) S
1 ~# a- ~# v# ]) K) n8 b7 a E0 o设置架构:+ ?8 X* e1 w) ?# _1 U
.psx|PlayStation 1(MIPS R3000)! V2 q7 r. y8 B6 t8 l7 H
.ps2|PlayStation 2(EmotionEngine)
9 t6 v$ h$ f3 o8 x.psp|PlayStation Portable(Allegrex)
- S M2 i& p0 g* ]7 V$ z.n64|Nintendo 64(MIPS R4000)" r2 C' ~# @; r! o7 r6 C# d! a
.rsp|Nintendo 64(RSP)$ Q) P# \) }9 `3 L) S
.gba|GameBoy Advance(ARM7,默认是thumb模式)4 c& `: G% i( G( g1 U& ]* z) Y
.nds|Nintendo DS(ARM9,默认是ARM模式)
: ?7 U- V5 H4 p7 o8 }# x.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
5 U# |* W) q9 `6 R7 a: E.arm.big|3 b) a8 x/ p0 ^& R
.arm.little|9 P9 z: `; a# H- Q5 [3 t9 z4 ^
& V+ x6 |2 \4 c% }0 ` J) d' ^常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
g* v! g* J9 s$ @- h4 e6 v9 \ |
|