EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2173 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
# E/ k8 P: e1 e$ d: e' Q3 l/ z
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
) i. n1 X/ {# I7 x$ ^' N7 q& M' e
0 c& s( D+ v2 V/ L( YARMIPS assembler作者是Kingcom,目前发展到0.9版本
* d% Y: [3 G2 Y$ H$ U; V! h2 @: n+ b
Kingcom's website:http://aerie.wingdreams.net
3 r( v' H0 R- m& N' K. G1 P2 B  h2 ~" u3 E3 ^
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
, k) g6 a2 `! \. p& W; ?" y* c+ R, s$ Q: m
更新版本可去http://buildbot.orphis.net/armips获得+ n& d/ z# w! g

, c( e0 k# @7 d, F5 ~2 v/ zARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
, e: F' t/ T5 Z/ Z/ ]  t1 N" W1 _; J4 W, D
ARMIPS命令行用法:6 K$ a4 w" J7 A' J, b

, I# g( W4 G7 T/ r. J, {Usage: armips [optional parameters] <FILE>7 S9 ?  |. x. d8 y' o7 ?

8 C' a+ z$ L2 Y. Q& ^Optional parameters:3 e# W1 n& r1 d1 ?7 g" O) e
-temp <TEMP>         Output temporary assembly data to <TEMP> file( d/ O/ I% a+ s+ l' d6 D
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
% o7 j/ b1 {' J/ h -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
# \5 ]: S& I& o4 _% h$ @. ?' w -root <ROOT>         Use <ROOT> as working directory during execution* @  T: L$ M* y" L& v: a
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code3 d% ]0 [! X8 _# `9 g
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
& V! T1 f9 K. d( o6 u* X -erroronwarning      Treat all warnings like errors
1 B$ g4 A7 h! }! k% j1 F
$ T% T8 s8 c) C$ h. F' u" n% dFile arguments:2 d# H2 H. B' m7 A& e  x! T% v
<FILE>               Main assembly code file
$ |" `" v1 e  p2 i0 t6 l) J# y# B$ w- g- D) v2 k$ f& a1 S- }+ M5 D* f# y
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
* h' `* o7 K* h& Q1 u-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
  z1 N8 o) l( _7 C1 {7 G-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
' u# m7 n8 ?- \4 `- r-root <ROOT>参数是指定执行期间要使用的工作目录! W2 x8 P2 A1 I2 j( X- k6 o
-equ <NAME> <VAL>参数用法不明8 b4 K$ v3 @. h
-strequ <NAME> <VAL>参数用法不明( T" r3 g8 ?) M# ?$ ]& E9 \, w
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
2 q. o% \2 m5 L1 C! D
, D( [1 X, I+ C! P+ |<FILE>是汇编代码文件,可用记事本之类编辑% K' |* ]0 O( H7 p& w7 Z9 a
6 |& ]0 @, x. j+ G! P  ~7 w
注释说明:  r- r  S1 W+ p% f
注释可在单行指令后面“;”和“//”添加" y" d" m0 {" p) r# r- l$ u
“/* */”式也接受
  N+ b( F$ S% [$ i' N4 z2 r0 Q1 `/ m
例子:' p% h1 O& _  B# u
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000. h& A, A. X) d- u$ l/ i
' `. o9 R( l) k) ~9 {
.close;/*关闭文件*/% D, v/ X/ n: Y4 j5 D3 I/ Z$ c

  p* |, t2 h1 t+ t标签说明:
4 E- A* O$ t$ y标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。* K* R  o. J7 |5 J, B
; Z3 W+ V  f3 ^; t5 ?( j: ?
数值说明:  _% ^; {! @* f% o
“0xA”和“0Ah”是16进制数值
5 B" P7 g4 k$ b& X“0o12”和“12o”是8进制数值) w& ~$ z7 P; N' E+ Q# z
“1010b”和“0b1010”是2进制数值
' P  B% h% X: X4 v
- |* p* _4 I: m! H4 b2 v: Cequ说明:
8 W) D; o) x: ]# e6 u6 c格式:text equ value* Z7 h) K, K/ ?" t1 u
说明:用一个text代替value
3 n  F! m3 H; P6 l& ?- M7 x9 [例子:
8 A1 N0 n2 A2 W; i$ Aaddress1 equ 0x12345678
* @/ \! ?) Y# V" y6 gldr r0,=address1; \: m- ]/ {" |& r' p7 f& ?: R
.pool1 T& {0 N& X4 c, W( \5 i

0 L8 w/ R4 R& ?函数说明:6 y$ G! E% E7 k8 k9 R: q# W; G

0 F: v4 k  l: ?  f* I9 V6 t! z.open函数:
9 |' q/ f8 h! f# B, e7 |格式:
8 F  n! L: @5 C; u, S+ p5 U! u.open "ROM FileName",offset
" s6 H% Y- R* Q2 G.open "Old FileName","New FileName",offset1 H! F5 f3 |5 t  B  }0 |
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。  l, e; \2 z7 b9 P5 v

. ?# k+ z9 {3 |5 F例子:5 \" n# M4 b3 ?" b
.open "1234.gba",0x08000000
5 H0 x5 r0 L. D
% M0 {) Z* G) L* U( E.close函数和.closefile函数:
% [1 o5 M: G, s格式:
3 H3 I; x9 r, s4 v1 m- b4 o.close" \; S3 x7 B* O% T
.closefile' i( G" M. V4 i( z' m' [
说明:关闭文件。9 l* n" H1 [2 r" `) `

( f) v' G" ]4 G3 M- |+ Z.org函数和.orga函数:
) D7 v& w' N4 H/ p) F% e" B! b格式:
( c9 A" |- [6 o* {.org RamAddress
# a3 z! u9 l/ G9 M8 A.orga FileAddress
; ?8 W* G, s6 T* W- E9 q0 c说明:( `; P8 x  B; l  s( @
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
: M" M5 a7 y* d' O/ W' X
& I5 _7 b" s! t0 S# _- S- k0 {* ~.orga函数可指定ROM文件的输出地址。; U# ]9 Q7 q: Y1 U9 _4 N3 z. o
5 r0 \. p8 Z8 m6 J
.create函数和.createfile函数
7 Z5 l( b4 T, y+ M. U  ?格式:
: `" v( [. [0 }.create "FileName",offset  F( h' c- ^: D$ ]# o6 V7 h* `
.createfile "FileName",offset
$ J& X" H7 k0 Q: e& M5 ?说明:创建一个文件,如果文件是存在,他会覆盖掉。
  B5 q/ l2 O$ \& z8 `; w& ~' ?  C
1 j; w6 s/ k6 ]  H! T.area函数
2 A) }3 f1 r" [5 J7 s  W, q! v格式:
9 W- q0 ]" Q) E3 F: _8 z8 t.area SizeEquation[,fill]- l9 p7 n" r% p5 O/ `9 z1 A
.endarea
* v, m$ H1 w5 d' a3 n说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败8 l) v' o9 P0 J) \6 @+ D4 ]( p$ y5 P

$ \& |+ r& K; Y8 S8 a2 c2 g6 M例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据- Q$ t1 H; O; |! F: l( s) D5 d* _
org 0x100, {7 f  k8 \9 |, j& ^, d9 A0 `. o
.area 0x8: U% G* J' S2 \- w8 E3 Y+ p9 G
byte 0x5,0x6,0x7,0x89 ?7 x9 _8 ~% K8 s7 y! a& i& Q
.endarea
" G4 M/ O- |! o
) I7 C1 |0 Z. Y$ g.align函数- B( z: j% Z( s# H$ x
格式:.align num, a% i& X" E7 ?: {: ~! }6 L! k6 z" D/ s8 g
说明:写零字节,num为零字节数量,用16进制表示。
' I: }" q& l- ?9 a$ V& G7 c& {5 d& `" ]- E8 S9 J' Z
.pool函数  o! P+ i6 H2 X, ]+ Q/ m
格式:.pool/ d& j( e( }( c; X( o/ J3 @
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。0 [6 y) u5 ?- U* Y  |& P  j7 o
例子:
0 _6 w1 z6 u' oldr r0,=0x12345678;; W+ Y  q6 B! k) ]( |; {6 B
....
0 o, s; A* F! T+ `7 g.pool9 Z, o9 X  H3 l2 d; R" D* |4 n" _/ M& M

2 H: q6 m1 ^$ g9 ^" Y+ y.fill函数
3 A( |1 U' \8 Y格式:/ A- c5 @- J  J
.fill length[,value]( h  {% T3 b8 a& T# M+ G
defs length[,value]; d: Q1 D0 z# a- q
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
9 }! Y! W6 z+ V2 k( M5 c3 z/ Z# _% B: i4 k
.skip函数:
. W0 k8 z& K# X( s4 S格式:.skip length
4 `/ C2 c! N' e说明:跳过指定长度单字节数值,length用16进制表示。, K$ ]: T" E" x0 L% G
' E5 y; G$ K# `9 X! |/ ~* D3 L; K
写单字节:  n7 d' D* x/ l
.byte value[,...]% Q; K4 N+ q" L( |) ?, Q! N; A
.db value[,...]' e; w* c% A# V7 `
.ascii value[,...]
( Q7 G+ F4 D' W3 Y" O.asciiz value[,...]
1 v5 m, n7 N) t% l; H1 d: Kdcb value[,...]3 D, R0 K7 P. z6 k+ q
) x" T$ {% w8 d/ M
写双字节:
" O' Z" M1 J$ b# y9 m9 Z" P4 f5 @.halfword value[,...]
+ I' P3 y$ D& J3 \4 \0 u  s8 W.dh value[,...]
4 I- D; d6 _! Qdcw value[,...]. l; j; o% Y% I+ O8 y6 M
: z8 _6 z  N3 ]( m
写四字节:
% \" U) z6 c5 m- W.word value[,...]
, X; P* P( c. E+ c0 _7 s! O& L.dw value[,...]7 _7 h8 n  Y  x5 k' C# X
dcd value[,...]5 w$ X- R# T, S, R8 Z: {
8 n% T8 e3 S  S! X/ M! I
写doublewords:
0 V% g- {8 g$ |.doubleword value[,...]
! ?9 L  [$ c6 |7 Y1 }3 U.dd value[,...]7 ~4 a! X7 d" O* p
dcq value[,...]
: q/ J+ E6 p' Y8 F" g, s6 b1 V
' v2 L+ i) v5 I$ _4 y8 |' l7 \6 p4 M写浮点数:3 X/ t& l1 R, h% B
.float value[,...]7 X) K2 o# a6 ?5 Q
.double value[,...]* L  V. c! r& l+ M' X' c5 T, V7 E8 @

3 X, z/ L% X3 E" h- zARM的ARM模式和THUMB模式定义:
0 c0 _6 {3 x) Z/ D.arm|ARM模式
$ K3 E7 |5 d5 n0 [$ Q5 _2 Q5 ?.thumb|thumb模式  n1 U8 K: k. S& A5 R
* H- a6 g, L6 B/ L: G5 u$ k$ X8 q
设置架构:7 S2 @, l. a; a% |# f2 ?3 H9 V
.psx|PlayStation 1(MIPS R3000); n% L* A6 ^8 Q4 ?7 p
.ps2|PlayStation 2(EmotionEngine)
5 P8 s' D1 D% y8 T( I.psp|PlayStation Portable(Allegrex)6 z2 a5 P* j5 J2 C
.n64|Nintendo 64(MIPS R4000)8 Q; K& V8 p6 o7 z7 Z# t" n0 _
.rsp|Nintendo 64(RSP), \+ Y( i( ~; G- g0 W
.gba|GameBoy Advance(ARM7,默认是thumb模式)  c3 S# [% g. C& y" L
.nds|Nintendo DS(ARM9,默认是ARM模式)* C1 g& Z; r2 D6 |- W& ~6 {- b
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)" c5 S0 c: O. g4 Z# \6 X" s% K) f
.arm.big|1 I& z! Q. W/ S1 t7 d; o
.arm.little|$ G  w( s6 X' e0 s$ y

% x9 r( F" n* _! n1 J) H$ c常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。; M* w1 ^% t. y( T, l  F7 l
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-28 00:03 , Processed in 1.062500 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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