EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2157 天

[LV.Master]伴坛终老

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

- I. Q6 {8 _- P# w/ q6 P- mARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
7 X, L8 i* [- M* W& Q  m5 ?9 C: t: u  n; p5 x( ]* O2 u* w
ARMIPS assembler作者是Kingcom,目前发展到0.9版本: p0 f7 R9 N5 L3 u, N) {
) R, J& o( {$ v/ v# j: \
Kingcom's website:http://aerie.wingdreams.net/ h- r/ N# ~. m9 N& I7 A2 J

6 {6 \% K% f* e- D% [6 \: eARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
  l' t9 K0 [: n1 l3 d$ z4 e5 l) C' Q- S. u" z, v$ [
更新版本可去http://buildbot.orphis.net/armips获得
" Y4 B; g+ {- |6 ?0 V- E1 j
7 F- F# ^) a; }! d& |4 FARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。; e- B% v* b5 s& k3 z& F

, U+ z/ T+ C) R& T5 [1 `! RARMIPS命令行用法:# L0 B  h# X( S% W: A$ n
+ d, r3 I1 m  c! w) V+ N
Usage: armips [optional parameters] <FILE>' n; @! e6 v6 z( K8 N" v( }2 _
( t# t( C' h6 W' u$ g
Optional parameters:
6 Z) {- R' q: J, p* n/ J& k -temp <TEMP>         Output temporary assembly data to <TEMP> file
0 k& Q4 Y. j1 c- V) T2 ^' S -sym  <SYM>          Output symbol data in the sym format to <SYM> file) y2 Y. d8 q( B2 Q. ?
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
0 }9 ^9 q3 k% d! U8 m -root <ROOT>         Use <ROOT> as working directory during execution
# q5 N5 C/ j6 b7 j" b: j1 L( j -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
) M. H) p, @- {& a. ~) t  i -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
  V4 u7 U) e+ r -erroronwarning      Treat all warnings like errors9 f0 _7 f3 L7 B- c
1 S# c# U8 X6 W( D" G) }
File arguments:
; ^, _' K7 {7 c <FILE>               Main assembly code file! Y, J& S+ f" `$ V- [7 g! ~' C
' W6 M7 C9 h/ T  \. }3 k7 T$ a
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
) ?# Z/ o" c8 b' ?-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba5 a6 f; B! d. d  L3 b
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp; o, [2 W0 p, k9 h& G
-root <ROOT>参数是指定执行期间要使用的工作目录
! R! O+ \7 g* J- m8 t-equ <NAME> <VAL>参数用法不明/ j7 o( Z: c3 v5 U/ M6 b
-strequ <NAME> <VAL>参数用法不明
/ \. b" O2 ~- A: g, M, {-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译; }% u, A! r( i& l- Q0 l
! w5 ~1 |9 ]2 d  S
<FILE>是汇编代码文件,可用记事本之类编辑
' f( U! d+ m( O5 }0 P$ i* ~
! x& R& `- I2 r/ k+ h+ V注释说明:
% c' g; r& k, [& d+ {/ n注释可在单行指令后面“;”和“//”添加, K  Q- {7 I4 g1 r. s
“/* */”式也接受" [6 D" @0 I* F+ Q, q" D5 F! N

+ `% C) P) S+ P/ \- i# _0 P例子:
: w2 T- o- [! ?0 n9 B1 _.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
5 Z& F5 r! }: U+ w* H1 g. T# L: K2 {' P( [* A( o6 y- A  a
.close;/*关闭文件*/
$ o& c" U1 l! q, m5 R6 J
7 X8 M# ~, i" K+ q标签说明:! B0 j8 X! T3 |; ^: W
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
$ W. f6 }' b$ P2 s; ?  }& I  V; C
- f) Q) v; \" S6 K( e数值说明:) Z% I8 G# z5 r# L. V9 K
“0xA”和“0Ah”是16进制数值
9 F0 `- v7 M. h0 a“0o12”和“12o”是8进制数值" k9 ]- c- ]# }9 Y
“1010b”和“0b1010”是2进制数值3 u* C9 L, v8 O" c/ c
% n  S. _0 @% ^% C5 J
equ说明:
. P  L; d/ V; E1 v" W) T* ?格式:text equ value
4 \/ k( e' |: v. ]$ Q! O$ L说明:用一个text代替value  ^2 H3 b: v9 C1 V- w/ V& p5 d. c
例子:* a  V) W- _  g. h
address1 equ 0x12345678! [( _( d' e, P9 X7 `' w7 s
ldr r0,=address10 E0 g+ B9 F0 R  v8 k
.pool0 I5 e8 N1 ^0 z
4 l" m$ R+ u, K% I" X% j
函数说明:
+ Z/ U( z1 r' {+ X. M% x
! G- G. z( p1 f! V" X.open函数:
2 t  |$ R. a/ K! G( s# J格式:
# [  x% k' ^% t- k.open "ROM FileName",offset4 j/ G( X# N' q; p
.open "Old FileName","New FileName",offset8 S  z3 I" v- h
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。  ]3 o5 m4 ~/ _7 O

7 \& W. G6 U: s. T/ t0 n% H例子:3 F8 w: A- L, x) f- }. J2 B( B. |+ H
.open "1234.gba",0x08000000
5 g* H/ ^' ^  b. |
6 ?+ h2 C0 h) M# u6 C: |$ I.close函数和.closefile函数:
4 m* ^9 c8 R: U( N  v# x5 r/ E格式:
1 c7 y/ J* g# l; b$ w( X.close) B/ B5 S' |# x8 B4 i! `
.closefile' ~0 Z) }3 m( Q- j" G* _& f8 Q
说明:关闭文件。
; K  H& c% E7 `9 m5 P( U/ r) C8 K0 D' N5 e
.org函数和.orga函数:
9 u7 }4 j' |# I- J% b格式:& L7 c+ y9 c1 X" X, ]7 ~" V8 j
.org RamAddress
% h3 g/ U) H$ F$ ~9 R) b6 }2 M.orga FileAddress
7 K% |# e5 i; ^1 H4 x: g& `8 R1 N说明:6 ]% P4 D- j! x; J( L; C
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
/ l( j; S+ U6 s+ l) j+ }- K2 j" t; N2 ?6 f  O
.orga函数可指定ROM文件的输出地址。6 M: E+ m% [2 S2 t3 d* e' j

, W" i  d3 p7 c6 \% [.create函数和.createfile函数3 A) O- u' Z- v7 |8 a. u  I: O+ _
格式:1 R% ^( i' G; t
.create "FileName",offset, Y& t& j) X% w2 Q: g/ c
.createfile "FileName",offset( c$ V" h( @( W0 U
说明:创建一个文件,如果文件是存在,他会覆盖掉。
7 E# g4 }9 _# v% l$ }4 a8 C% G! m3 V0 x: w6 s- }5 {4 L
.area函数2 }' o6 ?- V' T
格式:
" ^2 E; E# R4 {. ?: t.area SizeEquation[,fill]2 `! k& |7 S/ ]
.endarea
$ m* ^7 S. v" |* T0 c) J% c/ n说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败, v1 n, _% W/ K+ O4 U

# W6 G$ }4 n% z例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据" N9 \& A- S; b
org 0x100
) h7 w9 X  o9 N- J/ v8 y.area 0x8: N3 U3 d; l) W7 w8 n3 i# o
byte 0x5,0x6,0x7,0x8
$ V3 G& w1 g, A% c7 k.endarea5 O2 ^% [3 C1 J5 W; t
' {- t1 f  M7 y8 a& t' v8 V
.align函数
5 U2 ?' E9 g6 k/ i5 {/ S2 B3 X5 w, {. g格式:.align num. c- t& C. f3 c0 v  `
说明:写零字节,num为零字节数量,用16进制表示。
; w0 C- F5 c/ T5 ]8 K  g& E$ J6 Z- W( P! J7 ^1 @' }# @
.pool函数" P- P, O9 J5 p+ n5 d" A2 }/ m& n* P
格式:.pool
: s3 C- J6 t* o+ F  v6 G- O说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
: C( m, |' c1 M: [. X& ~  b例子:4 p: ^; o% T1 M2 J7 x) e9 J) Y
ldr r0,=0x12345678;; f6 s/ U3 p1 R* b
....2 Z+ v( e) S; V$ @
.pool8 t9 l+ X6 F9 l1 q1 W# `
: {& O. c+ h- a
.fill函数
: b  u8 T6 e3 U7 \格式:4 d3 y3 M' }$ D. I
.fill length[,value]
+ ~( O0 i" `2 u6 ]0 f5 Fdefs length[,value]' `1 ]& N" ?: K5 g
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。9 K  c4 z) M& e) A6 e1 r

1 o& t" A& j. @9 @8 B/ L.skip函数:3 ^" u- W, W# `- }" d
格式:.skip length( n. M2 l+ f. a2 |. d
说明:跳过指定长度单字节数值,length用16进制表示。
9 f' M" ?4 W& N5 k5 \
6 Q7 X+ Z6 R# c7 F6 r; @写单字节:
1 I# @+ F( @9 f: M5 T.byte value[,...]
* F$ J% \% w6 g: T: R+ d: x# F& a.db value[,...]
' d4 d( `3 ]: Y3 [: P/ b8 R.ascii value[,...]
. E( x7 H9 Z) i0 {0 T.asciiz value[,...]
) Q% S7 y" k. ?7 Vdcb value[,...]
- _1 S( P% d! ]7 w0 O1 S0 ?% N. F, g5 K  W5 w
写双字节:0 b+ b; Y/ Y  ]5 w6 n8 P! M
.halfword value[,...]
$ X! o& A2 |7 L4 ?* m.dh value[,...]( d7 p; p9 e  I8 S
dcw value[,...]
  c( A3 Z# x' r
. G4 ^: M* u1 \- Q- F: }+ q3 l写四字节:6 D% r" `, h1 ]( [/ W6 @
.word value[,...]" M- H8 B& X. k* j4 y; `* M
.dw value[,...]
1 A9 _5 ]" m3 J/ g8 k2 bdcd value[,...]. X; Q% a9 u% |
! X- [7 j9 @) @3 Z- q. b0 l# m
写doublewords:
( B3 T( O( K2 ?* k+ W1 e" Y.doubleword value[,...]6 f! j+ G! r1 j5 L* d
.dd value[,...]
' p5 s! V4 J0 a% E# Zdcq value[,...]
; l) H4 y( L3 i6 @) m* P+ o8 R# b- _) |; T* h
写浮点数:
( R  R( H6 _) S' ^, X$ s% K1 _. @0 R.float value[,...]
6 ^& C$ G, `" Q+ r.double value[,...]& A! f, r2 Q6 e- ]  K! ^

- m! E) q1 X+ X6 \2 FARM的ARM模式和THUMB模式定义:
7 d, d4 W* m  a4 h.arm|ARM模式
; B$ a) I  y$ X9 N0 h; n.thumb|thumb模式% _' x3 `/ E' H# ]1 h8 V4 F* ?, n
+ G$ F- t7 I0 T) [
设置架构:
" N* V4 u/ N5 C0 l% w* O1 d2 `.psx|PlayStation 1(MIPS R3000)4 W; I$ N* M9 F2 C1 @6 E8 q  ~; K, [
.ps2|PlayStation 2(EmotionEngine)
. x+ e8 M4 _! _6 ^+ Z& Z9 M.psp|PlayStation Portable(Allegrex)
- Q* {- g# N' N- G! ^  A.n64|Nintendo 64(MIPS R4000)
, D) F% k" ?& R1 X.rsp|Nintendo 64(RSP)
+ `6 a. @4 C- u) j# X& d3 Y.gba|GameBoy Advance(ARM7,默认是thumb模式)
% Q( T# I5 G6 m  d* u.nds|Nintendo DS(ARM9,默认是ARM模式)" ^% ~0 ]- _0 ~2 w1 l8 t, z3 T% H
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)5 _/ C9 W* g8 r+ ?$ k; M0 t
.arm.big|& N& S& V" |4 c1 G& W( Q& \
.arm.little|
7 z4 c: M! |6 Y2 t3 p4 Q2 ~" I. }; L
3 K8 D! B7 @1 E) x$ r常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
6 R) h9 ^$ f4 D5 y# E: a
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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