EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2116 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
1 p& _1 h  r5 Q: |& |, j
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
; ?: i6 s7 a; z; V/ ~. V! g3 l/ l; u  J
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
. [, s1 d! a7 ^
/ T3 ^# g8 D4 W/ m+ M+ P# bKingcom's website:http://aerie.wingdreams.net- v6 S/ \; X) }5 C
% N: X$ \& Q6 X& a2 e3 Z! A
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得' O3 R" U: i9 W( a5 B

1 V. {  w# N  C+ X) N1 p更新版本可去http://buildbot.orphis.net/armips获得8 P; J% Q$ X( y$ n- |

2 b) f, z  F; r# u1 TARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
: O  U  X+ P% e5 C% J& C
3 e) ]+ z/ i0 D; D0 uARMIPS命令行用法:
  X0 B+ E( K8 D/ G6 K4 W# \- k8 \
5 q2 l( z4 f9 a; {7 S8 [Usage: armips [optional parameters] <FILE>
. x3 X7 I" k1 j( m7 G. Q: _& y- G+ W# x) m6 y9 h7 e
Optional parameters:' t& g. a1 u  X0 [& M
-temp <TEMP>         Output temporary assembly data to <TEMP> file) g4 U' o* f: f
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
" s5 p7 \/ s% [2 i. ~! L& C -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
+ Q8 n0 l9 R+ Y% E -root <ROOT>         Use <ROOT> as working directory during execution& U0 N/ [% z7 F5 k
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
8 s: Z8 v1 J9 P9 C8 K6 G -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code  T) m+ f) V% r% _* R  L9 Y
-erroronwarning      Treat all warnings like errors0 O8 O2 f- z. g. w8 D

9 W  V7 u, `2 u! NFile arguments:
1 p) p8 ~/ g- Z# ^6 u1 `6 X3 p2 u <FILE>               Main assembly code file
* f  ^' q6 a) H$ ~" v* o8 i9 l& F* |) n2 \& s- `% {& |
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件1 s! N+ r6 U! R- X/ {
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba2 {4 w% T' N3 }( d0 s, t
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp6 K) t" J: w9 ]; u: ~3 L& v( F
-root <ROOT>参数是指定执行期间要使用的工作目录
/ S3 Y( G/ J  E& n, D7 j-equ <NAME> <VAL>参数用法不明
1 A4 z/ O+ i7 ?( p+ s-strequ <NAME> <VAL>参数用法不明
8 D4 S- f7 X  {1 x: T5 R+ }-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译" R. U6 K/ x. Z# n
% x9 Z3 Y% D# ~" ^% H4 t5 v
<FILE>是汇编代码文件,可用记事本之类编辑
# G4 n* l, h: u
4 |  I( r( a! c$ |- d5 V7 f注释说明:
* ]: H2 f# |  D/ {4 y  l* r; K7 x注释可在单行指令后面“;”和“//”添加1 W( {/ ]+ j1 l/ ]5 Z6 V6 \
“/* */”式也接受3 d; s: z- j5 v2 f
* p% F0 J# I2 R1 w7 ?5 ]: c2 z
例子:
, u$ |  o8 b$ S) n% _.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000005 S( J4 t% W1 ]& H: n4 X. d% G

6 ~& S/ A+ L( X' s& B- D% t* D4 ~.close;/*关闭文件*/
" k4 Q4 B9 v; t( N5 Y
+ M) m3 X+ ]% V, q; I2 [标签说明:1 I* A  h( L6 m& @
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
. y2 x0 M' w. _9 z8 ?& o) d; Q. e# V0 K" f6 Z+ w3 f
数值说明:- S9 K4 y1 J7 D
“0xA”和“0Ah”是16进制数值1 T  R$ e7 s3 I5 i, p) c  o( S
“0o12”和“12o”是8进制数值
# O* b; x  V# v' J“1010b”和“0b1010”是2进制数值% Q' d; o0 f6 O" A1 ~' t

8 x, z1 K3 r. v; ?. fequ说明:* u6 |5 _) b+ w( [. s% B1 ?2 o
格式:text equ value' [# ~( j2 m$ ]9 g7 l9 V- G
说明:用一个text代替value; d) v* _" ]2 y* n2 y
例子:
9 P3 H* \, v7 y: H) @5 U' Paddress1 equ 0x12345678
* O6 I0 R1 y3 }7 a8 bldr r0,=address1
$ i; s4 Q6 J6 B# j! i/ x9 h.pool3 s0 `- D0 D# M- c' C
) c+ R* P! {9 Z" I  L
函数说明:
, M1 ^7 T4 z" K$ D2 D9 e8 H1 {
8 [5 w& R- t. M1 H- i, v% h.open函数:
* N. |% ]% U9 M4 W格式:
- I0 C0 a- k- D7 i.open "ROM FileName",offset
# J8 @7 Y+ ?' f1 E" c# E.open "Old FileName","New FileName",offset
  r( Q& P  q7 K. ?; N5 q0 N说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
8 C7 H0 ^0 o8 Z9 R  g9 E( ~' f+ Y6 b
例子:" `7 h( D! P: ]( }
.open "1234.gba",0x080000008 o  u$ c6 J) o

9 @7 s2 K* T4 C% w+ y.close函数和.closefile函数:: `2 j2 x  d5 L
格式:6 f* U5 F0 i8 `. v" G2 l# C0 W
.close
) x8 Y7 S& K8 D; N0 @8 _! N.closefile! p$ G; `# p, r2 K" F& l: I
说明:关闭文件。. o3 T$ r8 r, i4 J

3 @. L: b, j! d" p.org函数和.orga函数:
* L8 {0 J( U0 a格式:
  X+ H1 Z. e; I.org RamAddress$ e2 y4 w& ], q/ S9 @! ]& Z! Z
.orga FileAddress& g; t# s3 P5 Q# _1 Z
说明:
' o6 r) S# l  e0 D2 b) B前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
' v- ^4 s) M; i4 e: E& x$ r* v# [0 y* |! m
.orga函数可指定ROM文件的输出地址。
' `/ F" v+ [" g4 M: \0 @- [% f: {
  r; l( n! x7 [' H5 ^9 V( t.create函数和.createfile函数% F0 X! F7 _9 O+ l" E$ `; U6 F9 k
格式:
1 \( ], x* _6 G$ I. e" S. @4 N5 D) F.create "FileName",offset  ]# k# e) F. R4 B& G& c
.createfile "FileName",offset& j/ x$ w, S3 K7 W0 z- e
说明:创建一个文件,如果文件是存在,他会覆盖掉。
# [: R/ N" |, u( G: P. d$ J4 V
( o: h8 b. ~- F2 u7 x+ n1 R# @.area函数
$ ~' {# E" x9 [* }' l( J( h格式:# l8 o1 Q0 z7 }1 M( Y
.area SizeEquation[,fill]- l. p/ h6 L0 [* F8 t
.endarea8 z$ y2 z0 W/ j) e
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
. @, d  _% J# c( S5 l
& q$ w6 L6 z$ h' y7 Y例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
# S6 Q3 P3 e& `5 J+ forg 0x100
9 o  t7 T6 [0 W* p8 {.area 0x8
5 L' l5 f2 [; j2 K( {% fbyte 0x5,0x6,0x7,0x8
# F4 @- L' l1 Y3 @+ f* g/ [.endarea! I& ?8 d" q2 ?) _
0 P6 b# F3 |3 @, T
.align函数
7 j* u/ O9 K" t; X+ U0 _' L格式:.align num
# D6 v, n3 ^: d8 ^说明:写零字节,num为零字节数量,用16进制表示。
8 z  H  ~( \( `3 |! p3 n! M7 a& O- Y$ @( A% }
.pool函数9 `2 M9 L* T* Y2 \  j% Q3 B9 q
格式:.pool
( G, ?, }2 K1 Q/ h8 Y* n, E9 h说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
2 h5 ~% ~+ w0 J" f& b$ C例子:7 P3 n# F8 F: g% h1 l- W0 p
ldr r0,=0x12345678;5 t* Y4 Z( y% b- C) f; N
....
, O( N) U1 ^- h/ J.pool0 S4 N( N) _+ ~0 I: ~# n. Y3 g; o
1 s8 h$ Z( ]+ `9 n
.fill函数
( E# J' ~+ M1 p7 K7 I/ W4 D8 @格式:+ @) A( g9 ^9 [/ N
.fill length[,value]- G5 ]: J; G( S- n2 u) i
defs length[,value]
- M$ o" I' g& b1 @说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。' e4 @# x# M& H- ^+ P* i- _
$ a- s  w, ^5 C7 G( Z. K* w
.skip函数:
6 D  _4 j$ j- E% G9 A8 `7 m+ o& Y5 L格式:.skip length7 v6 }8 |/ L7 e3 {  i0 N8 t
说明:跳过指定长度单字节数值,length用16进制表示。
6 V2 {8 D  W1 I" F& X3 s' S, v  R3 A' q' q  V8 m, f9 j
写单字节:
2 ?) W0 ^) g' E4 Q.byte value[,...]7 h; r+ _  u( n* Y5 P# u( Z  W! k
.db value[,...]
. D: F. p( y1 Y% z+ j$ }  j6 n.ascii value[,...]$ x/ v  v) X* Y
.asciiz value[,...]7 T7 P: M" R: A! N5 e  a1 S, ~
dcb value[,...]4 Y( p9 \, ?3 l9 [3 s- M3 p
- v0 v- ]# t- o; Q& s) y
写双字节:
5 h+ A8 h9 T: l0 o- f/ @.halfword value[,...]
( O1 U% _: b1 T3 O.dh value[,...]
) P) ]) v8 W! ^3 T& w5 H) ~dcw value[,...]
- O) I( O; l5 H5 r( H; D) f( L9 Y/ V; W! O3 R: W' O/ N$ _
写四字节:. _  ~" o& s4 f! ?3 U
.word value[,...]' m* K% ~6 B, F$ p5 w+ a& I, O
.dw value[,...]# e" E0 Q6 ^& K1 o; \4 S: K5 X
dcd value[,...]& D* c5 g) [5 W- t/ H, w
0 M3 B5 y, f8 E! C% x4 ~. y
写doublewords:
9 T$ @6 w& ?, G! |2 Z4 r.doubleword value[,...]
8 k3 B- j( T! v: U4 i+ e.dd value[,...]7 u$ }/ g; [; o& }( Y
dcq value[,...]
5 h  z% A& V2 x4 q* r) W0 b! f  ~4 s3 E! n2 _! ]/ R. d
写浮点数:" ~/ B" [) |  _" N7 \9 ^
.float value[,...]) h; T0 Z- m  d) }: C  Q5 j% p
.double value[,...]
6 N7 u$ o4 a, c8 g  k6 T$ ~2 I# i% e1 z+ y" n
ARM的ARM模式和THUMB模式定义:7 c; ?1 h2 K0 u8 `, Q
.arm|ARM模式& V2 q0 Y/ G1 |1 r" }$ Q! Q
.thumb|thumb模式; ]7 q1 m5 n# @7 o' i8 {

, X# c0 k9 P* \% z: F设置架构:! U7 ^3 X+ Z9 @
.psx|PlayStation 1(MIPS R3000)9 r% d: g: w& I
.ps2|PlayStation 2(EmotionEngine)
4 m) `' L  S0 t+ Q* Y.psp|PlayStation Portable(Allegrex)7 R5 ]( l) u5 L
.n64|Nintendo 64(MIPS R4000), A6 r, }6 i2 D6 U- q
.rsp|Nintendo 64(RSP)
2 |/ B, b5 M5 \1 G.gba|GameBoy Advance(ARM7,默认是thumb模式)5 i( y1 b: S' s: e0 D& X. I: h% N
.nds|Nintendo DS(ARM9,默认是ARM模式)
2 C3 p8 |- |% K5 j* s9 F.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
- l: r! i& i3 X0 E& J.arm.big|
, @% N! `9 b+ `" E.arm.little|
& _' @+ p* f) [8 V& d9 }; G( N. A. i( k
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。) M, I+ w' G8 \, E! y
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-10-30 22:33 , Processed in 1.076172 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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