EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1836 天

[LV.Master]伴坛终老

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

; A; N7 z! i/ x' K9 L! ]; ]0 ?& d' RARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
' E' m% J- n' B; ~+ c4 k. t% Q) v8 G$ [+ i
ARMIPS assembler作者是Kingcom,目前发展到0.9版本7 t# U4 H/ v9 C4 s9 @, _8 p
  b+ u5 M. L$ O
Kingcom's website:http://aerie.wingdreams.net$ \. S5 Q' n# H/ V8 d

' ]) z, O2 P3 [& T) p. LARMIPS assembler源代码可去https://github.com/Kingcom/armips获得/ }" H/ g  @: |2 P! n
: W: z$ ~# l' E/ o$ Z$ o2 ?
更新版本可去http://buildbot.orphis.net/armips获得
2 E* u6 D8 o5 J/ D1 l. Q4 ~! L* T6 e5 C( i' f+ A$ p
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
, p- a( `* L. U8 W! W. W# M4 S) x, A! E) C/ b9 p( }5 |! S
ARMIPS命令行用法:! l% l$ b+ T  d  s

7 P" |& u* c3 R( G8 a1 QUsage: armips [optional parameters] <FILE>
. `4 h' v2 a/ M( f
1 G- \) A& y- T+ I! ~3 v$ s, A/ ~Optional parameters:
2 U# j6 L- C8 i" Q9 w' m- x* K -temp <TEMP>         Output temporary assembly data to <TEMP> file; Q& w/ z  v% J% M; c* E+ z
-sym  <SYM>          Output symbol data in the sym format to <SYM> file* }9 E2 z/ _6 \
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
. D" b/ i, u$ B9 ~% b  a: g2 Q5 p! N -root <ROOT>         Use <ROOT> as working directory during execution1 A, j, O2 J* b
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
. Y( W2 l/ x+ H1 P -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
0 J3 E6 t- E" Z; d/ Y -erroronwarning      Treat all warnings like errors, j6 p+ P* m4 N7 s

! ?: @3 O4 w# tFile arguments:4 \. g4 |- X  ]  F7 ^# b
<FILE>               Main assembly code file* y, ?% k1 Y! _% T: U. X

, l# m8 F5 e& t4 N( k/ v-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
) d4 K4 a: w( {3 y/ I-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
( `: K6 n1 B- G2 k5 q-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp- [' I: ?6 Y8 G! V' Z3 y' H
-root <ROOT>参数是指定执行期间要使用的工作目录
8 v0 T3 C# d$ f, Q. x, f! y9 T6 e; }4 P-equ <NAME> <VAL>参数用法不明
# W, @* @" M: A-strequ <NAME> <VAL>参数用法不明# d, i+ y8 H4 \$ G0 F6 \* f3 y
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译4 b* y: q9 T+ a6 `4 w: ?

* h$ i! W, ^& h- P5 G) a<FILE>是汇编代码文件,可用记事本之类编辑! T+ M7 u7 Y6 J1 V& l

" d5 c& T# f5 }' p$ T' f  Y) A注释说明:
! J# u( s9 t6 a& T7 p( W. C注释可在单行指令后面“;”和“//”添加
* `# ]2 x5 G) h8 y' z3 T$ q0 r“/* */”式也接受
1 g3 V& V  r- c! T# g
. B4 a& ^8 z% ]9 y2 r例子:- X! n$ Q  ~; u, A  ^
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000+ A( M  x, v6 O* c
- W5 {; a4 f2 |+ U0 W0 B0 E0 W
.close;/*关闭文件*/
* [* O. @. v7 F+ w* T" ?- P) l1 d. _7 O" p9 h3 }& t2 r8 t
标签说明:
. |  l' \& X5 Y8 Y标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
$ _9 z5 U8 n& T- M0 r: J
3 C, _0 q% h9 ?$ r( Y% @/ `( d数值说明:- Q: D. `  ?& l. _' l: R
“0xA”和“0Ah”是16进制数值
1 d& i/ C$ j( y# d" x“0o12”和“12o”是8进制数值
( @! U( c/ D$ ~) ^" ?( V9 x“1010b”和“0b1010”是2进制数值
* i8 ~/ H0 V9 q* I/ Y# n$ g9 G" s: i* H- F& `- I% c8 e8 j9 x
equ说明:
( U7 i1 K/ }" b2 ?* t$ F格式:text equ value3 H1 P- d% q3 y3 |# g
说明:用一个text代替value. u; B0 e/ v& i4 v: p8 a: X
例子:
5 K4 ?9 O! j! ^( _" \5 t/ ^address1 equ 0x12345678
( ]' {6 `8 k# fldr r0,=address1- S' \- _, T' M
.pool. x# w* Q* l- e1 b! A  Q

* y3 Y  a. r0 |) {4 U' N函数说明:# p% Z, H6 R+ ~# v- R% L8 m

; U6 [+ b3 i# X" d+ ?9 c.open函数:1 H1 m$ e. {# w  E" a
格式:
9 F; d. V5 s- f8 {. X& Z$ h.open "ROM FileName",offset" h% S3 c( }5 R: i4 P( m9 U
.open "Old FileName","New FileName",offset
, H5 O4 @% D" n0 L- L说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。4 H+ ~6 M, `0 L
! O; p0 ~5 D6 G5 m2 C( l
例子:
6 U# m2 C& Q0 q8 {( J+ \' P; V8 e1 \4 e.open "1234.gba",0x08000000+ b& Y! Z  |" `
+ {/ @- k* r: C" A& ?. `
.close函数和.closefile函数:) S8 X+ K8 D; Q5 u/ [5 ~
格式:  A2 C. R) f! Y2 _, b" w- i: B
.close
5 ^- p& P# i9 `0 I$ ^9 `9 M.closefile
% w* `- l* N% O5 `, }说明:关闭文件。% S5 f2 b6 {# i9 n" g
9 O# c& w/ g0 E; n2 k
.org函数和.orga函数:8 ~2 |! q' \, j
格式:# r$ Z; j: r; m. y
.org RamAddress( Y8 Q# B4 u9 v0 `: F% X
.orga FileAddress1 Z0 j4 U" U' Z4 F( X
说明:
# D3 Y8 W8 ]: u" ?, t& e前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。: T' t* r$ S2 U5 U* K! Z

  a: O: X+ q1 r0 E1 s4 l6 L, g# ?.orga函数可指定ROM文件的输出地址。
) |+ J' H4 X2 u! b
  k$ x7 X8 d& Y& x+ t2 ~.create函数和.createfile函数
5 M* i! S: a  g* B0 V& L格式:
, C  m# ?# r) q7 T* [: U( k6 t9 ^.create "FileName",offset
1 u1 u9 D3 N% w- p1 ~2 s.createfile "FileName",offset0 O; r( w5 g- T  K7 Z
说明:创建一个文件,如果文件是存在,他会覆盖掉。
( I  l6 a4 w' X0 I9 c- c+ T/ O4 A7 X$ E; C" e+ q, D
.area函数; b" n$ n$ y7 h" w, J! D4 Q
格式:4 v; s0 z+ g, T2 _; ~
.area SizeEquation[,fill]6 N2 w6 R" e/ F: ?* M7 y
.endarea
3 l" y+ D3 H" N+ f/ {, t说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败5 u3 l6 G: n8 }2 z

  t5 q% |5 M7 _0 A" ~7 C+ |例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
" h* [) ]! c& b) \0 o7 X4 u# Iorg 0x100
1 D% ?" P* H$ B8 F( S* R.area 0x8: ?5 b. j+ R4 [
byte 0x5,0x6,0x7,0x8  [1 S& y, k* f2 I% {: @
.endarea
( K& U5 F' P/ u# F* u' W1 H. q4 @
.align函数
* G3 |+ Q; B5 t# G格式:.align num
/ \4 M" F2 y4 ?+ U( o3 z; Q  A说明:写零字节,num为零字节数量,用16进制表示。
2 Y* C3 W- k3 g6 V$ D& S8 Y4 k  w/ @. i& q4 s
.pool函数
" X3 R  R% e) r格式:.pool
. y1 A* q, h0 K+ n9 {% }4 S  W, }说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
7 T$ r: f: Z8 o5 h; g例子:
) u- q; `8 |8 R' Zldr r0,=0x12345678;
! j' {* ]/ D1 X9 S4 m4 f  {....
3 `- n3 O) A7 w  P.pool& Q! ?& a4 l3 w8 w2 h3 B
8 ^5 N- c% H, f2 c. W% Q
.fill函数
+ I2 z0 ]+ d: z& k9 S5 `: M) {$ r' _格式:: f+ b- y  P; Q# D  ?3 G* E
.fill length[,value]# {# x. O/ I, ]" `
defs length[,value]
( R& [$ M+ @3 [' E6 ^. Z说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
* ~4 R( P9 U+ H4 @+ Z# X+ M% q, ~8 r; T+ o& X
.skip函数:
0 S+ N4 y4 m) Y2 @  a% Q5 E格式:.skip length
% y; T0 j( v4 X5 Y; _8 A( T& v5 G说明:跳过指定长度单字节数值,length用16进制表示。
* a1 y$ C* f+ _  N1 o) {4 e9 c2 ~, Q% |& o: B0 a. \4 P
写单字节:
5 o, N5 S3 z6 B) i- n  u1 N* O.byte value[,...]$ X1 {0 Z1 ]5 E5 A# K- h9 A
.db value[,...]
& q* q( e9 ~; z( j+ D9 w+ m& T.ascii value[,...]
2 z9 C/ `1 z, b3 g+ t.asciiz value[,...]# {3 y' G8 n  ^4 h2 v- v0 R
dcb value[,...]- w$ d4 O' T& D8 b6 l! w4 y- q0 }
9 \0 H0 Z# A  l7 {1 Z* l7 D
写双字节:
, N2 A& Z0 d5 R! q.halfword value[,...]9 |5 L; E& `4 n4 _; C9 F  ~- [, p3 h
.dh value[,...]9 c9 a$ E, @- e0 z  E4 f$ X( Q
dcw value[,...]
5 u" h. v  g' T( ~0 M
4 J$ l8 S4 o" n# r, z3 l3 b" B写四字节:( b9 i) Y; r7 q0 L4 h) H
.word value[,...]
8 L7 a: K4 o  O- i' v.dw value[,...]7 d3 T. R1 ^! f2 R7 w0 G/ n
dcd value[,...]
/ r) Z+ Z6 P. r- n* L- G, |& \5 B8 q  K2 {# x
写doublewords:7 p7 ]  q# V( i7 R
.doubleword value[,...]
' m) e3 a' ]" N) x.dd value[,...]
) t# O4 _/ a9 G- P, _* tdcq value[,...]
& ?# c# K& X4 h6 G8 n4 @* c+ b6 F5 `- A  b. p8 r
写浮点数:- M9 b5 D: J9 X9 U% L9 n
.float value[,...]
' B  z: o$ N; ?) M.double value[,...]" N* k- x2 Q4 l9 C6 C- j9 ^% S

, p) m& d# W/ V+ q. ?* ~. RARM的ARM模式和THUMB模式定义:
& B, c; [5 ]& X.arm|ARM模式. q0 P4 P. {5 ?" n3 X9 ]
.thumb|thumb模式( {6 w9 `! W2 @: C
2 t+ i+ W% ^, Q
设置架构:2 A8 o7 [- u: [
.psx|PlayStation 1(MIPS R3000)
  W( |/ r; {/ M.ps2|PlayStation 2(EmotionEngine)# I8 {2 c; g, g8 [" B
.psp|PlayStation Portable(Allegrex)
* ~( S4 h; ]. y( P* ?.n64|Nintendo 64(MIPS R4000): h" j" b% ~3 P& y; m2 k
.rsp|Nintendo 64(RSP)1 p. ~  a. U) [7 ]0 w
.gba|GameBoy Advance(ARM7,默认是thumb模式)5 ^% y; W, M' z4 s, K' e5 B
.nds|Nintendo DS(ARM9,默认是ARM模式): ?: ~7 q$ G8 F( ]
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)% Q. _& D, O4 w6 N% z2 f
.arm.big|
9 R& B! q3 G# s.arm.little|
6 l5 ?+ N: [  A; ~9 ^* A8 L3 c, o- M
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。( z& E( d5 H. \$ w$ T
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-21 08:53 , Processed in 1.095703 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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