EMU618社区

 找回密码
 立即注册
搜索
查看: 580|回复: 0

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2136 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
- W. S" E7 P' C1 D- o8 v# |
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
# r& B5 ~+ Z7 c! C" {
1 U& \! {0 l. R3 X# Z- e' UARMIPS assembler作者是Kingcom,目前发展到0.9版本( Y: b) T; z" ~5 n  N

5 L# \1 i' O# U$ h1 {/ I; CKingcom's website:http://aerie.wingdreams.net! `! F7 E7 H9 I/ [

7 N# A6 ~) O1 o; `6 FARMIPS assembler源代码可去https://github.com/Kingcom/armips获得# z% E1 e; r, V& l0 M0 `: T1 l
% l/ \% F, ]% t0 E4 s; ?3 _
更新版本可去http://buildbot.orphis.net/armips获得4 U. O- A  Y, [$ p3 g% ]

1 N8 g2 i! t4 tARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。; I! B6 a  F' u
: c; F0 W0 C' I" @
ARMIPS命令行用法:
* W/ W; y. W! b' H4 E1 Q
% C) U3 A" G: c) Z- O6 L- R. g' IUsage: armips [optional parameters] <FILE>
6 M' z, N% w) G6 ?3 Z
- M0 Y' j" e0 P* YOptional parameters:
2 H. o* c6 Y- A -temp <TEMP>         Output temporary assembly data to <TEMP> file
  O  M4 b3 |2 Y" |- N) P -sym  <SYM>          Output symbol data in the sym format to <SYM> file
- p3 x0 q# f% w- s; A3 W  Y -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
# t' j9 d, p* F' s -root <ROOT>         Use <ROOT> as working directory during execution
: b9 W0 Z2 M, Z) R6 V8 p -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code) t/ _4 X+ j2 e* a" Q8 v7 l6 O
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code  G. O5 I0 h: h; K3 P
-erroronwarning      Treat all warnings like errors/ K5 r) C* H: r) d6 v% z, [

/ f* q+ B/ p1 y9 A* y" G5 gFile arguments:: b# r1 ]3 P9 ?, S4 s) w/ Y
<FILE>               Main assembly code file
% Y4 d. w0 V* x+ n+ p# d5 `9 E% e6 c9 x) r' u& M2 a/ h5 E0 t$ D
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
4 c% N( G( V2 s7 ]+ _8 e; o) s-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba& ]2 J! O! z! H$ g6 \3 P8 U% Z
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp4 U0 O) B8 Z5 a1 N) C) G
-root <ROOT>参数是指定执行期间要使用的工作目录# B( r/ [2 X) V2 g/ t
-equ <NAME> <VAL>参数用法不明3 B! u  w, O0 g+ H1 {- f) Y, T1 h
-strequ <NAME> <VAL>参数用法不明
4 n: v/ c, H& k$ X$ a0 z  u-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
, N# p* t" W0 X1 Z; |1 `  A  M4 Q: H7 }+ [; g+ K+ I. ]; l# }6 {7 T5 t
<FILE>是汇编代码文件,可用记事本之类编辑
' i/ d- N9 L- c) `4 Q" J# Y  S/ q1 o' c9 v
注释说明:
& \: O3 \/ Q: L+ H( w& V注释可在单行指令后面“;”和“//”添加8 `1 s  r% q2 S  o
“/* */”式也接受
5 o) _+ k. N2 V$ J
9 m( x, T* H. z2 B例子:3 l; R9 q' _7 W3 D6 u: J$ r& d
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000) ^9 B6 g% W* X

