EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2192 天

[LV.Master]伴坛终老

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

+ _; w, z- P+ \  Z' HARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
+ i. ~! Q$ }, R' c& |& Q( i* h+ P& Y; U" h
ARMIPS assembler作者是Kingcom,目前发展到0.9版本$ G3 B/ O7 c9 z
# M( L) w6 C# M. E
Kingcom's website:http://aerie.wingdreams.net
& r7 E' i# B* G0 W* j, h6 ]; g" }- }# x9 W. G# E& U0 h
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得! L' c  |0 g  K3 V
: }. ]( H# q! k4 S7 H  k
更新版本可去http://buildbot.orphis.net/armips获得
8 f2 N5 r0 M8 R/ f3 g9 g' q" C) S* u
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
0 G, l- O& Q- G+ L/ h- e0 o
# u7 x: Q2 t  y' O  QARMIPS命令行用法:1 [: Z* L5 g7 o1 h# a! K

$ }9 h* s) R7 ]( N( U# q& qUsage: armips [optional parameters] <FILE>( _) [+ }/ |5 M- ?  Z

' G. s. J5 u9 ^$ t  H9 f* wOptional parameters:2 Y, \5 B. r3 G, L
-temp <TEMP>         Output temporary assembly data to <TEMP> file9 c3 j" K  g* ~6 c
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
9 M5 r, q8 z3 T  n) I -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
; w) j, z- |8 c+ t: G. I2 _ -root <ROOT>         Use <ROOT> as working directory during execution
$ O% h& H: l' e -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code9 i5 s. i/ m& i2 s( {( p
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
) O$ S( g" v; y2 s& ? -erroronwarning      Treat all warnings like errors
8 {4 }. C5 d2 c/ m2 G
5 D5 M9 y1 x8 h  _$ ?File arguments:
9 j% D& Z  E1 Q6 B3 S9 Q <FILE>               Main assembly code file1 c5 w/ l1 `1 S; N3 }, |- l9 z
& R' s$ @+ N2 k% u2 k
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
4 A+ z3 e/ Q3 `: S$ K% a-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba* {/ f- Y) w4 ^+ ?; \/ f8 O  p; V
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
5 x: P& z' Z+ [0 ~2 R+ \-root <ROOT>参数是指定执行期间要使用的工作目录
* l: A) H% \, `5 N1 M' I& r0 _-equ <NAME> <VAL>参数用法不明
. a% E# L! [* a1 b7 k. f) X-strequ <NAME> <VAL>参数用法不明
& W; G+ P: e! A/ t. r" k7 g-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
1 f0 o$ x. q' e2 S, s7 C
" U$ d) h* R& x/ S! [) s<FILE>是汇编代码文件,可用记事本之类编辑
4 \3 U$ P$ M  a; Y' V0 b
+ Z3 p) p5 r. q( h( P注释说明:
/ d8 F* @7 {( o5 R( c$ z' `注释可在单行指令后面“;”和“//”添加
7 X$ Q8 U  V: h$ u1 X“/* */”式也接受5 `4 c. B% ]$ r$ O: S- p
5 b  i2 E7 {  _
例子:) E8 p6 O8 [" j. m
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
' J! M1 n# ]. H% W3 R
) w1 M/ N- j, ^6 O. M$ e.close;/*关闭文件*/
5 ?3 T$ g; d8 \4 M0 U6 ^. q. Y0 V! g6 q; @; U/ k; {
标签说明:
/ b) z0 N( [& a标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
) d/ D- H. [# r( E9 C8 [
8 O8 V! N5 O. L1 I% T数值说明:
+ i: M8 L# q1 g8 F# f7 [“0xA”和“0Ah”是16进制数值* @; @; T" R# z/ o6 y# }
“0o12”和“12o”是8进制数值$ E# |( j2 y: V8 O& G: {, ?2 F
“1010b”和“0b1010”是2进制数值
& w! e$ W$ f# Z1 E6 O& i  c
/ z  B: X4 }* C% f: A( {! }# _equ说明:
' i8 A8 o8 k8 n9 f4 C! T. ?格式:text equ value$ V' [6 R4 ^: x; T- R! U
说明:用一个text代替value: H( F8 I4 v5 A  E7 o4 B; w
例子:
# S6 h4 n7 K* ~  g" `address1 equ 0x12345678
& @1 [& J" s+ I0 S) N1 wldr r0,=address1
4 [# u# C# y) X( e# ~.pool* X. u: }% d# z  t1 h
+ x: v7 `' W: Q
函数说明:( n3 R) i7 f+ \  ^3 {$ K! K* v
6 z: }9 |+ w) h' J" _7 m
.open函数:
! C2 B5 M/ t3 n3 i. F8 Z格式:$ t: w1 U( S) I; J/ W- M7 C! t  ]
.open "ROM FileName",offset
7 D  c# n/ u9 }0 o8 N& A.open "Old FileName","New FileName",offset7 t3 H; \3 n7 a# N
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。+ x0 a" O" d  w0 y9 Q
6 ^% I- ]! N  e5 Q, m' Q$ _+ J
例子:
9 |$ {' c* L/ s! ^.open "1234.gba",0x080000005 V4 D& T+ f+ B# m6 ^$ R7 w
) s+ J  g/ {* s* }
.close函数和.closefile函数:/ p4 P. K8 D5 Z% R  o* ~
格式:' H! K& w  j' T5 E# _
.close* O& z7 g# R; y5 n7 ~5 q' i
.closefile/ @% ^, B  _1 k: x
说明:关闭文件。
+ b; G0 b1 \: Z! o. |$ D5 J0 V/ C7 e  M
.org函数和.orga函数:
( x: h+ \7 e. J$ @格式:
! m! a& E4 ?% l.org RamAddress
: e/ e6 N7 o4 P) x" ]; R: o.orga FileAddress
& O8 G! J1 d# H. t0 T% T说明:
3 U( _: g* F" s- {% R; K前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
  h" Z6 K. L) Q$ h. v8 Q7 ?: a, w9 o- f9 `2 n' Y  M! z) Z% R
.orga函数可指定ROM文件的输出地址。/ [. \, k3 v( j" C4 R6 l
1 _1 _1 j2 P7 Q( b4 A# W9 q4 @0 q3 }, t
.create函数和.createfile函数
7 G2 A- l$ L7 C4 y  p) `格式:0 L7 Q& }9 M, H. D0 [. h) U
.create "FileName",offset
6 D* `5 m1 p8 R- u: c3 N4 x' U$ }.createfile "FileName",offset
4 ~' \6 p5 G# Y2 w3 x2 N  [说明:创建一个文件,如果文件是存在,他会覆盖掉。; V- n, O0 S+ V: D
  A6 E- p5 M' u$ H+ f
.area函数* n* b  h: U$ b2 Z' g
格式:7 j6 |9 @- k2 @) J' Q
.area SizeEquation[,fill]
( J1 l8 E+ b0 w, s: R" t, @.endarea
. [/ h1 d$ x* S2 w; V说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
, P- `! t" o) ]! m  d4 b& O' \3 x( t& p
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
3 a! X* k/ ]1 B3 w& p6 M; forg 0x100- o% K7 S% f* M
.area 0x88 o4 R' H3 e2 l: O1 X! t: w/ H% b
byte 0x5,0x6,0x7,0x8
1 {  F+ O3 P5 X+ Q' n/ T.endarea
& z: o/ K5 p& ]5 j. i$ g- Z5 w0 ~% t. j. V: C/ q6 |! H
.align函数
; T8 O& q3 c# k3 Y3 E. w格式:.align num( I$ s1 A1 ^$ I, R2 O5 ]% ]
说明:写零字节,num为零字节数量,用16进制表示。. O1 \6 b0 `" i: Z6 U

  @' l% t$ `% M; M! H.pool函数+ _5 ~4 o# Z) w6 v. k0 n- o
格式:.pool
( k0 ]0 D1 }9 q) X* E' h5 R说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
/ f; }; @% A9 D5 u+ V# v* m例子:
+ h0 t+ k% k; ]) fldr r0,=0x12345678;+ d! \5 M8 n2 H: J" w; g
....* J' A6 _( [) m
.pool
. |& r. H$ x/ f6 l0 K% `& P) x! A0 t+ h+ _
.fill函数
; x3 B8 v$ W' t$ n( k格式:
2 V! q6 F2 D6 I* p! Y4 n& A( g.fill length[,value]
' Z) N$ i6 }1 ndefs length[,value]
% X$ o/ P* I: I& W& Q, ?/ g4 B说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
4 t& p# C+ c$ X: K& P3 B- L4 K
. ]+ p9 P, p5 g1 m- T$ d.skip函数:
- Q; x9 G7 h+ ~; _, N格式:.skip length$ Q9 W# a1 Z+ P. q
说明:跳过指定长度单字节数值,length用16进制表示。
/ r7 f, g- i( \! K7 h' T3 {$ x- n# a* I9 \1 Y( L: L) B+ \9 G
写单字节:
6 h% a3 q- M: N! v3 M/ [.byte value[,...]/ o1 p6 W' S# a
.db value[,...]
! {$ j$ x0 F* `8 t7 T* z% S# {.ascii value[,...]" V1 \# b8 t2 c6 M5 X1 }
.asciiz value[,...]$ P+ d& h% y9 I) L. e( L
dcb value[,...]
2 a0 e1 o2 ?8 E! u5 m  u7 k, @
8 O% @/ J" j1 z* Q0 J; f: Q" N写双字节:
% t+ G& W) p! n, E+ x* B' |8 a8 B.halfword value[,...], ~$ ^& G/ p0 \* r2 j% e# r
.dh value[,...]4 ~2 M. J: V9 `3 V; y. K2 W
dcw value[,...]
6 k4 w+ D8 }3 r( N: T& ]3 J0 {0 z2 v# H6 l
写四字节:0 ], }; H7 L' @1 p5 Q
.word value[,...]' O) Q7 _( W7 q, w3 c" X
.dw value[,...]
& V# l  V2 q+ Q" n0 q& K/ Cdcd value[,...]
! Z. f8 H4 T5 \. ]! V# f
$ d( s* T  w: d1 [9 Z2 Y5 K写doublewords:& z; C: v, Z9 o# o% O3 P8 O4 G( f
.doubleword value[,...]$ Q2 _/ q! m% Z4 O
.dd value[,...]" U/ F# b, f9 R
dcq value[,...]
0 y  T" F. t' [0 }: Y, c- R; e+ R+ E0 n
写浮点数:
2 ?& U& A0 C- L3 G7 r.float value[,...]* L5 C9 d9 s! N- O
.double value[,...]
" z3 v: a/ k5 T  m- {! }1 E
, [  X9 p2 F3 [# m) N4 F! G' qARM的ARM模式和THUMB模式定义:
8 O1 K5 Z' q  Q# e7 q4 d' O.arm|ARM模式8 t: o/ J5 n6 w8 J8 X; h
.thumb|thumb模式" `8 i' y" c  ^) @6 T4 D

" u8 n* m) o7 H4 j- K设置架构:
" U! L8 o! ^$ ^  _- T9 e& D.psx|PlayStation 1(MIPS R3000)
  p% ~, j  N9 {4 y, Z.ps2|PlayStation 2(EmotionEngine)
0 x9 Z- r5 U7 r) z) n.psp|PlayStation Portable(Allegrex)# ^0 E$ C% h! k
.n64|Nintendo 64(MIPS R4000)
" g# u4 @) v" A3 Z.rsp|Nintendo 64(RSP)# {& i* h* {  d& ]. ?+ }* l
.gba|GameBoy Advance(ARM7,默认是thumb模式)
* Q2 f5 o  @& B$ U6 b.nds|Nintendo DS(ARM9,默认是ARM模式)1 y' W/ L0 P% b0 _7 ~
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
8 v$ H0 Q" d$ t5 T.arm.big|% }  s' ?4 @. q
.arm.little|
( S' @8 Q! C$ m  q8 }$ W' n: Y+ A$ a! }1 X9 R7 n; ~- \
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
+ j" a7 n! S, F6 {
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-15 09:07 , Processed in 1.089843 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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