EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2197 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式

) t. o3 i5 L+ S% j& d. i/ P; n9 nARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
* k1 N$ ]6 b6 w$ W* ^  m7 o. A5 w+ c9 `7 s7 J6 O$ S  V
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
% j( R  e% I5 l5 Q) M/ G4 O  r' V
$ i* V5 p7 _) k8 M' z$ m& SKingcom's website:http://aerie.wingdreams.net% v7 ~( Z# T# G- l2 H, G9 j4 @

* y. A3 g2 _% R- l4 b+ D2 zARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
; \9 s; @- E0 j# L; z+ q8 j- A( C" M, v/ P+ y$ N5 D
更新版本可去http://buildbot.orphis.net/armips获得( O0 b  _" `) ~1 S' X

2 Y/ m& ~" `9 R* D6 hARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
+ Y- z; _4 ^- {9 o- q$ `4 u& t6 T4 g! m1 J
ARMIPS命令行用法:; P7 e: v4 Y, f) w& V+ w
  F% C. g: _) m- R0 I6 P% h2 b
Usage: armips [optional parameters] <FILE>% C9 ]) ?; a9 H/ v
+ T: Q# G5 `" p  A% \( q, f
Optional parameters:
8 L7 D- S% x. u/ `9 B5 x -temp <TEMP>         Output temporary assembly data to <TEMP> file# o! x" P2 {- j. `( [9 z. Q9 _
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
. k7 r) V# B) d -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file& q5 w. _, C( ?' M+ B7 k/ P
-root <ROOT>         Use <ROOT> as working directory during execution% v4 L8 A+ i* E: x; _* U
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code& _: `' c$ l3 ?: g" L
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code6 P  @3 @. R) X0 ?) D
-erroronwarning      Treat all warnings like errors
8 h9 x+ v5 j6 ^1 D' o3 J% L9 n+ K" J
File arguments:
2 ], ]3 Y' [4 M0 _+ o <FILE>               Main assembly code file; U1 J. `8 _3 H; Y' D
) F! i6 G% L/ ^
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件3 g4 c! h! i; A
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
8 J2 O* \5 S5 R" n% w% D-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp6 O: S) R: B9 v! N9 F1 c) k4 k
-root <ROOT>参数是指定执行期间要使用的工作目录! f8 Q  _, ^' u' x/ ]
-equ <NAME> <VAL>参数用法不明
5 a5 C+ R0 ^8 X! O6 b9 ^-strequ <NAME> <VAL>参数用法不明8 H6 N3 t: j, z. [; `4 D* c6 t0 a+ U
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
% Z3 c5 y8 T( b) O. \0 D) E. R1 j' O* P$ z  v+ V2 Q9 h
<FILE>是汇编代码文件,可用记事本之类编辑- c7 e1 e5 Q- D5 i0 n9 W

. q* x. p" y" J; \6 P3 o注释说明:
. @- F+ e8 G, w% u7 S. \注释可在单行指令后面“;”和“//”添加
; A. o- f$ Y( l# z; _$ L* Y9 o“/* */”式也接受1 i) u% L1 Y! t4 `# H/ t  R$ b1 W4 A. G

1 `$ y/ h; e8 |9 G& r& y7 R例子:: m, u8 \) f$ t4 q" S, [
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000003 P" u( n* Y: F: r1 G

; T% p; ^% y: O" r3 w.close;/*关闭文件*/
5 H& v9 G( I4 b5 R  k5 `/ I4 d1 R
标签说明:
& K/ w) O% H7 e$ ^, M! H7 L标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。( o% W) g4 K0 I+ D

