EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2211 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
7 X2 A, L- S+ Q; i0 x; {8 T/ w0 U
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
! `; R( E! T5 J& j+ X( E
$ m  C, u% g: ^+ x% r+ b+ m" g! j( x! xARMIPS assembler作者是Kingcom,目前发展到0.9版本
5 w! n3 v6 c, `. ]! `( F& C- O
5 W4 C1 C/ }7 Y8 [* ~/ xKingcom's website:http://aerie.wingdreams.net
- G- I" E) U8 L
7 _* Z0 c% P7 O1 H$ U3 l+ UARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
9 I6 ]' b% s4 W: u. B. h2 c: p" M1 i* K. o% }$ T. n
更新版本可去http://buildbot.orphis.net/armips获得
- ?% E# D1 Z# O+ L$ M" K4 j5 z* J- s5 }, {
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
3 A- I8 [1 o1 \. Z. u1 t6 g; b% x3 w6 i8 z
ARMIPS命令行用法:
) l9 c! W) Y$ M8 d% m& L- G2 m3 P8 a* i2 ?* H
Usage: armips [optional parameters] <FILE>
; {  l. i2 b( z. G) M7 d) X, K+ z& n) s  [6 m6 C; U. s* X* [
Optional parameters:
- u) n( \$ n3 B8 e+ ` -temp <TEMP>         Output temporary assembly data to <TEMP> file" o  s: f" W! |
-sym  <SYM>          Output symbol data in the sym format to <SYM> file# X! E% h8 Q. T) J! q+ ]: ?
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file/ G+ d$ [3 {4 A3 f* A! C
-root <ROOT>         Use <ROOT> as working directory during execution8 K* U$ V! ?4 |
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
. j" N5 K( Z# L- {) S) y  d% z -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code% a9 S5 v$ i. }  X- _% D% D
-erroronwarning      Treat all warnings like errors
+ b! a8 x4 g$ [% a* A7 d  K/ W
% Y* p& V8 W! V2 {File arguments:1 T! O3 E, N. P* |# f" C
<FILE>               Main assembly code file. l% B1 I+ r( M  @7 ?+ i( [- C: n- ^
& `, c6 V2 Z" ?# _' ]; _6 A
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
) D# m7 b3 |% _-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba  D: Y+ K7 ?* H2 R3 R" z/ i* M
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp! h0 O& a/ x- y) X' [
-root <ROOT>参数是指定执行期间要使用的工作目录# p7 w& U  o( q9 y5 i
-equ <NAME> <VAL>参数用法不明4 e8 z" K! e. ?+ [$ D3 e2 V
-strequ <NAME> <VAL>参数用法不明
, t2 R. B) z% d' {-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译. @% _5 {3 U6 w
: C4 e* _$ s8 Z! E* }
<FILE>是汇编代码文件,可用记事本之类编辑  I$ X6 }' a3 L" s6 |5 F4 e

0 Q; N$ s& {$ C, j( ^& t' V4 |注释说明:
6 H) `  T8 X5 @" F. m( O$ k) B注释可在单行指令后面“;”和“//”添加& ]4 x) K1 z( F6 t, d
“/* */”式也接受6 U( v9 A" R/ [4 f8 O  {2 c
/ b0 [/ c) v- M- y. v
例子:
1 n! n. g, E5 K" S. S: b7 b.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000007 ]: y* N. Q; L- D
% \! ]7 e# m, I3 p  _
.close;/*关闭文件*/
4 J8 Y* B, t7 }
/ L! S, ?3 {4 J! q5 [- R标签说明:
+ J1 H. j9 J0 P( g2 M# y; k标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
" X5 O  z# {  @" N1 G3 n
2 N( i' B9 ]1 \% p% Y数值说明:
! s: L0 ^  \) I9 L0 V; @; c“0xA”和“0Ah”是16进制数值
: Z7 A1 j4 w9 x- ~' A! j0 C“0o12”和“12o”是8进制数值
! D! @( R0 D0 O' w0 @0 L“1010b”和“0b1010”是2进制数值
, d* ?5 T# ^. H1 _/ W9 Z& q% E1 D: h6 ^
equ说明:
& u, e3 A; p& \2 B1 E. `格式:text equ value
, u; E: C3 D; i4 N/ k. r* K说明:用一个text代替value
" F8 k  i7 b/ y; Y例子:/ @7 z6 {  m$ @3 g$ u' O
address1 equ 0x12345678. D" S" c3 b8 D6 {
ldr r0,=address15 l: R1 V8 \: c8 W: X6 l1 g
.pool
. N; r4 R( F+ {: l  y
# Y4 a7 B$ p; M# `函数说明:# D  q  x$ i- q% e# T
$ i) o/ V9 v- V8 z  s2 T1 f
.open函数:
! h3 z# H! h1 W# ^格式:
4 ?7 }6 l1 O! [.open "ROM FileName",offset
& ~6 U+ {- _8 U.open "Old FileName","New FileName",offset
% [0 c1 x1 l( [' p+ l说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。3 u) H% H+ q1 }4 k' I4 v8 m

) k" N; f7 N" p9 f6 [例子:$ ~4 K9 {& R! B9 W) e. f: v  c( i2 ^
.open "1234.gba",0x08000000, y3 ]$ U+ M# O; p, T. l( @/ v
* X' X. w6 d6 v9 X
.close函数和.closefile函数:( s! Z) S6 {9 F  P
格式:
9 O/ b# ]3 E4 \( ^.close2 H. r. I# ^5 T3 e0 d
.closefile* }5 j+ e, S/ N. X  V+ z
说明:关闭文件。
; M4 ?9 F4 A) u& v. v1 V* o' U* W# t3 Q$ i; b
.org函数和.orga函数:
5 q1 }: s( M1 M格式:! J& @7 u6 R$ ~4 k6 g
.org RamAddress: E1 {2 q4 j% L/ Q
.orga FileAddress
/ Y( F$ |/ F, u" j7 @: @: g, p; @" o说明:
6 Q5 W; Q" M/ A前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
4 C/ O2 R0 K2 C( E( h
( J! j' K2 t, |" X) Z8 f4 A.orga函数可指定ROM文件的输出地址。% L, S1 x9 p9 g" [% O3 y5 m

- ?' s2 A( l! p. O/ V+ R.create函数和.createfile函数
2 A9 x- @; F+ ?4 Q格式:* ~6 j+ f; F2 i# u; y' t0 C
.create "FileName",offset: i8 p  R/ f$ n" n
.createfile "FileName",offset
6 Z; ]3 E3 t2 d; |说明:创建一个文件,如果文件是存在,他会覆盖掉。
* i8 f6 [$ W5 t8 b; d# x; D4 N1 N8 t
.area函数+ p- T- [& T2 [% V$ g, }3 J
格式:
, I: D8 a" i! b. f. F  ]+ t+ v. u.area SizeEquation[,fill]( p, H+ d1 p+ |2 ]
.endarea
. ^2 G( u- u4 u& _3 A4 m% r# d0 `说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败0 M( k; w( z. F
6 T  e4 Y3 @9 Q5 @0 U; \0 s
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据: A+ ~9 Q5 b2 V7 l$ Q/ i2 \  T1 c
org 0x100
- t4 I4 M" F* F& s5 J& N3 A% w( n.area 0x8% S" P8 f, x) }' j# b) R. E
byte 0x5,0x6,0x7,0x8! @& t  F7 P2 p. I( U0 ^4 n- d
.endarea
* N9 K3 e+ c3 M  O' a$ s5 f* d( z% P
.align函数  k  L% T) D  b) @1 N+ L# x0 `& Q
格式:.align num# m  `( t6 _! Z6 |1 L
说明:写零字节,num为零字节数量,用16进制表示。
0 k. m. c+ }& Z) a( D
- t+ a/ c! T# @/ p- I.pool函数
1 Y/ K/ ~- h7 S* ~- J  o) w$ w5 o格式:.pool
0 Z9 E& m) \$ d4 S7 M* [说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。" a' `, i  Q7 y5 E& ]; Z/ j
例子:! a( X# W5 @$ a2 b+ E4 W9 j, r$ N
ldr r0,=0x12345678;
3 s! U& v" g. [1 B2 p: ]....
. s3 e. V  u. H+ v5 [.pool9 g" L# }/ Q6 R0 J$ J
% [5 ]2 t; u' F4 S; L
.fill函数3 [" _9 u; @5 a0 `  e1 y
格式:
. _! G( E0 q& G8 T6 S' o.fill length[,value]6 |; x4 z8 u1 n  _6 r
defs length[,value]
, z6 E6 ]+ \2 O6 h' F7 L( d说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。1 X* A- G7 ]5 z6 t0 ]' X
$ V% Q- j8 _- o; C: j$ I
.skip函数:4 @" v# m9 q% v, f, r
格式:.skip length
+ r% P7 q$ |( s. Z& m& `" }说明:跳过指定长度单字节数值,length用16进制表示。" D( Y: Z, C7 t) h9 v  E  q9 H1 x
, }; E! j% D0 K$ A# T6 S
写单字节:
# L8 c  }4 O( D$ X! y0 F.byte value[,...]2 |! v, w8 g* k6 `
.db value[,...]4 O. |" S0 q4 l, t
.ascii value[,...]: J2 S! [9 n* W) F
.asciiz value[,...]
. U5 U1 s+ C5 Jdcb value[,...]: h) M& f0 s8 o" c0 }
" N1 q  l, u; ?3 }& U4 L' p
写双字节:
; j# M$ I9 G* S, o6 E.halfword value[,...]
& U7 e/ S6 d1 t9 P/ K2 w- u1 c.dh value[,...]6 L1 y% S& `0 B7 ^0 s1 R# r9 M
dcw value[,...]1 m& W% o9 r9 D" K# N8 O

/ s: b' I& ?& V8 M2 D写四字节:; p! I5 k. o$ ?! }3 }( |$ n, N# l6 I
.word value[,...]
. f5 B* n. n, b; w# J6 n0 V.dw value[,...]
8 q( ?( V  x8 Tdcd value[,...]
# T, c# M$ a5 |  q( Q- ?  k6 P1 X- @! f1 I, T) n# G) d
写doublewords:/ ^$ x. ]8 M. P' E
.doubleword value[,...]0 r! K; X* c5 ~, O
.dd value[,...]1 P# _: {+ M) ?8 n. S, p
dcq value[,...]
9 L/ }$ V# {" `9 ~( \& Q
" F0 P( j/ T' M, \# T$ p' k2 U写浮点数:5 R+ p4 n% \5 a: V
.float value[,...]7 t- n1 y& s" I- w5 y
.double value[,...]
* I! R6 l$ R" J" _: y/ |$ g( c& O
* J$ N. W$ d/ \ARM的ARM模式和THUMB模式定义:
- k" _+ W# o/ x6 ]9 v& T( z.arm|ARM模式, B% H; [0 Y( w
.thumb|thumb模式2 C1 ]9 \; t) m- {9 J3 [

  u7 J: N$ k7 c2 @& N设置架构:
( q0 a/ R. }( S; V/ z' \.psx|PlayStation 1(MIPS R3000)# }9 M! H  P9 U
.ps2|PlayStation 2(EmotionEngine)7 l; p9 h% Y% F7 |
.psp|PlayStation Portable(Allegrex)
- H1 B1 F: V' ]& z" g6 |* _.n64|Nintendo 64(MIPS R4000), V" \1 U) w; B* |3 E7 C3 @
.rsp|Nintendo 64(RSP)% E9 I5 |( `/ L9 t; u
.gba|GameBoy Advance(ARM7,默认是thumb模式)
; g% O3 k# U" M8 z6 @.nds|Nintendo DS(ARM9,默认是ARM模式), G" ]  d0 H" x5 m% n' B" S; ?# E
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)+ ]5 \& I1 p) {3 p: o
.arm.big|6 v$ O& \; J9 l- d, c
.arm.little|$ H6 i1 U# E( C; Y( q- }% s

& r0 Q8 I2 x. N! A/ m6 j( Q% N常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。+ o  O% t6 @3 a1 y$ B
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-2-4 01:34 , Processed in 1.094727 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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