签到天数: 2051 天 [LV.Master]伴坛终老
|
" _7 g% q v5 w5 G4 ^# z
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
) W& U# b" k* ?) {( P% A4 c3 r) c( x6 s' P( R0 [% M" i6 U
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
) c/ H+ S( X3 Z5 M( G2 i+ ?) U6 u; T
. T0 m$ B9 h! R& z. kKingcom's website:http://aerie.wingdreams.net
$ C) L- O1 c7 b- Y& q$ [
e. k& o7 ?8 ~4 H) A- t. jARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
$ k- F% j! g- W$ R/ @
& f& j8 L: Y& Y% h% D更新版本可去http://buildbot.orphis.net/armips获得
- t0 k J9 |; t- v& c. q8 k5 ^. T
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。" r$ U# V: }7 o- y( s
. F0 _% f4 k* |5 {& N
ARMIPS命令行用法:
( i7 Q) `. a) g$ X8 [1 X+ M5 p2 [2 L0 f
Usage: armips [optional parameters] <FILE>9 ?+ h* g6 B6 r* i5 p; K0 C/ \6 V1 S
6 j7 x! y4 k% \" `" P4 wOptional parameters:2 {7 m; p9 ` [7 h& F/ w& W# \5 _7 f
-temp <TEMP> Output temporary assembly data to <TEMP> file
2 ]/ p5 O' d3 ~6 K' h' c/ B8 p# g& s2 @ -sym <SYM> Output symbol data in the sym format to <SYM> file
, t% N6 B8 S5 o! c0 v -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
6 S: n# a l6 A1 Q! l. o' N -root <ROOT> Use <ROOT> as working directory during execution9 z: h$ `* Z, F- s) W( ?% W1 q' K
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
% ]' d2 [7 M* X& q -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code C6 u- s. [; `* L: b9 N- w
-erroronwarning Treat all warnings like errors) y4 {$ q: p0 A/ _
* O) _9 k" P5 t$ j4 _* R1 n6 r
File arguments:
: H# `4 f+ e+ H( u, f <FILE> Main assembly code file4 l9 U4 }- F( b S3 h
: z/ u0 c/ R* y$ Z K! V-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
# U1 d' ^ e1 u L: _4 v; Z. Y-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba P5 v0 ~5 ]. j$ a: z
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
, D/ k! K& P: _7 S-root <ROOT>参数是指定执行期间要使用的工作目录
+ F- [6 b1 H7 M1 s+ c-equ <NAME> <VAL>参数用法不明
. j5 ?" ]+ o w, O' u-strequ <NAME> <VAL>参数用法不明. O1 J' P& q0 I( F
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
/ A2 E+ Z( q5 `" U) Y6 t
! A" `6 x! Y6 x! C$ V' S<FILE>是汇编代码文件,可用记事本之类编辑
4 R A7 K# L. C" Z% n8 W8 }% B# [8 T9 W! ^! Q6 k1 M
注释说明:' q! b( C' ~/ Y# s
注释可在单行指令后面“;”和“//”添加
8 v- Q- N/ G3 r8 S- V“/* */”式也接受
* V( |" O; {5 b6 s$ Q+ Z- ?9 m$ [' q% |+ T
例子:" |: B8 i8 x1 m) E& F6 D% ~
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
# N7 d* j! n1 N% i. g! w" a1 P( z' k S: k S a
.close;/*关闭文件*/. [# p: f& @3 ]
7 } V+ Y/ X$ a# `. |. S# H
标签说明:6 `2 F# }6 B7 ]
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
6 \- U( K! s- L$ X
6 {6 S2 r) O. Q& }* l H$ w数值说明:
! f( t6 h" V& B# T. I4 K) h: X2 t5 c- ?" G“0xA”和“0Ah”是16进制数值
; Y4 X; z: X5 y! q* D: r3 `: a+ g“0o12”和“12o”是8进制数值
$ m3 t0 V( a5 W$ B* Q' f8 h& a“1010b”和“0b1010”是2进制数值
$ ?$ s& R. }! D- E% N8 G# }. d6 i4 x# u. l* ]; }* ~' y
equ说明:! w; `! i9 {, ?
格式:text equ value
9 w. A, ?$ N7 z" G说明:用一个text代替value
$ {! f& I5 N, }1 q例子:! @7 ]6 L* {4 d# i
address1 equ 0x12345678
2 Y2 E4 P- h8 u) U lldr r0,=address1
8 w) J" g+ W0 m$ V7 ]. P! ?.pool
/ z4 _' e( L% H; j1 e* O% u- G8 O- L4 Q3 D/ y( [0 ^7 T4 G1 Q
函数说明:
9 N$ s+ S7 F( f& j4 k5 A. G& Z5 c
! D M+ b; {3 ^.open函数:3 f' z6 ` ?7 u; C, \
格式:
4 G% k6 {0 x: F.open "ROM FileName",offset
6 c: t1 |/ E; {$ P; p4 H) I.open "Old FileName","New FileName",offset
" M4 B+ E8 V, R D/ E0 `说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。# j# V1 @$ R8 K5 X p( s
5 O) @+ Y( f# E0 x
例子:
* s0 L v2 U W: Z0 j+ I9 e- U.open "1234.gba",0x08000000+ Q& i" a+ t( L3 o# A
+ O( J# X8 I- j& x0 j: i$ ^.close函数和.closefile函数: p* p: A3 d7 T
格式:- g' F4 { v1 ^: M z
.close
/ ^ A: Y O, y: H1 i2 c& z8 B.closefile( P9 x& G: ]4 f `. e% C: }: o4 ^
说明:关闭文件。
" ?" k' I7 K; C, M( x
4 _, P3 t9 }& {.org函数和.orga函数:
3 h, j; _9 [ D8 a o格式:' @2 T! J$ n# g9 a9 r; @
.org RamAddress
% @ N& I$ E6 ^. s6 h$ n, R.orga FileAddress
# Q! V6 X/ x6 y说明:0 ` v3 t+ a0 x0 [$ c0 f
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。3 B& m! Y& `8 Y8 N2 ]2 f
* y+ M) j, v% x% n.orga函数可指定ROM文件的输出地址。
# n+ ~6 I4 ^- l$ a3 G+ ~: Z! e ~+ f% J( G' w: E
.create函数和.createfile函数3 m: h, \7 x& n1 M, N
格式:
- r6 q/ b i- ~1 u9 ?4 D.create "FileName",offset
0 A: y" { W. q% I.createfile "FileName",offset% r7 `5 i" Z" w6 V' M9 r z8 Q8 _
说明:创建一个文件,如果文件是存在,他会覆盖掉。0 l: u: }9 Y" z; K! J/ [
% h( e# ~4 h9 T$ H. ?.area函数4 K8 U' r. i1 H4 y
格式:0 w1 T. C& ?' [" h
.area SizeEquation[,fill]
' S0 ^3 x& G" z% x! v2 n: E5 u.endarea
5 W* f2 ?# `0 O; j说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
* h R4 n; `& A3 x9 r
) t. v" {) L+ `- c+ r R例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据7 s% A9 v: w$ j7 y& m! y: I8 B, e
org 0x100$ }5 U0 D! {& F. r! O5 { q* O
.area 0x82 P9 H* s6 e6 `
byte 0x5,0x6,0x7,0x8
! u) D. v$ F7 p. u.endarea6 G( x( t* L2 f/ }( P( ], Q
! Y) C" C& j' b9 g, u, i4 p7 u1 A
.align函数3 s+ X& J3 v7 y6 l9 T6 S0 O; `7 p
格式:.align num5 w9 h: F2 q) U- |8 U" C3 p( L
说明:写零字节,num为零字节数量,用16进制表示。6 q) s/ ~3 @( y% E6 q2 E
9 M, f+ V9 Y; w9 N.pool函数3 E& E/ e# p4 Y0 t! ?4 h) [
格式:.pool* V/ ]& Q( N8 J# a
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。+ B1 U1 X; z- J1 Y% J
例子:7 k/ L6 o; u6 n0 F, Y
ldr r0,=0x12345678;
: X! N- f0 j0 p2 E....
T1 Y5 T7 I! E: F0 f" k.pool, V9 {$ R" E9 j2 f3 p* o, g
; _. e# x( }8 I, q- N.fill函数( j/ E2 q: `: F( B7 O& c
格式:
: A) V, L; c2 U; o4 f1 S.fill length[,value]
1 Z9 y" y7 T7 u: rdefs length[,value]8 w% H7 ~" h. A! \8 k6 Q
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。5 O/ a. I, R. M( y
3 g0 {3 R" X7 `1 m" ?& w
.skip函数:
7 I/ O3 ? S0 _! O. n格式:.skip length
- G% L0 ^. t% K) q( ~: T说明:跳过指定长度单字节数值,length用16进制表示。- e9 t1 u$ E: o! ^& l9 K" {; Z
8 Q- d* A) { ^
写单字节:! J3 `3 k, n3 @, X6 {0 ?0 @
.byte value[,...]! S: Q/ D6 ], Y' y$ p( B
.db value[,...]2 F$ j7 \& Y/ T6 @5 A) O8 B- e
.ascii value[,...]& W; d; a g% U+ X+ S% {1 t# S
.asciiz value[,...]
8 [( f( s9 _2 c6 [! k l' Pdcb value[,...]
$ X7 _& f* ]- u
) `8 g9 K3 U+ H7 c写双字节:
- g) H- J# S/ S- \' @+ b: b7 L.halfword value[,...]
3 p! G/ E& I+ e+ C/ h.dh value[,...]
1 t* ?; z) y' x, v# Gdcw value[,...]
% z- U1 l% ~. @4 n& \; g; Z/ i7 L2 P6 o( Q6 J0 q4 `9 v# F$ K
写四字节:
) }3 R$ v9 L: p, i; p1 @! w g. J.word value[,...]2 D1 p1 r: P4 K( B+ R; i
.dw value[,...]
: V( P& s% L) @$ T/ h% h' Zdcd value[,...]" R) _7 t1 b: l. Z& l5 V6 K0 |
7 x& ~5 i8 O6 X' g
写doublewords:. d% x) z, t- y" ]
.doubleword value[,...]
4 w% T, o* P; a/ s" w.dd value[,...]
" G' N9 b! m6 _4 b, e( m) ?9 ?dcq value[,...]+ h% T0 I U: s8 j
- s2 {& l- p! F! B1 G
写浮点数:
4 o R" ^. c1 C9 X" j.float value[,...]4 v8 l8 z1 z+ W1 m' j/ ^4 \4 Z* J
.double value[,...]
' [8 g8 c- `& y p
( S1 E( z' Q& p. z8 M- cARM的ARM模式和THUMB模式定义:
! K2 A* {* _9 d.arm|ARM模式
3 x" h# \' b* W5 ^3 v6 P.thumb|thumb模式
9 c* s r! L$ t" x2 O9 i. A9 B! K& y$ c! b
设置架构:9 }2 Z4 a$ Z" C3 \3 D0 R' n7 m3 t5 U9 V" H
.psx|PlayStation 1(MIPS R3000)
+ a, h: I/ L5 c1 ^.ps2|PlayStation 2(EmotionEngine)$ I- V( s6 b7 F4 f5 }( D
.psp|PlayStation Portable(Allegrex)7 B" j+ ^6 k* P5 I8 e/ L
.n64|Nintendo 64(MIPS R4000)7 i2 A# x- R s7 A4 P4 g
.rsp|Nintendo 64(RSP)% J2 ]( b" y2 w# {8 N
.gba|GameBoy Advance(ARM7,默认是thumb模式)+ z$ G# |( X* e9 y; W
.nds|Nintendo DS(ARM9,默认是ARM模式); j4 L0 ?" \: p* [, c
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)% p, d8 j. f4 }" B
.arm.big|7 C' G+ {/ p( H' r W# V
.arm.little|2 J1 e+ X8 C6 G) y$ ]/ w
* c0 Y. }: ]$ d0 x6 `. `. U. z常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。% t/ y: T$ j6 S4 h' E% R4 c0 L
|
|