8 m2 G# i& q8 s/ V) m" \6 k. ^/ w数值说明:( i, _" u1 V0 Z! K- l
“0xA”和“0Ah”是16进制数值
2 l2 i8 Q; S/ I, }* z2 T2 _“0o12”和“12o”是8进制数值
9 a1 r" f% e1 [, r1 d“1010b”和“0b1010”是2进制数值
/ X" H& O" |, o6 l2 n' t; H- u
, `5 ]9 t. M3 v8 f1 Wequ说明:
" a; A$ }0 x9 _2 q格式:text equ value* g0 v: T1 Q( N6 G7 g
说明:用一个text代替value
' w4 H* Q4 d. `; g例子:. p6 ]0 `7 @* c1 i, A2 Q! ~# h
address1 equ 0x12345678
8 E2 F- D0 S1 S& tldr r0,=address1+ G9 n3 \: Y5 @, O+ ^5 j, j% E
.pool
; x  A' o6 s2 X4 t
) {! n+ f: j4 _5 [6 ?" n5 M函数说明:: e' w; S. d- y8 B
6 z0 e: c( n8 X$ U7 ^6 i" O5 _; r4 {$ {
.open函数:
3 u/ G0 L, m" d; V& Q6 H& [格式:/ H4 I1 H( l2 S1 }' i
.open "ROM FileName",offset# ?: k4 F9 N' ?$ i
.open "Old FileName","New FileName",offset
# \/ d3 b) J& M% U: C& Y3 Q0 R说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
! T$ n: N" ~0 l) ^
- D& g6 D; \% D$ T% P. y例子:0 _# k; T" i) \2 i9 [/ K
.open "1234.gba",0x08000000
% U+ H9 J+ a) q0 U, V* M& D* F( A; ^
.close函数和.closefile函数:; w& s- I4 i) j6 u
格式:
" k7 m! z8 V3 R.close4 o" |6 F% X) I" i" t; \- L/ ^
.closefile$ d1 ~' k. f+ J7 |) O, @
说明:关闭文件。
4 ?6 ~9 d7 Y5 \7 I( X1 b* Z$ H$ L- a: G3 W, D% N
.org函数和.orga函数:4 v% l6 L1 n; _$ b0 F# X) u5 d
格式:
- z3 n0 }9 g* J& Q8 {.org RamAddress0 F/ o) u! K7 ~" u
.orga FileAddress3 z3 o- E( @! k* A
说明:1 |" s- q# D& m* e" x: g$ f
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。# _! O5 r9 Y+ P+ S0 ]3 [5 M8 {
1 a1 j+ E* _& p' o' ?5 T; w4 ]
.orga函数可指定ROM文件的输出地址。
/ c0 t; g0 R( C! T2 b# b) D
  B9 b$ t% a2 @.create函数和.createfile函数/ O5 {1 u$ w2 b  X
格式:# R0 d( g1 ?$ t, T% n" F6 e% u
.create "FileName",offset* L: c1 h/ m$ j6 p
.createfile "FileName",offset
& l6 b9 w5 }) c/ h6 @( X8 t/ A. Y1 h说明:创建一个文件,如果文件是存在,他会覆盖掉。# ]; D2 O! e/ C2 V$ d+ n
" }# H% z$ Z# U. B8 X) }4 S
.area函数) ]: X, \2 v1 Y1 n# n# S+ L
格式:
9 N% N0 l3 \9 L$ ?) c1 ~.area SizeEquation[,fill]
  y( }/ I, z* L, Z. e1 o.endarea
: z* M+ C' D& W) G; `. J+ d说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
) Q9 y& e6 J. M/ ~/ w% v5 T4 C0 I3 W* b" n1 p. t/ Z5 t. i
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
. W" t) |* w- y8 ?( }7 \org 0x1003 G- P$ u  B6 W" y4 Q. }" B
.area 0x8! W& ]; A: l7 k+ O0 L2 n8 g
byte 0x5,0x6,0x7,0x8; a; H7 }' b; M1 l4 D
.endarea
, Q. ^4 n6 n  }, k4 e; M
2 O6 j7 V6 E; ^: w, D3 k! Z.align函数
- ~" J- d* E7 F7 |$ ]# A格式:.align num3 ^( ]: e  o+ U9 O: m
说明:写零字节,num为零字节数量,用16进制表示。' z* ]- w: x6 Z) P" k
9 p2 M8 s  v% n6 `9 S. {5 i
.pool函数5 T+ L" m; s; w2 P3 K; S
格式:.pool
% Q' Z. s! K' G; ]  ~: d说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
4 c& l* ^9 e, j- i% x例子:
" G* v3 ?9 r" F; D7 |1 }ldr r0,=0x12345678;
) o) e  t* |/ c....
( d" u$ o+ M  i  N.pool  ?/ `/ g  e  a
+ u9 l2 t0 f, x9 F- x/ v
.fill函数' h- R& F: m$ ], A  t3 d0 \& r
格式:3 j- S# C) L9 y' a: p8 _& |
.fill length[,value]
! ^* }! q; E, z& y' v' a$ _defs length[,value]) I/ v4 X' x  z& ~- _0 ?
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。8 N8 |8 a- F" e& |, n, \' q- }

