设为首页收藏本站

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2032 天

[LV.Master]伴坛终老

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

7 s3 R* ~$ n4 s) p  h' U# U; M+ `ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000" q' h& P: B, Q" b/ h" D" n
- w9 t" g9 R% G* Q9 u- O. @. F" e
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
% L4 P! S# x0 w5 e$ S9 q$ g/ [# h1 {
Kingcom's website:http://aerie.wingdreams.net2 m& q0 o2 g( G& z. K" l  c( u7 _* m
! c/ {/ p1 L( |+ y
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
7 w* f7 y1 c/ R& N
$ o% G8 f  M6 U1 v. v7 E2 n更新版本可去http://buildbot.orphis.net/armips获得2 t+ c9 n/ ?6 ?

, a. d9 k8 w: ~/ }& EARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
6 a( Q6 ~, i2 J, {0 {' j  ~( g- d2 ]% i! h$ G
ARMIPS命令行用法:* P. q- R( V. i/ |
8 z% y' N3 I+ G2 ?- U5 i  C$ `. g
Usage: armips [optional parameters] <FILE>
: b2 P% [8 }- }" G$ z* \, e3 c% M) p0 L, p( }+ K
Optional parameters:
% z8 J1 J  q1 e$ A# D  o0 J3 U -temp <TEMP>         Output temporary assembly data to <TEMP> file7 D1 Z( A5 T' e# R  ]1 q' R
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
  r6 a& g" C9 h2 `: Z -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
3 w1 f& \7 e4 ^. x -root <ROOT>         Use <ROOT> as working directory during execution
& O* W1 E. O4 [ -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code( u( w! }& U1 C/ R2 |4 h
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
4 X. N/ i5 \( S  l$ c' F* O* L: i8 U -erroronwarning      Treat all warnings like errors* D# r- ~" X1 w- q# q' g
$ P+ u. F. e9 i
File arguments:
+ R& Z) D! K* b3 q' d9 | <FILE>               Main assembly code file
* W! z) V8 N/ T$ n6 D* j& {
/ b6 W! |, H3 u' M-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
3 x/ G8 U; T9 s: L& `-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
7 l+ T8 U, q6 ?-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp/ y/ R4 Q$ d3 `# K# [
-root <ROOT>参数是指定执行期间要使用的工作目录
* c1 [" `0 E+ ~: w-equ <NAME> <VAL>参数用法不明* k  B6 ?4 ?- L9 n7 k& M3 |( I
-strequ <NAME> <VAL>参数用法不明
* [2 ?6 p# P$ f- \; p7 U-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译- t8 F+ U1 _. d) i
7 A  x; x. f! [8 h# y5 _# C; R# [
<FILE>是汇编代码文件,可用记事本之类编辑
; @0 @8 Q0 s( ], a2 Q$ i, u7 B% `- \& ?6 t2 d+ m: t& Q
注释说明:
$ Z' W* y+ D' o: z. h9 o注释可在单行指令后面“;”和“//”添加/ U1 a+ G1 D, r2 h* _
“/* */”式也接受- c; p0 |- P) u# E. F

  ?- Y" d4 J* P2 `* R例子:
) @& G# @; a( r2 m% m' b) u.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000008 Q* c1 X3 r3 A8 H% ~% G' h
7 k! w# V4 d' l2 A' e5 ?( \
.close;/*关闭文件*/
* n) o! _% S3 p" |' m0 X+ w5 a& ^4 o2 ]- N9 \9 g  V* ]! a+ C
标签说明:) |6 `) F3 G* d; h
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。7 _) i; o* W! q! K/ K
* B9 }) T0 }; z' s3 D( C" x4 C
数值说明:
6 o! ~3 `  F, ^; |' }4 J“0xA”和“0Ah”是16进制数值) X& [) Z+ m: X% O6 H- U: o! l
“0o12”和“12o”是8进制数值  D0 l7 f/ X0 K3 w1 r3 T9 }
“1010b”和“0b1010”是2进制数值: |* p- \$ T5 G- i! F" p7 Z* n& p

  `0 R2 e; U5 H  L# W8 pequ说明:
7 E/ d( V; g3 c格式:text equ value
; K' D8 `0 D. B6 u, S说明:用一个text代替value
0 G* ?$ T4 i6 \0 h例子:9 l" l) ?1 m  a
address1 equ 0x12345678" a( u/ q/ N* M9 E
ldr r0,=address1$ \& {8 u& M$ q* P2 T' ?
.pool
& |* f# E8 W$ c* F8 t6 A) ?+ @" h! m6 U( P
函数说明:) R0 k: I! e( k) w. E

" C2 [( _& L+ W0 n' ^.open函数:
% p5 f, `1 J. Z" t3 V格式:. T6 ]- ]/ h) Z' }+ m
.open "ROM FileName",offset
  S  o: d2 Y1 ?5 q1 \) y.open "Old FileName","New FileName",offset
% ~0 y% O# C* O* D! H8 R1 ]5 l说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。; _0 }! v; n7 `6 c1 m
8 [7 O! r5 G; L2 Q" E
例子:
9 k! r' o# i$ H( c) v.open "1234.gba",0x08000000
1 U" l5 M  k  X- P; d: O& o( t
; ^3 q7 c& b& h& r( H. ?.close函数和.closefile函数:6 L) m. t, J+ X
格式:  K- }  y, P" P& g0 e5 }3 A! `
.close6 u* u% `( W* E. S: ^4 y
.closefile
: _% b: z! D8 ^# z8 F" I说明:关闭文件。$ M/ z  E& C) \4 [( N) m
# c" o% Q( H9 T
.org函数和.orga函数:
. F7 [. L- {0 |格式:
9 {' Y3 o2 u+ s* |5 a6 _.org RamAddress+ k! _3 B% {7 i& p
.orga FileAddress4 f3 C) y6 \1 {7 S1 h
说明:
; c* h" M) Q' W前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。6 o# O" w; E% {1 t1 A& \3 V

7 q: d9 q0 ~$ Z$ F0 A" F.orga函数可指定ROM文件的输出地址。
4 M# d/ e' H9 E( u# ~( M
  r4 W/ _  h, O' {) f. d4 H, ]) y.create函数和.createfile函数
5 b1 P  q; X) r/ I格式:' ~  ~2 G: ~/ M: N! d- P; A8 @) Q
.create "FileName",offset" ?' L! L4 x' e2 m" q, `# u
.createfile "FileName",offset$ c* I" f' M# q- A+ Z8 u
说明:创建一个文件,如果文件是存在,他会覆盖掉。& y4 P- z7 M& e- O) a

6 T* h% V% [7 @) \.area函数# I4 O2 E$ |! b" V; t; |
格式:
# b9 W! h+ F8 _' }.area SizeEquation[,fill]
3 v/ R# I# k4 A  k0 N1 {.endarea) W7 c6 G2 o7 r
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败5 T; V) P% E* k: ^4 \8 q' b

# z( G& g! M# k6 B/ }: S2 H例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
3 w+ `' h& T. f8 Xorg 0x100# ?: g7 d( y0 _: I( l0 W
.area 0x8
7 O# A: q$ A" [6 Z0 d3 }/ n6 Abyte 0x5,0x6,0x7,0x8
; a9 D. D5 a& w7 W.endarea
# j+ E" U( E, w' j. p3 ]* q7 g$ ?3 G* _' [( J
.align函数- ~* v$ ~6 x+ F* o; ~0 ]5 r- V* r% R
格式:.align num! \- V  o: l& y3 ^$ E1 P" c
说明:写零字节,num为零字节数量,用16进制表示。
3 ]+ J6 I5 m3 \6 s9 I  X- Y' l3 B; R( X) U
.pool函数
) @' J+ z9 m& I3 M格式:.pool; {) w4 t8 y7 X4 [
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。% M5 ?3 Z- B6 Y
例子:4 v7 b3 T2 U7 Y7 X0 N$ b
ldr r0,=0x12345678;7 S4 o3 Q& d" D/ q! h
....1 \: i; h! ^& f8 `+ p, k# k
.pool
; d9 p6 s# V' ^  U7 ^/ n, |+ _# [1 ]- C* _5 m" E( l# E
.fill函数' T4 Q- K0 ?, R* ]  V
格式:
# ~9 |- h, h% b' {.fill length[,value]
, n* Z3 a. @" B( B& T! udefs length[,value]6 A6 n0 m1 T) f: ], z
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
5 G, |7 S9 y7 v! I2 j
& X# Y2 w* `& T% {- f8 C  l3 F.skip函数:
7 q4 @: u2 G+ `) J2 n格式:.skip length
  \, q% g; t! O& |说明:跳过指定长度单字节数值,length用16进制表示。7 q$ B$ e; i- \; F

) v$ ?# [( `/ l! {0 u1 q1 v: {写单字节:
. V2 V8 C7 l) K$ |3 {+ l( U.byte value[,...]* u9 t9 r- `2 A  ?
.db value[,...]
+ i+ a6 v6 x; ~- f# f+ N- i.ascii value[,...]: `1 H+ Z6 Q% @* n% T7 }3 ?
.asciiz value[,...]* _# Z2 x( s( L
dcb value[,...]2 h" [9 s" }) d- j( ]/ ~. _

" n% o. t7 q6 x6 B写双字节:
0 f' S  c7 D; g; ?/ C  z+ H.halfword value[,...]
& c4 r6 J8 f) }. [: Q6 A, v! O.dh value[,...]
9 f; E$ w4 Z, C7 P1 y& Idcw value[,...]2 H# J; Z- @, \: m& H

5 F% \" c" e' C* c写四字节:) w* h9 Y- n8 s4 {
.word value[,...]2 Z% y* U3 m/ E' E
.dw value[,...]
# c  h# L; _$ f  ndcd value[,...]# o# x- a3 a5 X' c* U. T  J

8 B6 R- U2 y/ l写doublewords:9 n2 s0 l3 s2 E+ o
.doubleword value[,...]
9 w" W( P" `( q3 Y7 `.dd value[,...]
, B! X9 y9 Z5 g9 \. odcq value[,...]
$ p6 z$ ?3 f2 o* o8 ^1 `5 N& S+ q4 Y: X0 w: a- S7 U
写浮点数:) s$ E* F/ i4 r- L+ l
.float value[,...]
' t2 m& P, B% L; x7 ^- j8 D5 Z.double value[,...]
' [( Q7 V# X$ {% d: l( H8 P2 N4 Q, d0 I5 w
ARM的ARM模式和THUMB模式定义:
; M8 m+ z8 H8 N; R- K.arm|ARM模式- t- a1 ~( h3 r( B
.thumb|thumb模式$ K; F- ^) @: ^6 `- A
$ f, Q4 h7 O; F& O1 ]" U: ?
设置架构:
2 I" d2 O1 r6 C& I$ I* {& w.psx|PlayStation 1(MIPS R3000)3 F  j; U, u; `9 ?
.ps2|PlayStation 2(EmotionEngine)
$ g" t( f/ [8 K.psp|PlayStation Portable(Allegrex)
' ~0 \$ _; e/ a, S  [: b- v9 ~.n64|Nintendo 64(MIPS R4000)) J( X! |( a9 g
.rsp|Nintendo 64(RSP)0 |1 }+ E" O! c; x# G
.gba|GameBoy Advance(ARM7,默认是thumb模式)
$ }8 D, p8 ~% _) Z.nds|Nintendo DS(ARM9,默认是ARM模式)
: K' G* e5 F" L2 n) a.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
/ Y7 @& r7 t' A( w.arm.big|1 e( b6 C- R. k% x& |' h8 f
.arm.little|
' K, r+ e, x% _7 V! \: b+ \, N" d8 V) P& m* N
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。5 ^" Q/ y; G' |4 Z" C
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-8-5 15:57

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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