签到天数: 2196 天 [LV.Master]伴坛终老
|
: l2 ^) [! B5 d! x
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000 a+ z3 Y2 B) D) ~ x$ p
* ?0 [5 S% `" G+ F9 H3 I2 ^ARMIPS assembler作者是Kingcom,目前发展到0.9版本' w, X8 z2 s! C' ]: Y1 c
5 ]. W; D% q; d7 mKingcom's website:http://aerie.wingdreams.net7 ?$ z9 G0 z4 A
& Z5 C# r* l4 ] q* ?- R- m& LARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
5 K q. Z5 X6 y* g7 e; @2 @% S6 S
* j m+ A, V6 t, P7 A更新版本可去http://buildbot.orphis.net/armips获得
7 h+ L, C& P% A7 h6 s/ N! y k$ T
8 E# r+ Y4 `6 g) [) `7 h* }" XARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。; z; d- ^! M* {. P; q; U5 S
5 l2 x1 t! W& w* w. g, r
ARMIPS命令行用法:) x- w+ Z* w1 ^) m9 s
) }, }8 d G/ m. R) _, f5 ^Usage: armips [optional parameters] <FILE># _. g" L a( k4 n( g* S
3 y+ [8 q4 L4 r. l1 A
Optional parameters:3 t2 P7 l) K5 \5 H
-temp <TEMP> Output temporary assembly data to <TEMP> file1 r5 e, S) s& W2 H6 E
-sym <SYM> Output symbol data in the sym format to <SYM> file+ A! j6 F1 k6 ]
-sym2 <SYM2> Output symbol data in the sym2 format to <SYM2> file
. t* {: Y- Q% G: _. i. x -root <ROOT> Use <ROOT> as working directory during execution% ]. A3 L- z' r% B M9 n' t
-equ <NAME> <VAL> Equivalent to '<NAME> equ <VAL>' in code
- h) F5 c4 M0 }' ]) A -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
9 U4 q* y2 J( U1 n: m4 | -erroronwarning Treat all warnings like errors5 Z2 w. p( H1 ~
" M- N) v+ I/ K, m3 r9 h9 DFile arguments:
7 r$ {1 ?' Y+ B8 V% j* \; w <FILE> Main assembly code file
' q/ l5 c& G/ |, a: G5 K" m5 w( m
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
8 f& U! I5 _$ i$ y( A* Q( k B-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba4 L+ ~& Y3 @: o! E6 h7 `" g9 u2 b! \- @
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
6 P7 U# [/ k8 g p- Z( ^-root <ROOT>参数是指定执行期间要使用的工作目录% j) \( X6 j4 y8 [& x/ c3 ^
-equ <NAME> <VAL>参数用法不明& {. X$ r0 h% T! n
-strequ <NAME> <VAL>参数用法不明9 t3 S2 f# ]) P" P1 e
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
/ Q$ K; V0 R `6 Y( Z4 b% _( W/ l" E8 g( t( J4 w0 e0 ]
<FILE>是汇编代码文件,可用记事本之类编辑; H6 Q3 S" a/ F
, e7 i1 R8 v! {/ o. c% Q6 }
注释说明:& l9 M0 i, r& _9 W. J: @
注释可在单行指令后面“;”和“//”添加: ^& [- N2 L! b
“/* */”式也接受
& O5 v* s% j* U% k; r D0 p( n) k% i$ j* a2 [ A
例子:
( U0 I. h1 F* ?" O, u9 i2 M.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000008 U/ w2 K( h: k& t
& ?/ S* w! e7 g- e; K2 v.close;/*关闭文件*/+ f$ L2 w8 s2 C. k( V" v
4 `9 k9 o* P3 ?' S: f
标签说明:* P" L9 M# P) C; F7 e. R5 r6 H
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
2 l/ {4 J: F* J; }2 i [7 t* O3 Y" v. Z# f! p+ W/ G
数值说明:
# G2 }& u" Y* I& x$ }“0xA”和“0Ah”是16进制数值; i1 \) G3 V5 I7 a8 V
“0o12”和“12o”是8进制数值
- N$ M: ~# b* }- u% N) `“1010b”和“0b1010”是2进制数值, N2 ~; z# m5 |; u# p
; k2 L3 y! `9 y' g( [
equ说明:) p/ m, ~6 [0 f0 J3 H* U) ]% V
格式:text equ value/ l$ e( b& G R# G+ i
说明:用一个text代替value. R5 t, X/ v/ J. S9 U
例子:
9 v! M" M" s, J; X ~address1 equ 0x12345678
* c. ]* Y& }! `- Q2 F( E6 d% Rldr r0,=address1! T2 }% U, q/ j+ G
.pool
1 _8 s. n% n' V
" X* A" j4 G: W3 l8 h7 t函数说明:1 ?' L; H4 C& h/ m
/ m: U" e. i& A4 `8 C3 ~, ^.open函数:8 k* y+ |) q7 j
格式:
9 A* Z- ~+ {$ u* E7 J3 c.open "ROM FileName",offset4 X, }7 A. T2 O0 y% h P T
.open "Old FileName","New FileName",offset
3 P2 }) c( V/ o( O说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
1 ~; d" j) I5 `+ Z. b1 A0 T6 ^1 k0 w" _
例子:
p0 C6 q y$ ]/ F; W7 |.open "1234.gba",0x08000000' l8 @1 V" c) A. R# p' ]
' L; T1 S! I9 s. f
.close函数和.closefile函数:
" M& S% @, h$ I+ C1 }: K9 N格式:
% E. V8 c1 g% t' B.close& i7 q3 ~2 E! e8 U) d P
.closefile
% w" g" ?; X/ n* C$ \( f- M说明:关闭文件。+ z: y9 w2 g) R3 d, v& d
, C# Y. k1 Y4 y* T5 F.org函数和.orga函数:- F& i$ G* u$ ?9 N& A' E/ F# h
格式:, w; }1 E( H+ ~- `
.org RamAddress E7 i! U% j& f- ~; m$ Q
.orga FileAddress; N _5 b" w" Z- z, t, g
说明:( J/ c1 ~. }+ u9 \) h( @/ @
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
! R; }' U. A# `4 I) N
8 l$ u; V, e& Y/ f! \1 ^.orga函数可指定ROM文件的输出地址。) a1 x# @# K5 h5 z3 n9 s4 G9 e
' l# f& D1 d" D6 k2 v! T
.create函数和.createfile函数
; L- U1 g$ s1 I5 }7 m& g格式:$ _: i2 h# G1 ^- p# Y/ e6 j @3 r
.create "FileName",offset+ X) @' \6 f4 @5 H9 A7 N
.createfile "FileName",offset! y" K7 ?9 c7 w
说明:创建一个文件,如果文件是存在,他会覆盖掉。
+ |6 [ Y( `' L! V( I- Z+ c2 R% i7 R, X( a' [7 v) U7 ]
.area函数
' U/ R' O; }6 h( n: |( s格式:
! v/ m3 y9 k: l$ d.area SizeEquation[,fill]/ J+ N7 `% P, i
.endarea8 ?/ g( ?8 w4 J: H; E
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败. V" d1 ]9 l8 Y; B1 T
$ ]5 [. ^* w3 _' F* \+ k例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
3 x0 i- m9 d: [' F8 Z" W6 ~org 0x100
; W( i# R& y, g) r- B! y/ k% w.area 0x8
0 b+ ~8 \2 g4 M, ibyte 0x5,0x6,0x7,0x8
$ b& T: S4 @$ b- t# |.endarea
* [) v+ @6 j9 b5 Q; J' d9 v" z
2 x% ?1 p9 _/ Q1 w$ N.align函数9 B4 X& T2 ~0 k) E$ `
格式:.align num
$ C3 j. D7 {) }9 |说明:写零字节,num为零字节数量,用16进制表示。
) Y# f* \+ y3 ?2 ?! |- H! j6 z* X& s3 V
.pool函数
* ^6 ?( c. {' y- ]格式:.pool
; q( ?# u: L, M' ]& G说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
6 Z4 a: {" w8 G例子:
% Q' N, I$ v' k: O. B% R9 qldr r0,=0x12345678;
5 \ E9 c. V* I& R) g, E) l....# j& O% `" U) O! E( U& l, Q
.pool l# | @- W7 ?1 W `4 m" M0 S' s
# f; k7 ?' { w4 j; k
.fill函数
, @1 O* A2 W L格式:3 p+ y# y. }. i& m
.fill length[,value]
) [* Z7 x8 `7 A C8 P* Udefs length[,value]0 T9 r: c; O8 C$ a
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。* J+ a Z0 Y" q9 {& s
: K; h2 N4 i' R5 U/ C
.skip函数:1 `& b" X; K' Z7 F
格式:.skip length
& ?% `# F) a* P1 w: `/ G% k说明:跳过指定长度单字节数值,length用16进制表示。( P9 y8 |" A/ s7 V
8 F; X# V! E8 F3 \% s' ?& G% u写单字节:) h( A; X( \+ R" K2 \6 \
.byte value[,...]/ M8 u+ ]5 i; P/ e- n
.db value[,...]
. V2 H. U& r. H" c2 K: f.ascii value[,...]0 }9 L4 f% _) _* W
.asciiz value[,...]
9 L: l8 P; _" v5 V+ E- `- n4 F( |dcb value[,...]
. u* p$ y u6 K/ Q7 U( [. M1 m5 e+ u, A* T Z! t, x Z6 I
写双字节:( P; f& W2 D8 ^1 ~: b
.halfword value[,...]
( q# p9 I1 x) \; [0 v7 _/ H9 _( _.dh value[,...]
9 f l @! q% |8 n" Vdcw value[,...]
- e* F5 {3 I! ?8 ]; o x, h4 j( H, u1 @% D0 U, e1 c8 v
写四字节:& A& G/ F; I% [0 G' ~* ?: p
.word value[,...]4 b$ i }! Y5 t3 x- @0 T
.dw value[,...]
& H y- u8 X N. l2 f( vdcd value[,...]& i! n, x; y/ c& \" b
% n+ u( S! k3 J: K/ {写doublewords:2 H( p! f0 g6 B U& G
.doubleword value[,...]
7 o6 X. F7 b, t* U.dd value[,...]
$ {4 p6 d7 z$ O( K& Bdcq value[,...]) z& q$ T# A6 N- ]* B
7 Q5 _4 S) o4 ~1 k写浮点数:) ^8 s$ a% p2 Y/ G: I
.float value[,...]7 p& a' @2 Q8 O0 I
.double value[,...]9 U! t# M) G" d
) ]# l2 H2 C* h L% d* u0 |4 qARM的ARM模式和THUMB模式定义:& ]# v _7 B \
.arm|ARM模式1 r. b3 T, z0 \/ [
.thumb|thumb模式
* g' W. b- b8 D( a& T
8 W% Q" P6 g1 Q2 s$ T- ~设置架构:; N0 f) }# W, Q% j# \
.psx|PlayStation 1(MIPS R3000); B5 ^/ k6 B- x- S/ D) b
.ps2|PlayStation 2(EmotionEngine)
: _/ I) G) G1 L6 [0 z5 ^: Q.psp|PlayStation Portable(Allegrex)
, Y0 p k( ^2 d0 R.n64|Nintendo 64(MIPS R4000)4 e$ W/ Z# l$ K! r3 Q) q1 ~* u
.rsp|Nintendo 64(RSP)
& F \0 l' f2 I/ {2 m# v& }" I# R.gba|GameBoy Advance(ARM7,默认是thumb模式)
D0 q) B* `7 ] h, i.nds|Nintendo DS(ARM9,默认是ARM模式)
! @# e6 D4 ]6 b) |, k.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
; q; p) l$ Z: u! Z% a4 v* w" {& P: `.arm.big|
" Z) u$ g, w4 E2 v.arm.little|! c1 Q6 I' {* X1 @3 q
. F/ L6 M$ Y4 L B5 g7 B
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
) x0 [! d" q5 _) D. m' q1 [, n |
|