' g* }, s/ h/ B* F9 y  m& N8 N.skip函数:# M- f4 K: G  k0 y
格式:.skip length1 K0 |; y# ?% Q) K4 P
说明:跳过指定长度单字节数值,length用16进制表示。7 ]& w2 U! k/ T$ s

. }, Z. A9 `* k0 ^9 Q+ q4 v写单字节:- ?! m2 Y. e0 h
.byte value[,...]
- M4 B6 s/ {# d" k.db value[,...]) ~/ @/ l4 P! g- q2 R
.ascii value[,...]
3 ~  l3 J' |+ F# w7 ?( l' l.asciiz value[,...]
5 o" \" W$ W! `6 ^5 y0 m( Tdcb value[,...]
* N. o1 Q+ A5 j5 z7 X" S  Z6 }# v3 s$ i
写双字节:# q" L; |; C  V/ ]. }, Y' I
.halfword value[,...]0 I! W( ~/ ^" A% w# M* J! K, ^
.dh value[,...]; [# E1 D" T% b* V) _( O6 m
dcw value[,...]" u( u8 Q3 f& m% H, h0 s7 a
2 ]1 ~) F" _! G# H/ t
写四字节:
# v; s* d- y. c+ s5 G  Q# q.word value[,...]
* ?- A2 [# h8 l6 {9 O& l+ m.dw value[,...]$ s4 @) x4 p0 L' V
dcd value[,...]
8 n% Z! E! y3 ]( _* J1 p4 q
0 r0 v0 G7 E' p+ ]写doublewords:
# t  m0 S' ?' `  P  O4 W6 u  b.doubleword value[,...]
0 i# O. I, S6 K8 f* [5 [0 h.dd value[,...]
- t+ M1 \3 o' A# o3 u, zdcq value[,...]( K" E1 U/ s9 e! e; y

5 C; v3 ^- J, N) z1 F/ [6 K/ }写浮点数:( H1 ~+ f1 w1 g5 M6 x# y
.float value[,...]4 c: E$ j3 _9 v( }' Q" y0 Z! f2 w
.double value[,...]
' u1 {1 ]- R3 N
' W: T' o$ m5 ?7 ~- C% U0 ]/ ?ARM的ARM模式和THUMB模式定义:
; P! g4 ]6 |2 s* C.arm|ARM模式2 Y& e$ r  D; ?3 ~
.thumb|thumb模式, }4 s2 z9 p/ c
% X( Q, F' E* r  r6 h1 u8 R- y' _
设置架构:% k+ s! G# G5 `# M
.psx|PlayStation 1(MIPS R3000)
7 F/ y" @1 x2 E- _.ps2|PlayStation 2(EmotionEngine)4 Q$ x& [& @9 t' N6 f$ D$ T* S  k9 g5 |
.psp|PlayStation Portable(Allegrex)! S1 ~3 M/ ~, r2 c2 G2 N. q" k
.n64|Nintendo 64(MIPS R4000)* M: M9 m5 i2 ~. e
.rsp|Nintendo 64(RSP)
5 h- b0 F. z; F3 v+ W$ j5 G* ], z.gba|GameBoy Advance(ARM7,默认是thumb模式)
2 A3 w( m- s  n, {) Y2 M.nds|Nintendo DS(ARM9,默认是ARM模式)+ `9 R/ }/ J, l, t/ M9 E5 X
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
* p7 J0 j" I% b0 O/ M.arm.big|0 \& \4 B  A1 \* w' C9 {3 A
.arm.little|
/ M  I5 |6 u& K, v9 S9 k4 o& u9 c& _1 R, f1 Q4 Y/ \! x; N, Z
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。( f+ U2 T6 X4 |( x, j) B1 r
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-20 11:59 , Processed in 1.099609 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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