设为首页收藏本站

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1934 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
: h7 T" s# O0 B
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000" }3 L7 Q5 Q6 H* L
' `1 Z. D  Y/ g- L
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
0 ?4 z7 |! a2 h2 G0 M  d6 D  G+ P; B2 T+ i
Kingcom's website:http://aerie.wingdreams.net- I; X0 R, `# L  ?" R/ `
# ?4 {; s5 W& i; J% n
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
  f2 _' w1 F, g4 c1 @; c- T/ L! V. s3 e& D: s/ G% b! `+ d! M
更新版本可去http://buildbot.orphis.net/armips获得
3 U( q) O7 Q- c2 ?
. M( U) U7 d* _& z. B: \ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。7 u, Z6 L3 w/ g
0 u( s3 W" r& `/ M8 }# ]0 z: c' i
ARMIPS命令行用法:9 z* t# E' e; ~( Q$ d

/ t( w& ]* K, u) E6 H: OUsage: armips [optional parameters] <FILE>
$ A# i' A! Z* [' H, \2 p+ c8 x8 F
; C5 Y: D7 U4 y& }/ E" [Optional parameters:
6 k3 {  y6 P9 ^4 F: g -temp <TEMP>         Output temporary assembly data to <TEMP> file2 l1 B1 K0 ?8 S0 S& E
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
0 W9 k5 E8 W# w; N3 p& g3 G  `2 P -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
, x6 W8 E2 H8 I( C! b% V+ ^ -root <ROOT>         Use <ROOT> as working directory during execution
4 L6 U0 Y; T4 }) J -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
+ ~7 R3 T8 h. Y -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
- |1 \2 y& `9 N) l1 [ -erroronwarning      Treat all warnings like errors
7 P: c  V2 d9 T! g6 l' S2 R1 T( Q! E# |5 j5 Z
File arguments:
1 H9 }9 ~: _3 A% z( N <FILE>               Main assembly code file
, w) v7 h' j! X0 v( @3 @2 K- L6 \7 d% y6 d' `. x
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件7 p2 G2 I/ f2 e' Y+ P
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
9 i. ?) I4 H3 |! {8 z# S-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp" B/ X) E: ?! q' I' E& L
-root <ROOT>参数是指定执行期间要使用的工作目录
3 m7 ?9 l6 L( r, ~. c& o. r$ X0 W-equ <NAME> <VAL>参数用法不明
$ O" |! R- L; ~. U! V-strequ <NAME> <VAL>参数用法不明0 {) V. |5 n5 E3 }& `) b
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
9 d1 ^# j  s, T% i6 ]  U  B( K, F3 M4 x' Q) G8 W
<FILE>是汇编代码文件,可用记事本之类编辑
& d/ I7 m  E9 }) D; g0 {5 O% ~% |9 x) _
" Q: ~# Q6 F3 Y5 ~# s! z* U注释说明:3 L, f, C# t( I
注释可在单行指令后面“;”和“//”添加
2 G' |% r- n0 K3 \. L( ~% W“/* */”式也接受
8 [8 J. J; x! |8 E  v, T  a
8 E; G: D# \. T; x例子:! k$ R  _/ r  |9 F; P; z
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000+ l- o3 c: R4 s& r# Q! H2 D
& I) N6 {2 e; v7 z7 M/ v
.close;/*关闭文件*/
5 l; k5 a1 M" x4 Z9 G/ {) V/ {: I& M% U
标签说明:
2 a3 B& B& r4 S) m- D2 A% r标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。1 R; p$ o8 S# T2 q( h! i

