EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2175 天

[LV.Master]伴坛终老

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

" y" z5 L% m' z5 Q, u) t# cARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40005 F* R3 W1 u7 w& x: T
7 h3 A, p" i& A9 D0 t6 T
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
$ n' p9 x) o( R  O
- A4 F- [4 Y* X# AKingcom's website:http://aerie.wingdreams.net/ j7 Y- x2 N5 _4 {; C
3 O& z! D2 m8 A2 W- d
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
. x) z: N* g3 g( J" v% F4 X: R( Q
0 B( _( J6 e$ Q7 s更新版本可去http://buildbot.orphis.net/armips获得
6 U+ I$ H% |' o; T5 U6 P, [7 O  o# @+ H. s/ ^1 t
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
1 \! B4 C7 G2 G" y: t) K
. }0 k7 r$ S+ Z( l2 W! OARMIPS命令行用法:
7 M2 D' L; M! }2 _5 ]4 Z3 }' C( a
8 h' k/ ^5 ~) z- oUsage: armips [optional parameters] <FILE>* h+ }4 i: v3 Z- g9 d2 P, Y
0 b# m# G0 J: |0 R; o7 l
Optional parameters:
# ]' u$ Q; |! A% A5 z0 B+ v -temp <TEMP>         Output temporary assembly data to <TEMP> file8 [! [* R8 F" w6 R; A
-sym  <SYM>          Output symbol data in the sym format to <SYM> file9 X+ n; H5 S7 y! c7 i7 B: o; K
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file) }2 R3 L- n% Q
-root <ROOT>         Use <ROOT> as working directory during execution
0 D& Q# j2 H/ u5 I5 ^2 m* o( G -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
& i! \7 s& w% ^# h3 Q -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
/ B% B" O5 ~  p6 C7 ?1 S0 G$ R) A -erroronwarning      Treat all warnings like errors% n+ C4 w( e+ D" i

' a( f! h" ?% o+ L! x# w9 qFile arguments:
& e6 ~3 {/ e5 k# o6 u <FILE>               Main assembly code file
8 P  [0 \- s+ @. F! `6 j  I
3 @1 L/ H" }; e1 @* B: o-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
2 I) X" L6 v' E0 n-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
& h) V& J# J* d* f+ |-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp; {. Q( y+ h" Y: _2 c( j, e
-root <ROOT>参数是指定执行期间要使用的工作目录
; e! G: U) o4 B. L-equ <NAME> <VAL>参数用法不明' r( ?/ z" I( u) A; R' G
-strequ <NAME> <VAL>参数用法不明3 E1 }# `8 o0 j" ~9 z; {3 U$ ?
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译7 f* H# N. o$ i. ]# ]
" Y6 y: c% B7 `6 C
<FILE>是汇编代码文件,可用记事本之类编辑7 b/ K  X) E: o  ~* D

! P3 b& u* A  e3 R9 ~注释说明:
& B2 O6 E* ~' c* z( s3 v0 _* a: b注释可在单行指令后面“;”和“//”添加
% p0 r6 F& i9 o1 d1 O$ S“/* */”式也接受5 S- ~- w( M+ E& {5 w

' n. B0 Q8 j+ Q& \例子:
7 a5 L" R, @$ l7 I% _' K.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000( W' `) v: W" _+ x8 G- S

7 J  E3 Y$ m5 Q6 q/ j.close;/*关闭文件*/
2 E- f2 \( _7 W% a+ l# B% X: a9 f" t" K5 o2 v6 k% O. H
标签说明:' A: w$ k. ~& `& Q
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
+ }7 b% H5 }% L
4 W  u0 B+ r4 ?/ p5 v数值说明:. |& D2 J" ^- I) L4 `% o9 X
“0xA”和“0Ah”是16进制数值
7 p9 j. E- A" t; c7 K( G“0o12”和“12o”是8进制数值
! X! c: ?# n2 |- m8 j$ p* D6 U& ]7 ^“1010b”和“0b1010”是2进制数值
& W& O2 g3 L/ n- p  z2 b, A
0 {1 g1 J) }9 K0 Q' Oequ说明:; X* F1 T0 g' n- m# @7 _5 K' Q
格式:text equ value. k% y+ b( f+ e5 J& U& r
说明:用一个text代替value
$ i* h! }/ Y9 h3 p( h4 K: U: A! V例子:& o0 @; w! N# H7 K$ k! P4 H
address1 equ 0x12345678# `* q$ L5 i. j) R- o5 q  z
ldr r0,=address1
& A5 ]' T4 }3 h; Q8 W8 l.pool
6 y% `; W& S% V2 D0 z; a0 @- M5 _: [+ `" `6 ~' J
函数说明:
' A: R8 \6 H* {6 g& Z" ^" \
  D- B3 r7 I6 W! P+ A! r& u6 O$ C.open函数:
- F* X, h* ^4 U3 ?* ~4 l3 w* |格式:
0 s' \! Y! ^+ Q/ e* G.open "ROM FileName",offset, t/ _/ y3 w- W1 e" G8 J
.open "Old FileName","New FileName",offset
$ {& {9 e  N1 i& S, @5 Y说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
4 ?" f9 L0 J! T7 {* Y
4 a9 C  j5 w: h* \; s( y1 K例子:
5 U& k( G1 p$ j. J: K8 A! z5 O.open "1234.gba",0x08000000
+ s) B# \% j* w3 q+ ^
, h; c, B+ H% Y: {.close函数和.closefile函数:7 e% z8 ~1 ^/ q/ n
格式:6 ?/ D2 Q# I% O+ f% J9 y
.close# K0 P# b; Q) [9 u8 C- z! C
.closefile
- i% D3 f  n! ^$ k) T& ^4 |, t说明:关闭文件。
: _0 ^, P, T) v3 q! I) D  t; X
" H, o9 ?, N. b7 u.org函数和.orga函数:! V8 v$ Z* e( ^! }- M/ G# j
格式:2 Z# [  y  f" `2 L, E) x4 p
.org RamAddress
' i' v* b/ `1 R6 q/ `# K: b5 [; W.orga FileAddress: X& _# e6 i- n) ^! {* w2 o
说明:6 V6 V0 c) \8 e/ w9 O5 I
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。  o% e2 y3 K3 D+ I6 u8 _0 I( B1 U

" f2 R0 ?* t8 s( |3 z3 b% q, X.orga函数可指定ROM文件的输出地址。1 `2 A+ k  U: z: k) Q' ~* M
% M# H  r  Q4 g, b
.create函数和.createfile函数" h: ~6 |  ?8 r- |
格式:0 d2 ~1 S, \1 {2 Q
.create "FileName",offset4 s# s8 v' O, `, f' i
.createfile "FileName",offset1 {: w& u. n3 p5 L3 I3 G
说明:创建一个文件,如果文件是存在,他会覆盖掉。
, [1 @  R# r& T) y! }/ f4 k
" X/ K& d! e; ^, K.area函数& s( N8 R0 L+ F9 R9 U; l. U# {
格式:$ e! c" l+ S- r1 z
.area SizeEquation[,fill]
& b. t+ }& ^; j.endarea* a/ f' s- `+ j' w4 r4 u% E
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败/ y+ z* }) C% W% H7 G% I$ \
1 X& v# ?, F- V  E: J$ V
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
: f9 f0 ^, Y- R& ?0 ~' J7 ^org 0x100
* H' k6 v- u; T  p1 H& x4 b.area 0x8
' b: b  K. D  I0 y) K% H$ Mbyte 0x5,0x6,0x7,0x8
' M% q' h& Y( W: y2 s.endarea" K' e$ w/ I* I" o4 l+ D

+ `* U: O7 v& J8 i. s.align函数
- Y: X# p& H$ F) r: `格式:.align num( Y" W8 w- _7 ^/ I% g+ R
说明:写零字节,num为零字节数量,用16进制表示。
, a& z4 G0 R( y* K' R" I
  c0 m# b. S1 I.pool函数( O0 x5 y& h. _4 o
格式:.pool" `' Z' F0 k6 L, |. q$ N: y$ v
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
5 M7 f$ x( H6 G+ m7 _例子:3 _* d) I0 C/ M9 p
ldr r0,=0x12345678;
9 [1 N: ^* A! j" T+ e....
7 L. C4 C( a0 z1 i& |7 y) B1 ~.pool
* G  x: l& H' }* R- Y' F" J" U" G6 M* f
.fill函数
1 I! D: F( g# Y: i格式:8 r( R1 d6 H* ?- W" J1 y
.fill length[,value]. W2 t0 b( }/ D8 ~! l
defs length[,value]
) U% y) f) [& ^$ s说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
$ K5 [! |$ D% d" T5 @4 b) x0 l3 e1 i
.skip函数:
! a# B+ J  \/ Z6 D1 O( X格式:.skip length
2 `2 v2 F: W1 L' w$ _2 _8 }1 F$ o说明:跳过指定长度单字节数值,length用16进制表示。( y$ {5 b9 u, n' ^) ^) F7 E& W

) h  w2 S% K3 y3 I4 @. s2 p写单字节:
5 g% s* i* P7 V/ E.byte value[,...]) c+ ?: A5 I, ^3 g' \' K& u
.db value[,...], ^- g6 u. @& G5 N) M' Q! U
.ascii value[,...]
' D" k+ C) \2 @2 Z' `1 d4 x.asciiz value[,...]
7 z3 d& e9 u1 q" [) J& g- |$ A# pdcb value[,...]! T7 n! L' O2 h7 x1 n' l

# m" ^7 J. w7 L$ u3 z写双字节:
6 f" w& Q8 G" G6 K.halfword value[,...]  W! [& E/ ]' y% \4 N
.dh value[,...]; @# c3 @% O4 x
dcw value[,...]
( Q  x% J% y0 i5 E2 e- M
- v7 H' ~& @+ Q8 h) h: E写四字节:) _6 E* \8 j  s6 I3 N! G
.word value[,...]- ]& m2 _3 Q/ w+ B; v
.dw value[,...]
1 p) W( C+ I, Cdcd value[,...]
: C7 g7 s0 F7 s7 c: d% ~( q, g
( t# H2 Q# m) ^写doublewords:6 A0 i2 V& E5 @9 v$ k  x5 F4 D
.doubleword value[,...]- y) m$ s' b" l* ]# F
.dd value[,...]( H, O* _5 d3 C! U
dcq value[,...]7 w0 V2 g% \' n( u

9 p8 t# i0 `- [写浮点数:6 G# ]. Q! e* }2 `- S% w  @+ J; {
.float value[,...]
4 N) X% N& m! m  d5 p.double value[,...]
, B+ w4 S! q/ y# B: p% z% V  ~
6 Y0 ~$ q# t# N- i2 V# `ARM的ARM模式和THUMB模式定义:1 ~) r7 e0 i, E& f) B& b# R: K
.arm|ARM模式
; F2 I' {& ?8 _, O/ k; a.thumb|thumb模式  w! E, C4 [; n: G
4 P% d' B% L: c: T4 y8 v
设置架构:9 ]2 X. t! C3 ]! g0 d
.psx|PlayStation 1(MIPS R3000)
! M& J; d& @) j6 E/ G.ps2|PlayStation 2(EmotionEngine)
6 S! x$ O% {$ z9 e2 ~/ o. D.psp|PlayStation Portable(Allegrex)6 H9 |+ _# ]) A! h& X1 x8 z
.n64|Nintendo 64(MIPS R4000)4 j' V& ~/ I. t; Z7 r
.rsp|Nintendo 64(RSP)5 v, l9 G: E8 v5 U8 g  i$ r/ F
.gba|GameBoy Advance(ARM7,默认是thumb模式)
2 i$ E1 i- N- c6 e- g- e  }.nds|Nintendo DS(ARM9,默认是ARM模式)
! m" j, J- u" C+ R0 N; b0 k* [0 t. J.3ds|Nintendo 3DS(ARM11,默认是ARM模式)7 g, L+ Y+ r% h* t4 W, D
.arm.big|
  s& s. M4 k4 J2 X. Y.arm.little|/ I  r; n  m7 P3 {; e

5 S+ Z  c% J2 S" ]! j! `2 w常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。% C, R5 V  k. g9 A+ j
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-29 17:06 , Processed in 1.083984 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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