签到天数: 2166 天 [LV.Master]伴坛终老
|
! o4 t& {, |6 t. l/ E& m
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
9 S1 c+ u: p- i, @2 }
6 H& j1 [, _! r9 z3 x6 B5 SARMIPS assembler作者是Kingcom,目前发展到0.9版本/ X% k4 P: N& x6 y2 C# f
- |$ b: O7 @# Q, k2 ZKingcom's website:http://aerie.wingdreams.net3 E# M* w/ E! G) P' [/ b# H4 S& r
4 | {+ M9 r4 K, N! kARMIPS assembler源代码可去https://github.com/Kingcom/armips获得. N( n) K2 Z' i" ^+ r
, T$ T [- p+ J; J( R更新版本可去http://buildbot.orphis.net/armips获得
! n+ ]/ d- E r& P1 M' O4 J* s- h6 L+ L8 H i1 r9 `+ o' ?0 k7 [8 z
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
0 ]6 ^1 L/ z5 U1 e: A9 N( Y8 }( }# A7 ~5 u, x3 Q% v3 u8 h- I; C, h
ARMIPS命令行用法: X7 }' F8 D6 l# R. w
1 ]. }) k5 Y4 `9 M8 M4 h0 L3 s
Usage: armips [optional parameters] <FILE>
6 R# F: }* Z9 [, n
) W: {3 u3 @: r' M9 ]9 ]" AOptional parameters:% \. d# M" i* @/ o# ?* h$ Z
-temp <TEMP> Output temporary assembly data to <TEMP> file0 w% D* C; R4 T6 _
-sym <SYM> Output symbol data in the sym format to <SYM> file
: w) j- Z% e& s2 o -sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
, |! p6 u4 D! @ t6 k -root <ROOT> Use <ROOT> as working directory during execution
3 b7 F( ~+ @4 ~/ N) B i4 Z -equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code1 W3 [$ E- O+ H
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code! f8 M4 S* ], @# T: h
-erroronwarning Treat all warnings like errors; h5 U/ K" O y# e+ b! H6 |' G* ]6 X3 u
W D- z. ^! v+ A( F
File arguments:
: W7 @4 Y( M2 u) k$ g$ a3 ` <FILE> Main assembly code file) U, E" S4 B+ Q: O. B* L
$ \, J% ]: v& [% ?, k
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件& ~! Z* Y% ~* |
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba+ U( t% ^$ P9 _! K! ?
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
9 H4 c; o% U% b* T$ R9 J) }-root <ROOT>参数是指定执行期间要使用的工作目录" Y; }! m/ ?! F0 g1 _7 N7 m ^! v
-equ <NAME> <VAL>参数用法不明
; ?3 d8 W# q. a! o% M& _-strequ <NAME> <VAL>参数用法不明, u6 `9 r3 w1 }; P R' \
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译- [6 ~0 }4 ]+ m4 b0 M8 f7 G
' ~2 ]# e. F5 k: Z4 ^+ o) N<FILE>是汇编代码文件,可用记事本之类编辑
# X3 ] {/ v* _8 E9 T$ h4 b$ K
9 z4 Z8 N l! }) P& k# G注释说明:2 g& ?4 e' O. j, X
注释可在单行指令后面“;”和“//”添加6 J/ `+ Y) s2 T9 O
“/* */”式也接受+ {* {5 Y2 J# J8 u1 l0 Z+ X# S
" e9 V! E8 z) a: k6 _! E5 p; _
例子:- V6 Z$ h5 F! y8 f
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
8 R2 c4 I! `3 f7 a8 _2 ?8 S- U
0 O$ Q2 H- A7 j# L9 |& i( M' j.close;/*关闭文件*/
G7 N; k8 v$ `, N0 P& t$ c7 A/ h. @5 h8 q
标签说明:0 s! i4 Y5 a5 B5 R0 g8 Z( F- W
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。' a7 E; Q4 A2 J$ Z6 a
! J& x' g/ N5 a+ ~8 A
数值说明:
4 K7 i3 W4 u' t& O( J2 `“0xA”和“0Ah”是16进制数值/ U: ^& F4 M2 J5 L3 I
“0o12”和“12o”是8进制数值" A$ n; f1 e; O4 R* p
“1010b”和“0b1010”是2进制数值
2 R* A- U4 r. a& \% d
: [8 J4 @0 g0 o q0 l6 f' Nequ说明:
E' |0 s; m( c/ ~ P格式:text equ value
, b+ j* `% g7 q/ y4 ` m+ R说明:用一个text代替value& E" a# `( s5 I( s* F$ F$ b, `
例子:
& Y6 s- s Z/ C+ m K0 U3 haddress1 equ 0x123456783 O% c/ K: ^0 P) c3 @
ldr r0,=address11 r7 Q: `( ] ^
.pool
: r7 V& r8 D5 I9 U% k
" _. ~% A' @. ~5 y6 M; _函数说明:
6 b; K' A9 N" s# C) \7 h) F G6 Y0 b* r# @8 | |* E' u- H
.open函数:( l0 M; U5 d8 y
格式:
' H( {, x+ m* m9 |- r+ G.open "ROM FileName",offset+ X0 c% x% \9 B- V9 V; U- q2 X
.open "Old FileName","New FileName",offset" ~5 l/ r6 r9 B: S% R, y( t) K- u& a
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。2 }% O( ^2 X4 |" S. X7 a" n
. }0 \/ l, T# _
例子:
" z- p2 O! h C+ p5 N/ ~2 Z- m.open "1234.gba",0x080000004 Z' D# M" e4 a* B, K) [
. P, i4 ~: u! k6 ^' d9 [
.close函数和.closefile函数:
; Z3 M( w" q2 k; F i) k格式:4 X5 ^) C) q. a5 S2 q7 V
.close
4 y9 G% R) F, }0 v2 ~.closefile! d/ d0 K# T% {8 Z# {
说明:关闭文件。
6 g/ v! }5 X) E2 v0 M5 H& Y
% |2 `. g4 P6 ^4 l.org函数和.orga函数:. a, r$ e; O2 v% b2 d) _0 g
格式:+ v: v# a6 N5 T7 x& F% o% t) H
.org RamAddress
k N$ I5 \# A6 b3 n.orga FileAddress
& L. ^ M0 ]4 {$ d! _: l; [说明:2 C2 x3 i! v) S6 s
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
1 g/ e) v# o# K6 z" K
: Y0 d8 L* q8 Q2 `% ^5 h.orga函数可指定ROM文件的输出地址。
/ e" `1 z$ c+ l6 t
) V- H, G! r0 A.create函数和.createfile函数! m. i) W' n; m* J0 `1 |" v' k
格式:6 c' `* `4 @9 ?8 Y* q8 T) s
.create "FileName",offset
: t' g; a& V* h! Y.createfile "FileName",offset+ ^. v: @8 B ~/ [8 l+ m# I
说明:创建一个文件,如果文件是存在,他会覆盖掉。3 P9 p6 b* }( m0 {+ t: ?
8 }8 Q ^# C# |, P. C( ^) G) _
.area函数
; ~* }$ j4 |8 Y格式:
7 B$ i9 {* @' }; L& O5 O# Q.area SizeEquation[,fill]' N8 {' H m7 S U6 e! @
.endarea
0 }0 Z& o1 r0 a, ]说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
5 p% X: R1 \# N& {2 a+ n6 x' I( v k
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
" R! K, j6 U# Uorg 0x100, \7 X# ^$ v# q2 t8 t1 Q
.area 0x8
; g8 G; N% g/ e. y; Obyte 0x5,0x6,0x7,0x8
7 J6 v3 q8 T# b& h" b.endarea9 R% Y& C; b. h- g' L
9 R4 O+ D' e0 D) f) R+ q
.align函数
# V" M* N: R5 l6 {格式:.align num
' k& u. c, g% g. |+ {说明:写零字节,num为零字节数量,用16进制表示。
/ O Z) Y) M% k
# J. A0 @ m. _) w. v.pool函数
5 n" I& A* x) x6 S格式:.pool
; V% R; _% J; N. J/ H# C! d" b说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
) [# L3 U+ g5 j. z% B例子:8 L0 ]7 B" H4 Q$ L6 n
ldr r0,=0x12345678;+ _; m; [1 b9 y1 e: h- |" J- Q
....
* F4 H+ c1 b, |) ^6 k: ]8 r.pool
1 G* e' U9 Q9 p2 ~& r# L! b3 ^7 ]' v: t$ l
.fill函数1 b0 \8 L) T# D* B7 t
格式:2 L7 r& v* W* R
.fill length[,value]
' |7 i7 M) p4 }: P- K9 k/ [* Cdefs length[,value]' w& @0 X( [' l P! @
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。/ i# n2 Z/ |. F' W9 ^( M! ?
$ I! }8 s# b$ Q; m6 Q' y& r4 R.skip函数:: [4 D0 @5 \, s8 x
格式:.skip length8 p0 w; I6 m, y P, v9 F3 ~
说明:跳过指定长度单字节数值,length用16进制表示。- K" G. f+ q6 H5 w
8 c! [0 v' s: Y" {
写单字节:
$ X4 F. b9 P" K.byte value[,...]
, c/ u& L$ P0 z8 w+ E" Z3 ].db value[,...]% u3 l3 g. ]" K/ I$ ^9 w0 y, x- D
.ascii value[,...]3 H% P# _4 |. T4 k3 v
.asciiz value[,...]
_9 m+ W, R+ E7 i: C$ g$ Z8 X. [dcb value[,...]
: o( h- E; ?. J+ R
" J+ X8 X/ Z, G) S1 r. [$ N# B写双字节:4 O3 m5 J8 P1 v0 b2 O4 s
.halfword value[,...]
( w( D! U c" j1 M! b5 p% u0 O8 {.dh value[,...]7 v1 D9 w- C1 G
dcw value[,...]3 X3 F8 S9 V( d* S8 u
. `" ^$ D" G% @9 Q: E$ K9 H写四字节:
* }; G6 `- b R) V. o! h7 d1 q.word value[,...]
& N- Y4 S: j7 p" f/ f* i' @3 `.dw value[,...]1 M4 L7 X0 \* r0 I/ C; f* A1 M
dcd value[,...]" p7 E% m5 ?2 o1 U3 u0 y
; {- O6 n0 m0 a( f
写doublewords:
1 w5 Z" K& p/ i% z1 w4 w& }.doubleword value[,...]+ z9 C6 I" G7 N d8 C3 v
.dd value[,...]6 _+ ]7 z$ W9 Z! G Y y% b9 N9 l7 ]
dcq value[,...]4 A' f: A' S) V7 z, F* T
$ { N- H& X: V* m a6 }
写浮点数:$ G. ~4 I1 s- ^7 |8 I+ \# b2 {
.float value[,...]
4 }( j8 J+ x4 X: ?( ^4 [.double value[,...]
' r& V. H0 D$ v5 J- @; J2 B; {1 \
ARM的ARM模式和THUMB模式定义:- r5 M# e9 c$ Y- { {# w" Y, N0 A0 q
.arm|ARM模式3 ?9 ]: Y8 x0 D
.thumb|thumb模式. z. g7 `2 d3 s
) |3 i2 r1 [3 c6 Q
设置架构:
3 a/ @3 w" t; C5 h2 s$ l( ` Z.psx|PlayStation 1(MIPS R3000)5 M" f/ \2 @( \& O
.ps2|PlayStation 2(EmotionEngine)( l+ P" S" }( q8 w
.psp|PlayStation Portable(Allegrex)0 Y- m$ q! `6 ? a6 D$ |4 p
.n64|Nintendo 64(MIPS R4000)
% e9 g J; J- l7 l2 q- f.rsp|Nintendo 64(RSP)6 @0 p$ P6 t9 I2 k( g7 P9 c
.gba|GameBoy Advance(ARM7,默认是thumb模式)
3 ^+ C# w3 W2 a1 |8 v.nds|Nintendo DS(ARM9,默认是ARM模式) p$ q! u9 ?5 T) ^
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)0 I& p! y3 k/ I3 H/ ]6 ~5 s! w2 t
.arm.big|
F0 C8 A+ u" T% `, ?6 A.arm.little|
/ ^! x8 ^% @' P i( h+ `1 z* O# h7 h9 j9 C$ U
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
* U6 g! t/ s! B! K) y |
|