' v* k" A3 i/ V% [4 c$ M数值说明:6 H" N! z. f6 l  l: Y+ h
“0xA”和“0Ah”是16进制数值
; l. r4 V' W# e! M, u“0o12”和“12o”是8进制数值
( L" W. S+ g( I: P* A“1010b”和“0b1010”是2进制数值0 l! a6 [' d# c" |+ `

* e+ D9 L( d; Zequ说明:4 b+ o/ b5 y! X# c
格式:text equ value
; i1 u  }) C5 O8 Y" }说明:用一个text代替value
' v  l& b4 u7 [* q例子:
6 l5 m, u% @% V% paddress1 equ 0x12345678
" V4 t3 @4 j% v6 B8 Lldr r0,=address1
& X/ L  g( U, u.pool
; d) Y: {7 v4 F; i6 U# S/ ~2 u/ I
* Z2 U4 A  O, e+ M8 G; Q" {函数说明:
: f) x  W# X0 K1 t2 \8 U8 v5 l4 {+ K/ a4 O$ i5 X
.open函数:
1 k' o7 J5 t& G! j; `8 g. c, s9 p7 W格式:+ _7 U" s* d  t7 P$ v' g& D7 a# T! I
.open "ROM FileName",offset4 |: Q: y  |* q# y% W5 M
.open "Old FileName","New FileName",offset
8 m! S% w2 G4 v- m/ J说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
% s: O' u, K; A* \6 G
/ w: [" N: A$ B# E8 ^例子:
$ g, H, [$ a3 Q# P  h.open "1234.gba",0x08000000
. V" Y' A- [0 {/ }$ ]4 S8 {8 @8 p) j
.close函数和.closefile函数:
. v/ Z+ N! G. c% z: o7 A0 _/ S0 {$ G格式:
! b4 b/ {& n% _& U( Q.close
8 Q9 u9 E5 Z4 b$ V+ l9 e9 h6 O.closefile5 k5 [( Y! `4 J" w) B
说明:关闭文件。. `0 [9 T3 p) @7 d8 i/ @! D

( {3 _  Y, ]7 M( `2 X! X+ \1 R. ~.org函数和.orga函数:# P1 N9 J2 r. x  ?2 Q$ y5 A2 C$ k0 K
格式:
4 B1 \% c( }- t9 X8 s.org RamAddress( w3 v( c, N* a
.orga FileAddress. i9 m# K( O/ G1 d- r
说明:1 i2 T- c3 F1 u/ J( Y* j
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。: c1 V4 O- r3 D2 l* K2 o

1 D1 @4 \7 Q* D: X  `3 j.orga函数可指定ROM文件的输出地址。
4 N! g+ b/ A7 q1 S! ?
4 v' y5 k9 r) p" [; `8 O: T: h4 Y.create函数和.createfile函数
. T, x7 M' s$ y* U/ Y8 d. D; L格式:
* G: o* Q5 [% V.create "FileName",offset
" r* m# ?( a1 v! V5 F4 F.createfile "FileName",offset2 e- L4 w" b! ~2 M
说明:创建一个文件,如果文件是存在,他会覆盖掉。
5 H" H5 _/ v) u, w. P* G# E, w" z. u: y# b
.area函数  x3 z* t7 K# h% b% w* O6 N* V
格式:
8 B0 Z8 M6 u/ C- b9 t0 x* U* r/ M! j.area SizeEquation[,fill]
5 H: p/ s& w( d1 W& o.endarea
6 z+ N) h* _. h. b说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
% t7 h6 H3 T; {+ r+ @/ C1 J
, M6 G1 Q) [  x" ]' @2 c5 b" j例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据1 v7 e  E7 I5 e( r
org 0x100
4 U# k. z/ A$ C" N* \8 g( S! c) H.area 0x8
2 s5 b( `! w% F1 {byte 0x5,0x6,0x7,0x8
: n* D/ ^) Z# n4 E.endarea
: B% T# u: @6 J5 s$ I& x
* j8 }0 \+ N. B+ {9 K8 w# [.align函数
# \! p' [! N4 H% g; ?& g* t, q% n格式:.align num: d; n: ~) y0 k6 w' E* G
说明:写零字节,num为零字节数量,用16进制表示。8 N1 l# l' q* _% n0 n. t

  f& Q0 y3 L  E2 r3 |6 d.pool函数) \% Q. d; K8 H" s' U/ h  ?
格式:.pool
$ z  @' ?* k  t5 d7 G说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。( e. ^- _$ ]# E* z
例子:
' G0 l* L- S1 \' }ldr r0,=0x12345678;& u0 `# M$ L; j6 W6 e: n+ A
....
( @) Q: Y  E. v, \' q% V, g.pool
3 g3 ]& j" A! m/ Y3 k2 u; p, j4 A9 z  p
.fill函数, |6 S: T; |; d* D
格式:7 [' U+ K+ K2 D8 \+ z7 C+ j
.fill length[,value]
, P  ^2 v9 n; G. G# Ydefs length[,value]
9 M1 i9 H9 U3 Y7 w: v( A8 W说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。9 z" v. N9 `( b! \4 e

; {1 m9 ?( O, _1 K. z1 O/ D1 \.skip函数:9 e* ~8 T  Q, I. v2 Y* k
格式:.skip length
5 B1 U0 G8 K0 Q说明:跳过指定长度单字节数值,length用16进制表示。2 b+ Z  `3 h5 g& _

: @: h( Q0 o6 X+ P6 @/ X写单字节:( U. ?! A" ~* s+ d5 _( B  E8 [
.byte value[,...]
8 J& s2 W  c- }  q; |6 }5 ^# |.db value[,...]
' F3 E8 Q; r: `, _1 L# b9 @.ascii value[,...]; N5 m. d, o( w* W8 C* c
.asciiz value[,...]
* l/ V- @1 O8 Y3 j2 u3 m6 Udcb value[,...]
: H( Y2 z# P2 K; o* v7 v5 x
, x1 x7 k- N& L6 @6 |写双字节:
0 n2 K: y- W  q& a' m* U  a% o2 A! |( ^.halfword value[,...]
& `; u5 R2 D3 U6 o1 V6 p.dh value[,...]
% x3 y$ q" R9 c0 K& w. D, Odcw value[,...]
' G2 w" H8 S8 ]6 ^2 Z" i8 h( L' q# m8 n+ l3 ~1 q
写四字节:, M9 M& U4 h3 m5 f* g; {" V: Q9 Z! i
.word value[,...]
; K1 J! O3 C9 T* Y7 L) z& s.dw value[,...]" O: P6 E# ~" M6 V; e" U
dcd value[,...]
3 m4 ?( t% N# h
: @1 H8 C9 ]) z- V+ J% v写doublewords:/ C9 F, `+ u2 G* `6 r! G
.doubleword value[,...]* l; O4 H) w/ L: A
.dd value[,...]1 Q2 E. _7 m6 i6 [( i: L
dcq value[,...]1 C6 G8 Y$ s( U7 L
1 Z* f1 K+ `# p& n2 I" \/ h5 j1 T' ~3 {
写浮点数:
6 }+ c, n- X  O2 i.float value[,...]
( y2 E/ s. c: ~. H.double value[,...]& X4 s& t2 V* ?6 D) u) ^

+ m% @* o- m% `, RARM的ARM模式和THUMB模式定义:" U! d8 h. f- B/ l7 y* t
.arm|ARM模式
. E, P2 |. x9 C8 t* H# ~.thumb|thumb模式
+ m0 N" r, x$ a, Y/ E
" @  ]/ d- Q/ F$ a- B设置架构:- Q, ?5 }0 c% S7 b4 p
.psx|PlayStation 1(MIPS R3000)  n$ y7 g- j/ T# ~$ E% o3 _+ j# ^
.ps2|PlayStation 2(EmotionEngine)  B/ V5 A" R% U- y& y; L4 j+ B
.psp|PlayStation Portable(Allegrex)' q3 y# X9 j; F+ r1 c
.n64|Nintendo 64(MIPS R4000)
+ s, E; B/ D0 d.rsp|Nintendo 64(RSP)9 H$ C: S' k3 b2 X1 F0 _8 `
.gba|GameBoy Advance(ARM7,默认是thumb模式)
7 M4 O8 d8 V& u6 w0 _.nds|Nintendo DS(ARM9,默认是ARM模式)8 F8 v& Y% _( a; g7 M. E
.3ds|Nintendo 3DS(ARM11,默认是ARM模式), \4 T% X, P) H  ?1 t
.arm.big|: d) F* H( x3 g( K
.arm.little|! n) m. o6 n3 r* @' n5 k
# x7 z& I- t7 a
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。( A' Y: G) _4 \, j) ^
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-27 05:57

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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