EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2156 天

[LV.Master]伴坛终老

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

% e+ v* }" H& q* Y9 v, _! cARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
2 Z" J1 }5 |7 r' I
% K7 a& k$ z$ w; QARMIPS assembler作者是Kingcom,目前发展到0.9版本
3 x$ a1 e9 B) Z, D1 \; ~2 W! Y( n& a* \/ J
Kingcom's website:http://aerie.wingdreams.net
, m' Q0 X' ~" S$ B/ \+ x1 e$ m& f- B3 V, l4 B/ O
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得" M) H; G8 H( T! k0 ~) Q1 {
- [+ Z% G- p9 c' s% d0 ^# J
更新版本可去http://buildbot.orphis.net/armips获得* R8 z# P) \3 R
# T# C4 q8 R+ m4 p+ g- v5 J
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
5 p$ y1 ^8 G+ O6 t  T) W/ I5 O8 |2 ^; \; P, q: }1 C* L* @9 K- P! |
ARMIPS命令行用法:
( f  w5 i% I2 G' l; `; w& s) N2 N: G/ |2 q& U
Usage: armips [optional parameters] <FILE>- j3 I' M& h; V% L& ^8 K3 c
: Z( K- ^5 A% Q1 M
Optional parameters:
1 q$ Q! f7 I, v* b$ U; s1 v4 w4 n -temp <TEMP>         Output temporary assembly data to <TEMP> file  e! ?! q3 X& u8 d
-sym  <SYM>          Output symbol data in the sym format to <SYM> file$ j+ U% d: J6 r& H
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
; N7 X+ T( }& [& g3 ?! W -root <ROOT>         Use <ROOT> as working directory during execution
# B' K# _$ U( X# ~! M -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code+ G( \: f2 h/ W4 N. T
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
; f+ _+ V' F/ t7 T( f7 P+ ` -erroronwarning      Treat all warnings like errors
) K# h( n% s" K: d( d2 @+ p* a  V+ T6 j3 R, r5 m, e
File arguments:/ J! |1 ~4 }2 w% k
<FILE>               Main assembly code file  T/ [$ ]/ o4 A4 L

9 ]& u  R: g0 |7 p-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
3 d9 Q( f7 |3 G( V/ N-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba. [# ]; ?+ q& C
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
9 x  R" v6 f# M. N& l4 U+ A  V-root <ROOT>参数是指定执行期间要使用的工作目录6 D: }  }7 c% O8 Y5 |5 D+ Y8 q
-equ <NAME> <VAL>参数用法不明
8 _0 h2 k# T- D2 G$ v) F' L-strequ <NAME> <VAL>参数用法不明
& w2 W' }; w) Q-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
! H$ q5 B7 x  _$ `: G, y: \+ D+ L1 t# w  n
<FILE>是汇编代码文件,可用记事本之类编辑* u7 x) \/ V5 C

* }4 o2 m! G* D9 Z1 M1 W  V, n注释说明:) q9 q) ]- V( ]# _+ i# h
注释可在单行指令后面“;”和“//”添加' z, [; P2 e1 ^: X2 z
“/* */”式也接受
. Y" r% b9 Q" _6 S, }, z, ?; c
8 M( x3 B, Z% K+ ^! o$ P6 p例子:
  v+ e0 n& N) T: ?.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
9 a( N0 e8 i6 o$ V/ p) z( I( N" R# }/ e9 G  Z9 F. o$ g
.close;/*关闭文件*/
4 P/ F! B* ^: a' O$ ^+ {% v" B! {3 A9 ]3 i
标签说明:6 M$ }4 s- i( A9 o. q0 U
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。+ N) _* z8 Q6 j8 T: J& j- V
$ \/ `* o  E" Q) }$ h( t
数值说明:9 K5 A7 x/ y4 j+ I+ M& h7 O1 [
“0xA”和“0Ah”是16进制数值6 H. L' E/ u$ x
“0o12”和“12o”是8进制数值& o" h! ^+ U( Y( t6 L, ]  E9 z3 ?) d
“1010b”和“0b1010”是2进制数值
6 O4 M& B, P) j5 x; g/ Z" @
3 k5 q4 y: S0 pequ说明:
: r2 j; Z( {% j- a9 C) @0 h格式:text equ value
# l6 Q/ U& h2 z说明:用一个text代替value" ?( B9 R3 O; `. m! x
例子:
1 O( M, D2 ^8 J8 h6 Aaddress1 equ 0x12345678
& o9 l; F/ }+ q' V+ g. }ldr r0,=address1
: r' J, d& O1 I% C$ @( J5 ~.pool
; L# W& A( l& U' Z: G+ Q8 d/ z% p3 L' N  Y7 j, ?% d
函数说明:
3 A3 }1 M& ^" D/ o$ {, m2 z; U8 D6 z+ N: z" I( j( o$ T) `
.open函数:* G, j5 O: t/ y) R; U) b/ n+ w: J
格式:
+ \0 k2 Y' m9 o9 Y.open "ROM FileName",offset& [8 r9 J0 A( P
.open "Old FileName","New FileName",offset( S" Z8 Z7 T7 ^# \/ n
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
2 f# G8 r9 F3 {
3 O! |) `0 ^2 g. ]6 a5 Z$ j例子:
! R% h7 V* Y8 M.open "1234.gba",0x08000000
; w5 Z. b! u3 J# X3 b. y$ ~  }& X' d, M2 e- T: E
.close函数和.closefile函数:
: L  x, F: v0 D* h% @& b格式:
+ G1 r' Q9 d# F  A1 I1 f.close
+ a: f7 }6 d( N( c( L.closefile3 _- v" O$ W. {6 u. S1 Z
说明:关闭文件。+ [+ Q6 z3 A4 C6 q9 @% n5 R
: ^& Y) m0 r! S# W+ _% h
.org函数和.orga函数:
( A0 Y8 w2 k5 [+ X! m: E2 x6 ^格式:
. M/ I2 }0 p3 Z. l6 N2 U* b9 B.org RamAddress
( M6 N- d* i) N/ g: ].orga FileAddress" B4 v5 u! c! B+ i; [# z
说明:
5 k4 @7 {% x* ~8 S- @5 g5 _前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。) |) x  ]) l5 U. p- f# a

6 ^" ^2 |& \9 g.orga函数可指定ROM文件的输出地址。  S% O% j, f  D1 p

: |; [. B2 c* F6 R, s.create函数和.createfile函数
  h, q; O: p. K格式:
9 g' v( e; }4 m7 ?0 f; a% ~.create "FileName",offset
3 Q" P5 _* g% h: Z$ ^) p.createfile "FileName",offset
% R* W7 C% Y3 }# J说明:创建一个文件,如果文件是存在,他会覆盖掉。
' H; l8 a$ i$ _/ T' ]% H5 I) j1 k- n2 E* p" M
.area函数
' M3 n. z  G" N( `3 n1 L* C5 ~# o0 p格式:
- L5 V3 `! }- F* J6 E0 p6 ~; T.area SizeEquation[,fill]! O7 {6 X6 ]/ v, A% O5 ^" H% f
.endarea4 f0 P" [9 F1 F4 ?( }
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败7 ]2 L" z6 J6 t9 p& c

. u1 i5 b! ~8 h+ z6 C例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
" s0 h2 C! a0 ]: u' [org 0x100
/ q( X5 E* H& U8 b4 J1 {.area 0x8
- @9 [* |) w) \7 Ibyte 0x5,0x6,0x7,0x8
4 f+ O: X- x9 k9 Q8 ].endarea  a, Z8 w( T! z' ^- s

5 L0 M* ?% \5 R5 C. h.align函数
) U9 r& g4 y8 C格式:.align num
( d. `' @% W, a9 {3 t( Z说明:写零字节,num为零字节数量,用16进制表示。! o- Y, J& _- l# Q
6 P. D; H( K3 }( k/ K7 R5 k2 d
.pool函数: }+ c: j" u9 ]# ]& D7 R& h
格式:.pool+ W7 `, O: [9 K
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
1 V! d3 p6 G; P例子:
, B0 w9 ^' \+ ~7 |; Z6 ]% cldr r0,=0x12345678;
5 Y" D3 D' ?' ]/ o. p& N$ k( H....
6 n7 d, p  J  C.pool( f# i; K& |8 y  C! e: R5 ?7 N6 ^

+ T+ k1 V. ]6 n) J/ c0 I3 P- D/ z.fill函数9 k" q; n- h8 N. c. e( n
格式:  g% I! W. C9 o, I4 z* ]% |+ u
.fill length[,value]7 i+ F& r3 Y. e
defs length[,value]* r7 R7 ?* ]- M& N& [
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。" |1 T  o1 q8 A: f1 U

. {: p. A( W  G8 ?6 a- I0 A- }.skip函数:9 a$ w0 d( x  Q) Q+ w: B' {
格式:.skip length- b3 P4 D6 r1 w! S( L$ s# J
说明:跳过指定长度单字节数值,length用16进制表示。( l5 `/ T6 P" u9 E" h6 R