% \7 P+ r( n. t.close;/*关闭文件*// H/ d; N  i2 U9 p1 \( _2 z

0 t$ g& ~# ?! k' }, P$ V标签说明:
% S/ m* p* y4 B标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
( I" h" S3 w! i% g+ \! h  U$ N
7 M, h& E1 k" E! H+ o数值说明:
" t4 w0 N: M$ Z2 }) y“0xA”和“0Ah”是16进制数值
( `$ y4 A0 s$ @3 ~2 C“0o12”和“12o”是8进制数值
: c1 {9 T" q$ t$ ^( |/ }& S" r) m“1010b”和“0b1010”是2进制数值# L2 k8 Y" g: M$ n0 n9 z  Q
) X9 Y* }" d6 u1 r: [( H/ H
equ说明:9 Z* n5 Y) m. \. f) y
格式:text equ value
. _8 R  |4 T- f8 e# V* A3 _: X说明:用一个text代替value
/ ^9 I3 y1 k8 C0 r" k例子:; O; l! l4 U$ Y9 C9 {+ m
address1 equ 0x12345678. k; z" K" i2 L# s0 h5 m: e; b
ldr r0,=address1
+ h* g- R4 J2 ^3 Y.pool
: d6 G  D, L# b6 q- W" |; b) D. n2 Y5 q5 {
函数说明:" J( M7 b1 g5 H& w" J9 c9 \7 d

6 d2 _3 Z# l5 h; U.open函数:
; v: }& Z2 R# |. e: `( E8 K2 ]+ R2 L格式:5 F2 r' J1 p7 v2 L2 a. X; I' z
.open "ROM FileName",offset
+ v* j9 i3 ^  F.open "Old FileName","New FileName",offset
1 j/ I# z3 M5 X. o. d, ]5 f说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。+ r3 \$ r7 e3 k6 u$ f6 h0 ~- B
2 R7 y1 z( t% n; M* A. n1 m
例子:
/ {8 t( q) Q/ W6 @2 ^# x+ ~' @.open "1234.gba",0x08000000% g$ c' \! e7 g- J$ I6 s  y  I
9 I9 I! w( w) ?4 ?& I
.close函数和.closefile函数:% j# o& X2 k0 ]' ?! ?! ~7 m7 F- D# T& f
格式:8 u. [( Q1 @4 p
.close1 }8 t! A7 ^/ l7 d
.closefile
7 }2 W! T# b3 f2 z" H. I说明:关闭文件。1 K8 d+ c+ p2 [  _

2 }2 T! K# d* R* Q.org函数和.orga函数:$ u! n  E& S  C* a9 \4 \6 i
格式:; N! r5 g7 _1 b3 W' N3 G! M
.org RamAddress
: P7 H$ P( k8 ^3 h2 Y.orga FileAddress
4 {5 K1 [) w5 O' [- y* L说明:
1 C, C' t& A; t$ i& ~前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。' C# N9 N4 z' d: B- S
7 ]6 o5 j! ]0 g: p! h) w. k$ x
.orga函数可指定ROM文件的输出地址。6 ]/ |' r4 T  S) Y
8 z4 u, n$ J( w: b
.create函数和.createfile函数% P9 [3 e0 X" K
格式:
/ O) Z8 t6 J. B( n' i" {3 y4 U% d0 t0 N.create "FileName",offset4 T+ z8 K  I; k, D# ^
.createfile "FileName",offset# B1 D/ l# d" c  K' h5 o$ P
说明:创建一个文件,如果文件是存在,他会覆盖掉。4 H  e8 v( N% Y7 j: Z/ m) j- p, Q

7 t/ Z* j; B; K.area函数! y1 n( W+ B* n( Y
格式:0 ]+ E* P1 [, u/ @8 v* B2 H" g
.area SizeEquation[,fill]5 h9 G% A/ R3 j+ Q1 {. ]8 n! I/ ^1 u
.endarea
$ A! e) `! {' C8 G+ |+ e说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
- A' x$ G2 V! X: E" O* `. }8 d7 `- d$ `" K0 k2 B! v4 P. ^) f
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据! N# M! q& Q5 z; j
org 0x100
$ C3 s( @; D5 C6 J/ s.area 0x8: R( \4 |# }! L+ V7 s
byte 0x5,0x6,0x7,0x8/ P4 c6 U8 |5 C  ^9 B. P; a
.endarea
( H* L& P# q6 o3 g2 E. N# f6 ?9 r2 F9 l. }6 C' h: e
.align函数8 t* a8 E7 h* `& j9 \7 j) c
格式:.align num: j7 K! T! j1 c) L  I4 c
说明:写零字节,num为零字节数量,用16进制表示。4 x- E! x5 O3 Z6 [1 P/ B' {4 J

+ O+ A2 V/ Z9 k8 V9 O.pool函数% ?9 R4 z8 W: S
格式:.pool
+ X5 i& d5 k8 v% a; s) F5 _# L9 o; w; S说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
7 \2 ?2 {' o. J+ e6 L例子:
( }; N# ^6 V( w$ q# u7 V& `ldr r0,=0x12345678;
' C; S  r% f6 d+ b0 J* l6 O4 t....- Q/ o7 f4 u1 k$ \) x. |
.pool% f. |! Y+ @% L, K' H# d

& H! n- e$ ?0 S- r- G.fill函数
, J5 H: p9 [& f9 l/ n格式:
" A5 R' [3 R  N, P( e.fill length[,value]
+ C! T* d8 B9 edefs length[,value]/ d7 j; ?6 z  n4 c1 e! }
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
% _8 a7 r' @% M4 S6 Q# ?7 \$ D+ }  ~7 K* H
.skip函数:
4 O8 U0 L7 G* ?: U7 v格式:.skip length
# q+ m) c% l5 {. n说明:跳过指定长度单字节数值,length用16进制表示。
1 u+ n' U$ r" @5 I$ G* U* A( J% I8 ^# T! o6 x
写单字节:7 A/ K4 ^1 R; L4 T
.byte value[,...]
- v. x& k2 c9 A' G.db value[,...]% Y1 f! `" f0 I/ z$ Y" P
.ascii value[,...]5 K' b' a0 u" ~* a) d0 n0 z
.asciiz value[,...]5 `% h; C* n9 z7 w) ]! `
dcb value[,...]1 R% g9 O' H3 C+ H' _5 D
9 f, y  X- X2 D, i# `$ z5 {9 n/ ~
写双字节:6 v7 F/ ]( G7 m% E3 K) h7 k* ]3 q
.halfword value[,...]
' Y( H. A5 m; A9 P* F9 e! p.dh value[,...]2 T7 K8 [1 D( d1 Z; b" |) o
dcw value[,...]2 V; r3 Q8 u5 y  ?6 j% j1 C4 w

8 Q- M/ p8 V8 s' g: o- i写四字节:
8 _: l, {; I  `+ @5 Q' k.word value[,...]
0 p# j/ K2 @7 r3 b% m$ m.dw value[,...]
8 P( e8 M" }$ l. v, |0 @; ddcd value[,...]
- k2 s. L# l4 }# M! f5 a% A- g
/ @; B- ~: l9 x' J( d写doublewords:
; z6 I# c; |; F6 ~; a' K.doubleword value[,...]7 i0 T  I# L! Q2 |6 c
.dd value[,...]
: H5 L, s; y# @+ tdcq value[,...]
6 Y3 {6 c3 O& M) a3 M9 m; u2 c7 t$ C: W3 c: {9 m
写浮点数:
- f: l* m7 z9 v9 y+ A2 p.float value[,...]
* `6 G: h1 X. L: A; Q6 H.double value[,...]
) y9 m- X$ G5 a2 I
) }# o7 D9 M3 @  I% EARM的ARM模式和THUMB模式定义:5 N$ q- e/ K; U4 N
.arm|ARM模式
1 i6 |) A# E8 y5 b; a.thumb|thumb模式/ S, q( l; _' q- v4 O/ M4 k9 A1 l
, ~- B; @4 T$ {# ~6 T) N; w
设置架构:
6 X* e3 U6 C" ?. \+ l- R7 D8 e4 c.psx|PlayStation 1(MIPS R3000)
( c0 B% G% x& R& _, ?% S.ps2|PlayStation 2(EmotionEngine)7 g1 `# F: J! p: d
.psp|PlayStation Portable(Allegrex), e6 C7 b0 Q" R! l9 B) k
.n64|Nintendo 64(MIPS R4000)- e3 L* b+ _% ~1 p$ `4 k6 J' ~
.rsp|Nintendo 64(RSP)
& U; f# m2 s, z+ J% j.gba|GameBoy Advance(ARM7,默认是thumb模式)1 V) {0 y! n1 j5 b
.nds|Nintendo DS(ARM9,默认是ARM模式)- o, j9 \4 L8 @; ]
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)& J4 s0 o* j0 |+ e( r& M
.arm.big|  A7 p! p+ J5 G8 }3 W
.arm.little|1 w+ D! h9 Z! A
8 O* F$ |  d! k  ?
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
# Z2 t+ G* t" ]5 Z* G( ~
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|国治模拟精品屋 ( 沪ICP备15012945号-1 )

GMT+8, 2025-11-19 07:13 , Processed in 1.051758 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表