EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2155 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
. H* F& X) f; F) R
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
# M! e: }4 }( |2 `! p5 e) D+ A' o2 o7 v* R) b
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
9 v8 f: R# b' J( e2 U9 B; ]: j: I3 q2 @" c- k
Kingcom's website:http://aerie.wingdreams.net
7 o4 g( X6 p2 ]4 T' O2 F' _9 E1 K* n! g+ a6 }
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得5 k& I% ]7 M  A9 }" S

6 H  E$ M' a. M8 S. W" X" y更新版本可去http://buildbot.orphis.net/armips获得
$ S. O* F- N' S+ M2 ^
4 q2 I8 c. A2 _3 DARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。( Z( ~% X& k1 p) [- U0 ~$ R1 h, @
# j+ @# h. U  ^4 G; x9 h5 {
ARMIPS命令行用法:# d9 K8 g. d0 \0 M- I! s; N
' |0 l6 s2 l1 V6 C  B
Usage: armips [optional parameters] <FILE>
, d2 i" ?" |' }2 L$ A0 [" Y' n* F8 b- b8 R0 M) M7 c
Optional parameters:
' r" }8 P' a6 |1 A+ M3 L: g -temp <TEMP>         Output temporary assembly data to <TEMP> file
. s. n# M4 b) {* D -sym  <SYM>          Output symbol data in the sym format to <SYM> file
+ D0 I' N, z2 ? -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file0 J1 z* {0 ?& m( J
-root <ROOT>         Use <ROOT> as working directory during execution% v) @$ n. N% J+ I
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
9 P+ `' C, H0 w& v -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code( j0 N0 b. b3 a' [
-erroronwarning      Treat all warnings like errors  _( [0 U1 ?4 p8 K3 W

& ]3 q- Y+ {9 X& u3 ~* \File arguments:, c" @: C1 B6 _5 V; P7 r+ L7 N
<FILE>               Main assembly code file
7 k# p) E8 l+ `( L4 ^; P" `( G
, ]4 I! W" c" |; s" w% ^2 M# ^3 ^-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
  Y/ R4 \0 j) [9 l-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
0 v6 f8 T! P! W( K-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp! |( E6 u0 f( D4 j
-root <ROOT>参数是指定执行期间要使用的工作目录
$ H/ x% X- Z) Y: g: O0 I) |' V  O-equ <NAME> <VAL>参数用法不明
+ T! u) X5 B# D8 Q" ~$ ]-strequ <NAME> <VAL>参数用法不明
$ X9 o" d% x  f+ L' G' Z) V, w-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译& j5 \/ @2 G5 Z" {
  p( ]* D. [  Q5 i; p
<FILE>是汇编代码文件,可用记事本之类编辑
3 O. k2 q5 ]- L- v8 n$ G
; \  s+ C+ w4 ~2 ?% k1 W注释说明:! K3 t6 [( V1 g7 h  E
注释可在单行指令后面“;”和“//”添加
  w- }0 z, F+ k/ x3 k, k“/* */”式也接受" _1 I' S# T6 ]/ I, {4 B( \

  t/ _' X4 u% _+ I例子:1 i' j7 r0 g! o" Q
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
! L% O0 n3 d- U% j; z. S6 Y
! f- C1 R! A% J.close;/*关闭文件*/; e& {% H. a& @/ W1 i* l7 F

1 M# ]  k; L( j标签说明:
. ^  I  A( H' C标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。# w4 S4 ~7 o# g" v

2 F; |0 q) o0 ^7 z数值说明:# V7 u% H# C! H6 @
“0xA”和“0Ah”是16进制数值
* ]0 V# Y2 j' k: n+ y“0o12”和“12o”是8进制数值4 x. @" v+ s8 ]( q6 U# l! T: I
“1010b”和“0b1010”是2进制数值
. \; s1 j' \3 @$ w8 N2 Z, k7 x! ]( z! \6 Q0 k5 U7 {
equ说明:
( L& P  r  h' Z7 d格式:text equ value  \8 i# U8 H1 s# ?! t
说明:用一个text代替value' v  D9 O, P- w5 ^6 v/ Z% @, S% ?
例子:8 B; F" [! ?# a  C" \  ^
address1 equ 0x12345678
# ?# v. K5 o7 X" o& Dldr r0,=address1' _6 S7 Q3 Z$ J+ S+ f/ ^  a- u- o
.pool
$ @+ ^/ V: L4 h4 e) m" u9 B# ~' S' H; C4 q& Z
函数说明:
' y  ^& P. W& W% |% |5 `" r
  o- g! G) A3 X/ |0 ~.open函数:1 p, N2 m! m7 c
格式:
0 ]! V( U- S2 Y$ j.open "ROM FileName",offset1 F) h; ^4 c6 e7 A
.open "Old FileName","New FileName",offset
. ^6 M3 L6 D4 Q( f6 S; p- i1 X说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
) C( t4 m- V! w0 {, t% T5 f: j( O. A1 J$ {' q; W5 x
例子:
4 h' ~6 `  s+ N! T6 ?( F* y.open "1234.gba",0x08000000+ F3 r7 f# u* y& `7 z

% j: u! g% ^( w% z0 Q4 E5 `) l/ g.close函数和.closefile函数:2 O0 g! C$ I, A# ~" r5 p, h
格式:
3 ]8 I* D. j9 ?) G& K( ^.close
- G5 e' I  I- f$ j7 [( L.closefile
" |& W0 j5 ]  ?说明:关闭文件。; a, P' X9 q1 x- n. v% I
5 E/ r- K- }6 j+ g
.org函数和.orga函数:
* `7 W9 f: l* n% c格式:
9 Z; b+ w9 C6 E' I: F7 x" {.org RamAddress, Y$ t# M; ^- W! V4 N
.orga FileAddress9 V2 g/ P) }9 t$ V' @
说明:
3 O& p* a* T- f2 r1 k前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
/ y# k! f; g; i0 {' l. [0 O1 g2 q( _/ f' ?
.orga函数可指定ROM文件的输出地址。9 z. k' n% ^( n- S" f4 _6 \

& o9 h! H3 y. X0 N* ~. O1 z' E.create函数和.createfile函数  l, }/ `# `; t5 s
格式:2 Q- k7 ~- z8 ]
.create "FileName",offset2 {  E' x/ |. A% S
.createfile "FileName",offset
' z# t2 n7 ]) C; z$ g说明:创建一个文件,如果文件是存在,他会覆盖掉。* m/ V% p/ ?  I9 D3 D) `
9 W# N/ ?' ?8 r4 l
.area函数
4 U: U/ }' f. d" x格式:1 a7 N  z8 v  |0 M& s; }
.area SizeEquation[,fill]) V' O  D3 K7 _4 ^" y/ n( @' n% l
.endarea
0 t9 P6 d% O" }1 x" V8 q. H说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败5 c' B& j2 e& _4 p/ K! f
! ~) y: K" k" ]8 r' Q8 P3 b  M
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据) g& H  a* P3 C7 o/ }
org 0x100" j( S0 s# w# ]3 ]
.area 0x8
& H( Z' f, T. M+ J. dbyte 0x5,0x6,0x7,0x8
; H6 t( E' R) P$ Q.endarea1 }! T5 r0 j0 T

: d, J+ U# k, g' _6 ]& c.align函数
1 R% S8 Q5 G9 ^格式:.align num
0 |( W4 E+ G- s5 ^0 k. ^  }) J说明:写零字节,num为零字节数量,用16进制表示。2 N5 ?7 P+ e# d7 x/ H5 g) {$ m
" q  x* }4 J, s' L- \" {3 y
.pool函数
" a8 j( V1 k/ ]1 M& y格式:.pool8 I4 z  s/ g  B
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。# X7 Q( _' Y9 z& c
例子:
7 n, f6 ?/ {' {! Y/ P# m4 m" q& W( Cldr r0,=0x12345678;  e% l& U# y: ]/ b* y! ?6 l
....
4 ?* v) }6 `2 ]* j. y- Y- x.pool1 Q9 E. _1 l3 N( p1 d, h+ ?) u

2 a$ n7 p7 Q. Z% Z1 f.fill函数* Z  e0 Q3 f+ K! I( e* L6 A
格式:
3 @0 D+ S' \% R.fill length[,value]# x- P* n5 ?( ]8 n- B/ K
defs length[,value]
; w. Y; U( c7 a/ ]: T( T说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
& r6 |5 O) E# b, M( M) x  z- M0 h( f5 t1 [, e+ t
.skip函数:$ a1 K# }0 z6 C! R) ?; L6 d9 {% q
格式:.skip length
4 D4 t8 |& I5 [( k说明:跳过指定长度单字节数值,length用16进制表示。) u; E$ f1 C/ Q5 G! k! x

2 N& p5 ^( N2 R6 W4 e7 E" X写单字节:
" S4 B. X' z/ O" \% O.byte value[,...]' a! l; Q$ h; _8 b
.db value[,...]
3 z0 K7 I9 i$ @: r, O+ {+ |.ascii value[,...]. }; F( L- j: ]0 H6 C  z7 t- R
.asciiz value[,...]
: Z8 O" E  O" Z6 P& V6 N, ]4 }( Kdcb value[,...]
* N9 E+ @( a+ M3 a
0 @. i; G' @( i- F写双字节:
8 A: R6 J: D1 r9 _.halfword value[,...]
& o" O) n5 _2 L& {- T: E6 ^6 X.dh value[,...]) ~5 E, J9 T/ `- e, L3 u+ G
dcw value[,...]
* f6 S8 q5 w3 E6 s
& a$ f- f+ Z8 H: Y. P: m写四字节:; M  Y; v4 X4 K# N# b3 A4 ?6 V5 ]
.word value[,...]
* O- s6 C, G! n; Q7 V3 {9 h0 |% w+ ].dw value[,...]
7 [0 @( p  d. E. ]6 S0 [+ ddcd value[,...]
) _. z; Q$ n8 D& J# }4 \& b) L' o0 @
写doublewords:
( u% X7 [4 U. s% o2 O" D.doubleword value[,...]
4 m% R! Z! {+ u) L.dd value[,...]
% U, \2 ?, V" t! |9 l* zdcq value[,...]
3 [3 U  ]  |+ G$ Q% S; Y7 R9 C1 ]
写浮点数:
2 B. j& H! \# h. t.float value[,...]
5 E$ x8 F2 j. E' b1 r.double value[,...]3 e+ }5 @8 O. V* t; z

3 j( S3 ]% `  k8 mARM的ARM模式和THUMB模式定义:$ z$ H6 v! [) }! x, t
.arm|ARM模式4 I" }7 ?! {" P; o- d/ g  r# O# u
.thumb|thumb模式
, V. J' x- }# f- ^6 _! l% `9 G, P- j# G( T& F; T
设置架构:. i( e' {. E: J  g, m$ Y1 r' ?
.psx|PlayStation 1(MIPS R3000); S& q" x4 ^3 [9 f& J( G( ^" V. K
.ps2|PlayStation 2(EmotionEngine), b& I  J# D8 x! ^
.psp|PlayStation Portable(Allegrex)
2 Y" j& m/ y. ~.n64|Nintendo 64(MIPS R4000)4 R0 Z+ L+ q+ _+ _
.rsp|Nintendo 64(RSP)
0 c4 O+ g/ o5 u; b2 d7 z.gba|GameBoy Advance(ARM7,默认是thumb模式)
8 T' X" a1 A8 d7 C( \8 S.nds|Nintendo DS(ARM9,默认是ARM模式)
. ^5 \% t8 T; l# O* [) l; t+ b" F.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
2 ^! {8 w+ h& V  h; ~9 E( _.arm.big|
6 B0 }6 [$ o2 s.arm.little|
- }! }+ g3 g1 a% P: D- z! U, w$ a- J3 _4 h. Z. s6 [. D7 x' Q
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
% S$ y! ?3 F0 Z/ j6 x9 Z
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-9 23:44 , Processed in 1.059570 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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