% D, u$ V) a' a2 J. I写单字节:
0 y, g3 N- f6 T$ {, I.byte value[,...]6 o7 G7 r0 L4 P6 g3 T. x' A/ G
.db value[,...]
" M' H! {: E! P. m. E& M( M4 q.ascii value[,...]
) B- ^$ b# K3 O9 {. K# e.asciiz value[,...]
: x* X9 h- Q5 q, X3 b2 x+ k* A) w+ ndcb value[,...]1 }8 \& s3 i3 c: _

) @' s/ ?  b# ^: G+ t% p$ \$ _# c写双字节:
$ G( R, j% E0 }3 B2 h.halfword value[,...]. ^/ ]9 g# z! E- V" i' V5 c
.dh value[,...]
8 `; ]" t: A1 r- O/ |5 Qdcw value[,...]# l9 k1 q' B' f8 c( B

% y& s1 v/ B! K4 X. ^5 {! w; `写四字节:2 S, h- c+ {7 |, B" i
.word value[,...]
, h1 Q4 v1 n9 `! y8 E5 a" h! E.dw value[,...]
7 ~) l# U* T7 T1 y6 G/ wdcd value[,...], W" P: b% |; O% d3 I- P% b$ R4 y3 }
. O+ ]; H. C/ D( S$ G$ c' S
写doublewords:
- ]3 H7 \6 C  \+ S) F.doubleword value[,...]
# m; |8 w9 C& ]3 o+ b% V, b, I.dd value[,...]
4 @# v, d- m# l* X4 rdcq value[,...]
1 K+ F2 t* [1 Z3 E0 |- v4 z+ a* ?' d" ^0 ]8 @+ L1 \2 k# e# i' c$ B
写浮点数:( W0 D' p' x9 ^& s
.float value[,...]& q4 X, C9 q3 M+ w: y
.double value[,...]( C. X9 G& k- J9 v/ _) y

1 i1 B+ [. v# H) z' s" ]# |ARM的ARM模式和THUMB模式定义:7 ~9 R( l3 M  a  x3 }: Y1 L* @
.arm|ARM模式
5 K' [6 b& J: i6 t' T.thumb|thumb模式" ]9 P' C5 \+ B+ W" a- F8 e* t
& D; Y4 |! B  n+ k0 P
设置架构:
% G( I  T& x1 u+ D, P.psx|PlayStation 1(MIPS R3000). Z2 S& [; C: R' \
.ps2|PlayStation 2(EmotionEngine)! s4 m: b5 u8 h7 h$ L4 }
.psp|PlayStation Portable(Allegrex)+ `0 `% N1 W( O1 I8 n' }
.n64|Nintendo 64(MIPS R4000)
0 r- V3 Z8 N+ V8 @4 A( d' z.rsp|Nintendo 64(RSP)
% @! U+ D6 P+ n) y4 x1 w.gba|GameBoy Advance(ARM7,默认是thumb模式)
% ]+ H$ ]  F. `! ]4 {0 {; f.nds|Nintendo DS(ARM9,默认是ARM模式), W2 C& _2 E. i
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)0 A8 y, Y: |5 g) R* d0 j
.arm.big|7 N; y* ?/ @6 K1 F2 D$ M
.arm.little|2 J3 l4 g: i3 h) \9 N4 i) K) ]
4 |/ \( y. V* b# V$ p) J3 F( Y
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
- O* U9 _3 Q. l' R" s" ^
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-10 23:48 , Processed in 1.072266 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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