EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2051 天

[LV.Master]伴坛终老

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

# M1 l$ N! [2 Z! lARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
8 v4 l7 ~. y! g$ r! k
% f8 z9 P, a& y# \; w- J" LARMIPS assembler作者是Kingcom,目前发展到0.9版本# J/ W3 `; B) H& }" s

( d1 X8 {. r0 s  dKingcom's website:http://aerie.wingdreams.net
" |. }( w' K: j2 i" P' d* ?9 X( Z2 ^8 i
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
3 g) {; n4 v* S; q7 v  G% l/ P/ m' e7 n' }4 z6 U: ]8 L
更新版本可去http://buildbot.orphis.net/armips获得
/ i* ~" M' c2 C1 j! S* C
2 @$ h* W- _1 r4 bARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。/ y+ `" [& M( m
0 Z( Y, D) B5 z2 m2 z' V2 W
ARMIPS命令行用法:8 y9 c. M. w: {0 d7 J, ?
* c. e0 E* I, I+ d- g
Usage: armips [optional parameters] <FILE>
) j/ q, n- j$ F2 g1 k, ~- z
6 B$ C# j( [, a2 s3 L( R' F, r. d3 ^Optional parameters:
6 X: r/ I# b. a8 c -temp <TEMP>         Output temporary assembly data to <TEMP> file
0 j" F1 ~$ v1 J' t -sym  <SYM>          Output symbol data in the sym format to <SYM> file  h& \: n3 Q2 j& T1 w1 M5 E6 l7 c
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
+ ^$ q. w8 a3 ]( E -root <ROOT>         Use <ROOT> as working directory during execution8 R# ]( R; ?# G1 M; y) n( A' w" b' D
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code/ w# j, i0 S8 z
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code' m* _6 F2 d4 a) `8 Q, G
-erroronwarning      Treat all warnings like errors
# }9 |$ V7 }- \" H" q6 ?8 {% i  ~4 p# |) a2 @! Y# y1 b' p) Y/ ]7 G( M
File arguments:
& Z* _1 a3 u. Y) f2 ? <FILE>               Main assembly code file
3 v; e/ t+ x8 N# Q& m9 ~
# b4 G) E/ x+ u) Y8 u* S& v-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件4 b5 k" Z( T- G# n9 U
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
/ x; e" @9 Z! \+ X7 Y' h9 \-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
, `& x  q+ ~) b$ s2 a-root <ROOT>参数是指定执行期间要使用的工作目录
7 f# m  H- ]2 }8 E: S: W-equ <NAME> <VAL>参数用法不明
; ]1 F1 {9 q/ B5 ]-strequ <NAME> <VAL>参数用法不明! F# j" A: L, j* V0 z
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
( N2 }" C, R% f8 k$ E0 s! g+ m0 T, I9 ~% j6 g+ @
<FILE>是汇编代码文件,可用记事本之类编辑
+ u* o( [9 S$ U
9 r: p8 N* Y' R- H注释说明:5 t! @' m- V/ i3 W, C) H
注释可在单行指令后面“;”和“//”添加
. D5 w! q) o) r* ~" d/ F# g# @“/* */”式也接受5 A/ Q0 u" A4 d& s* f$ ~, v/ P3 U( P
; N6 t: C8 {5 b. f* k" h7 O
例子:4 N9 {0 O8 l3 m
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
/ J; d' }* d2 _
& k. M8 m5 v) ~2 r) S.close;/*关闭文件*/5 r: w8 i# r+ ~7 e

' G4 Y5 G) J$ k. K/ r3 u标签说明:! L. N) w+ [$ J3 l1 \
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
6 [, _9 K3 b& i. q) h
( ], P  K4 P& b数值说明:3 N4 I( J* Z4 z. K
“0xA”和“0Ah”是16进制数值
. i. i& |; M4 |/ |: D* c3 x“0o12”和“12o”是8进制数值- k: Q! B$ [4 D. Z0 s
“1010b”和“0b1010”是2进制数值1 W9 w$ @! {: {! H
4 n. z9 Y2 k+ V9 r! w
equ说明:) n1 |/ @* ~3 h
格式:text equ value
! [" |! @8 x7 _+ T6 ?说明:用一个text代替value
* `$ [1 ?# b6 U2 c6 o例子:2 S6 e" W/ G8 y8 _
address1 equ 0x12345678* i4 ]) B' M7 Z! x" r9 b
ldr r0,=address1
( Y% C" ~" [; e3 `0 T( i3 K3 @  x.pool' K2 n9 _1 }4 I& P0 s& P1 ~( u, m
2 X+ p: v& w% @6 F* i
函数说明:
; D- F  w6 D7 z: C; Y& @% t: m
" S0 D: z6 [0 M.open函数:0 k& p' Q4 _( g1 n$ W# }/ k
格式:; O( E* D( V# U6 i1 I
.open "ROM FileName",offset
& \2 h+ s8 e1 ~7 _( f; @+ U.open "Old FileName","New FileName",offset
! m8 J3 U" I8 Z, [+ B说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。7 F/ T7 u4 G4 o9 y: Y3 _

% \9 t: ~7 K: p- F5 [. u, q, U0 d例子:$ o) w4 b4 `& S! [" V; p/ H
.open "1234.gba",0x08000000! X. v( d3 T* n  j

5 {0 B- f! n  E+ Q% n  m.close函数和.closefile函数:% i' k& [- U; R; d8 q! I
格式:' |! X& \5 |8 B* L2 z+ _
.close: t2 q2 h; E; e: {1 h% t6 N8 M( {
.closefile1 D. J& e0 ^" i# ?
说明:关闭文件。0 P3 V# F; S5 e
. I$ o9 g) z3 E" x( E. ?1 X
.org函数和.orga函数:
) T0 x8 F/ h2 K, e( E格式:
* m9 a. p+ K4 [# \! Z0 d.org RamAddress
$ A8 l8 b( H5 s3 c3 z.orga FileAddress
& k- x4 @- ]) u5 L9 ^5 G2 w' L说明:0 ]" X1 g' p* {: i6 J0 |" b
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。6 ?4 n7 Q* u7 S) J; N# L" C* n: P/ Z
( m* N, ~* J7 r0 z; k: Y; |
.orga函数可指定ROM文件的输出地址。6 A3 p4 s' c: n; Z4 K+ P) o

% O5 `# |0 I; j9 j  {.create函数和.createfile函数5 W4 z4 C5 q  _: A6 {5 z) @* l
格式:; L4 W: C* k: K$ I
.create "FileName",offset
  {1 s% y2 u' g2 |$ K- l.createfile "FileName",offset4 V: c( X1 M2 ~4 `
说明:创建一个文件,如果文件是存在,他会覆盖掉。
' [; c9 N; e! _7 K! U6 F& W9 u0 @$ J' c+ @& r  w9 h# v& n4 N
.area函数
' C" |& ~2 x4 P7 i- @# G格式:5 N0 u* X& V4 y+ y2 ]" m
.area SizeEquation[,fill]) v$ e% E7 ^1 f- N: s! K9 d- x
.endarea
$ @  Y9 t8 m: B  f+ y1 |+ U" }说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败9 F4 `# S+ Y. g7 p
3 b7 O: Z8 C8 N
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据! x5 p; p+ J2 ?( G) K1 I: k& ~
org 0x1007 s& G/ s6 n5 }2 e$ T  o2 J
.area 0x8
- X) n; i$ L3 p4 pbyte 0x5,0x6,0x7,0x8
9 M! z0 V% j2 e5 @) Q3 j1 v.endarea% |$ q4 m4 K  X% Y
% a  _: B$ ~: g/ K2 E% q
.align函数9 V% O) Y+ r0 s6 }* M
格式:.align num- k# H7 B) y+ m
说明:写零字节,num为零字节数量,用16进制表示。
9 E3 f: h: m+ q/ g" C$ X
; H9 ]5 i9 D2 j  {' @/ E.pool函数2 p, U2 A- R7 f0 x% n
格式:.pool
1 y2 t, a; h$ Y6 t+ c1 F. G说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。/ J" L5 a: l) Z7 p: J9 A3 M
例子:6 `; V- F8 x) |4 j
ldr r0,=0x12345678;5 N4 K% ^' |0 j, A- O# P7 s6 T% Y& E
....
; r" R# x& Y$ P- s% C' v.pool
, \+ T, h; C3 Z0 R" G9 T
3 S: D- \+ M8 b.fill函数' \8 R' A! N/ l, F0 h
格式:
1 H7 Y; [& Z/ X) h4 {! ^.fill length[,value]
$ B7 f. M1 ^# Y. c6 cdefs length[,value]/ U  V: O% q, }. s1 h, Y
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
6 O- u& C* G! C# r1 L9 h- l" s2 E0 h0 Z. P! k
.skip函数:& D/ e4 W- D5 N" f( {! `( ~
格式:.skip length
3 Z% r; m2 n: D3 o说明:跳过指定长度单字节数值,length用16进制表示。
4 r9 t' }- r, x
( N* Q% U7 K7 m! l: F; l; y/ Z6 d+ R$ u写单字节:1 l3 w) R; L& y8 p
.byte value[,...]1 w+ b; Q( x% M/ Q* d% t- e$ ?
.db value[,...]
$ K2 M2 e& \$ L/ N6 t) `5 G* M0 o.ascii value[,...]
9 M, d, \2 i0 |2 ?5 _0 h; R.asciiz value[,...]" u6 ^" v3 [3 z8 H, ~# g% G* J
dcb value[,...]/ G4 U8 u( \$ X

" [% H0 X: r  R. U' r+ r写双字节:8 c9 t6 K  Q$ \# S# L; ]
.halfword value[,...]
$ }( F3 Z* b4 B.dh value[,...]  Z7 \% U, d$ J6 l7 e% s
dcw value[,...]
+ L1 N* d- e' J" b
) ^3 i$ ^5 W8 w7 n写四字节:
( i5 `5 [8 W+ e7 h.word value[,...]0 d# _$ ^" q6 Y) W: Z3 X
.dw value[,...], C1 d( |5 v! p/ o6 J
dcd value[,...]. n) F- z% M1 X$ j# x* d1 ^

2 ^, [( B! ?" Y4 O0 h' C% I3 `写doublewords:& h! @% ]! ]: N2 p  e
.doubleword value[,...]
9 Q4 l' _. O$ ^$ B& t" {.dd value[,...]1 k# e' y) Z, v6 t3 @7 j0 b
dcq value[,...]
0 @; _( C" V" s: O9 }- W) F* \; ?% b/ ^9 I1 `
写浮点数:! X& Z2 Y( g5 b) U
.float value[,...]  ^. r: j* V5 C
.double value[,...]
' Q$ t0 v4 x- C  x9 {" M: d, Y3 t' h/ F* i- O
ARM的ARM模式和THUMB模式定义:
3 |& d7 s+ `1 i  Z  r% X- j2 V0 E3 U5 ].arm|ARM模式' F* z3 K! Y/ y5 w( t: V( l9 Z
.thumb|thumb模式
- S! K8 H! O# T2 l; {3 v. E' N, ]# p* h" A+ x7 A
设置架构:2 _0 T) }5 C$ I
.psx|PlayStation 1(MIPS R3000)' s( y- A' i! t
.ps2|PlayStation 2(EmotionEngine)" i8 T) T1 b3 ~; w
.psp|PlayStation Portable(Allegrex)
, L' X' g# a) O9 u$ K5 }" d7 ?.n64|Nintendo 64(MIPS R4000)1 g* R1 S- k1 p6 T
.rsp|Nintendo 64(RSP)
0 y% [; M9 N: O.gba|GameBoy Advance(ARM7,默认是thumb模式)) d/ W; s5 Y; e% e
.nds|Nintendo DS(ARM9,默认是ARM模式)2 ?; Z" {' u: n
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)" n, p( P7 ^! ?+ ~1 i3 r
.arm.big|
# H% n+ F! @3 [' {( R8 L* L1 u.arm.little|
4 P  f! {8 m' j& f8 w% `5 t$ p% N# z, ^; S, w
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。* E; {+ H2 Z$ x0 G$ u
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-26 08:21 , Processed in 1.069336 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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