EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2213 天

[LV.Master]伴坛终老

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

4 J2 C4 p( m" }2 n3 N" f9 MARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40003 l  \: w8 a2 O. z$ x
# ]" M4 d+ x. m! a
ARMIPS assembler作者是Kingcom,目前发展到0.9版本$ o  ~0 j! D8 I5 {/ F2 G

/ R8 p% ^# O3 A  g/ vKingcom's website:http://aerie.wingdreams.net
, Z/ _7 k4 h7 c' q# D! r- m. L& X: V, y# _; C5 c. b0 G/ ]
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
& g5 j& j' H( L
, o' m" Z9 ]! I2 c更新版本可去http://buildbot.orphis.net/armips获得5 M0 B; O- n1 D! v# ]& E' [
2 p7 j5 E+ M! X0 I0 o; D; A7 v
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。* O5 H6 v% ~  p# S( W8 k

6 ?3 t& j* x  \6 FARMIPS命令行用法:  s9 f- D' U# w( o0 Y! J& ?2 b
1 }& Y* w3 \; N. K
Usage: armips [optional parameters] <FILE>
& ?' T0 h1 l, P, ^( ~9 r. ^
$ C3 H( o* {6 s9 ?  AOptional parameters:
/ o- k! f7 P3 z& P& e) j2 T; r -temp <TEMP>         Output temporary assembly data to <TEMP> file5 _* d: ?& r4 e% |
-sym  <SYM>          Output symbol data in the sym format to <SYM> file6 [4 t, U& L  t" S
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file, e; t5 [7 r0 e, ^) O  K0 J, Q
-root <ROOT>         Use <ROOT> as working directory during execution
( i7 h+ d6 t3 t9 |' X -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
! U; _% X7 r# B' @0 g -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
: n# k4 ?1 T8 H/ t8 B -erroronwarning      Treat all warnings like errors! y& V9 P% j+ g% h; l0 l  r5 ?

" `9 |6 Y, o; P( M: uFile arguments:
1 n0 ~& l  ~+ r7 z4 z. Z* |5 M& x <FILE>               Main assembly code file1 V- P# e) d% k$ P9 f
* A( w6 C3 S+ `- f0 ^! x, r
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
2 s: k8 l- N/ ^2 _. D3 z-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba8 J/ [' t* g6 r# m  z
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp  v# Q6 @0 E3 N2 \/ C. ]3 h' N
-root <ROOT>参数是指定执行期间要使用的工作目录/ b- w0 N& ^# r4 a" [
-equ <NAME> <VAL>参数用法不明
0 x5 C- ]( [" `7 [' z+ ~+ p-strequ <NAME> <VAL>参数用法不明& F2 z% K6 A* l$ x
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译: t+ N# V' _" {% |
9 w8 X' G4 @7 j( `
<FILE>是汇编代码文件,可用记事本之类编辑
$ K" V6 t0 u, s6 D* {8 G; |3 V/ y0 A; T
注释说明:
, g/ U5 k7 }: I7 F# n注释可在单行指令后面“;”和“//”添加  Z4 t. r- }9 D$ B* H* K/ N# v
“/* */”式也接受% _! A9 w/ U4 |; h
! C3 B- C- _9 F+ \8 w
例子:7 m5 R) g- a- {* [# Q
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000005 T: N! X1 }1 S- o

, T+ p, \  u& V" x+ Y( L.close;/*关闭文件*/
" E: T& Z2 q3 |( w! R' }3 F" w
* x2 o0 `5 G9 H3 \' g标签说明:
& d  Z3 s; M1 l& c0 c. V& R标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
( l, k3 Y; u4 A( ?. s  V* r' y$ q
# u- n1 \0 r9 u* V. H  q数值说明:
- C0 }) I  z+ {, z3 U, O7 K“0xA”和“0Ah”是16进制数值9 z9 [: i! Z9 U
“0o12”和“12o”是8进制数值
# q( [1 j$ x, Q6 h“1010b”和“0b1010”是2进制数值
  l/ z' U* u  W/ W7 Z' H5 f) z4 [+ ]7 w% [' b' v$ @! q
equ说明:; t2 f! I" Q/ y, Q% t4 O
格式:text equ value
! d8 _- f6 `2 B说明:用一个text代替value/ d4 Q$ ?2 C7 h  @0 T: C' U
例子:3 b2 f# [) t' D  t7 N
address1 equ 0x12345678
  I6 Y  f5 _3 c/ U' }- l' P) dldr r0,=address1: o, @' m4 q6 j% h: [& [4 [* F
.pool
8 P# f5 ]) V# n9 n/ Q- v+ S0 r& M# m/ M' X  ]9 [
函数说明:
7 j- M' p6 D" {
5 e% R; T5 m) U.open函数:
2 `4 f9 T, ^( {( G6 A1 r/ t7 i格式:% M# b/ n( q1 A5 G' q' `* _
.open "ROM FileName",offset  l6 G" |2 g9 P: c$ q3 y
.open "Old FileName","New FileName",offset: i7 u$ L0 z2 G* Z, P) q  c; q4 S" }
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
4 J5 f/ \% B* G* z! {1 s) ~# o: P  K5 M* K+ c7 P# A& p( _
例子:
3 \3 E5 V4 P& ^( ]" x.open "1234.gba",0x080000006 |4 ?. d( W1 Q/ L) }
: O# u9 y7 r, _4 {6 }% Q" {7 N
.close函数和.closefile函数:
! X7 J4 P1 V! Y格式:
* X# Q7 n) `$ S6 u.close
8 H0 ]) s. Q4 p; u/ O& Z+ I, w.closefile) k1 J) N5 Q; J
说明:关闭文件。
! p/ Y( [2 X2 [/ d2 e3 v) w% ~" ?' z! u
.org函数和.orga函数:
1 m9 o: b9 G( s: D" T7 K7 g格式:
) `8 T) K& |9 b5 P# C.org RamAddress
( i- N: r% m! [2 b: X# {.orga FileAddress
& M& o& [6 }; M! |+ \说明:5 o5 `/ P; @  f
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
! e# M  Q$ g. E! o2 t) x# F3 L
% X+ w3 Y! r* V: u' z.orga函数可指定ROM文件的输出地址。! i7 M# Y" E* @% @6 h. {: L

$ c8 y. B: m/ I5 A2 j( c5 R3 ~' k0 H.create函数和.createfile函数2 O7 e. x6 ?$ Z$ }2 m) X+ ~# D
格式:3 i- `2 h, `/ v3 s. L
.create "FileName",offset5 k7 q+ ]0 M: ]: I
.createfile "FileName",offset2 A1 {( s- }: |0 U* R6 N
说明:创建一个文件,如果文件是存在,他会覆盖掉。
3 @. z: |& B/ j1 E9 e! w$ M4 v8 N6 h- _8 f' e" M/ H/ T# ^
.area函数
0 c; a! B( Z& F格式:
( D$ @1 i) O" H9 W' H2 d.area SizeEquation[,fill]7 r. q# v( l- M
.endarea
; J" [8 T+ w0 ]. m$ n说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败- Q! G- H* W1 t2 B( x5 A
. N( c1 K0 d, Y0 f/ A
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据" H/ r) s+ _- ?) E* a6 [/ O
org 0x100
3 [0 \- X1 }. R( O! T4 K3 d1 m.area 0x82 C  B* F7 e0 d+ U0 g
byte 0x5,0x6,0x7,0x82 A! k1 y# v" m- h
.endarea4 w( x) V* `$ `4 g  v
. q+ u. S- ~, m
.align函数
6 _+ i$ ~) t* P- R8 P4 L) N格式:.align num7 B) I, N8 P7 \4 w% b3 `2 \
说明:写零字节,num为零字节数量,用16进制表示。
( x+ I/ g, N+ B$ S; a5 Q) Q$ Y% ~' ]( @' a- g9 V
.pool函数
6 b& f. }% r1 n& r5 @: p格式:.pool
8 H  O# a; l7 r* _$ o* [$ S说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。$ I1 z$ q. W2 ]: {/ s. B
例子:
: t/ |& F. ]; k$ o# V1 E8 Y0 eldr r0,=0x12345678;# P. _0 @4 V; E, u$ m
....8 J8 G: Z0 L/ N" x7 O: t& b
.pool! P: l% ^3 [5 G

$ v: @) @. B% I. `.fill函数
/ s7 w% E2 T0 I1 x! ?$ R格式:
( k, S, k* ?+ q% x.fill length[,value]' e5 C) Q  M' i, j8 u$ X
defs length[,value]
6 m& I# a3 w' T  s4 K) x) O$ z说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。! E" t2 u3 Q: ?! M" i) T* d, V- @

' {3 u) ^, Y5 r3 H( \1 E.skip函数:
. R* Y9 J. C- z  Y. c格式:.skip length! [, @8 W( A3 |7 l0 L  E
说明:跳过指定长度单字节数值,length用16进制表示。
4 v, |% O/ n0 F$ b" U
- }' R! ~; o2 [; A) F# O% N; i- ]写单字节:( |8 h2 X9 O$ a( _: v
.byte value[,...]/ j4 r9 X8 }& N) K5 F& U+ e% m
.db value[,...]
* `+ a- L; p7 G.ascii value[,...]
* T5 l3 j# \2 f1 [: j/ r( r. c.asciiz value[,...], ~( V0 X2 D/ C% \) M
dcb value[,...]
9 x6 Q1 Z/ [$ X4 v# c  x; c+ `* s: j/ i+ ^
写双字节:
" e" I* m8 W# g9 g8 s) @# a.halfword value[,...]. s( R4 J! Q6 C! m/ h. q
.dh value[,...]9 c0 M. B- W% k. k+ `
dcw value[,...]
* E* \, M! r8 n; A/ V  R# O) V6 z; }7 L- G# b0 X
写四字节:
( s' m7 A$ R3 E.word value[,...]0 [" y* f2 e( ~4 Z/ L& F
.dw value[,...]( X9 X8 M; i. l7 O! L, t
dcd value[,...]
2 n  n/ D1 A/ F. t. _5 H
3 x3 m( e! K: C写doublewords:0 m0 q, Z: d3 r
.doubleword value[,...]( |  J' E, L) i9 w+ P' @9 Y" K
.dd value[,...]
3 P9 {* Q5 Q% x; \! odcq value[,...]
6 e! D$ h0 s% C! V0 U7 n8 `. r
; M  t- ?% e8 n3 Y0 \写浮点数:
, i' L. O7 m' c0 [* A- t/ U.float value[,...]
* W) Q. q! m+ x7 Q.double value[,...]
. E3 |* `# V* h. x) P; i) y# S5 _' h  X7 ~! I/ o
ARM的ARM模式和THUMB模式定义:. j6 c0 B4 ]! ?/ u8 M( b
.arm|ARM模式
8 W! R7 a9 T: y" \; E( o& r.thumb|thumb模式
$ ]$ n5 }. o; l7 c5 r
$ l' O" X! [+ z" W; J  f1 @: Z设置架构:9 X1 B' t# f( B
.psx|PlayStation 1(MIPS R3000)( ]! L* k0 W& x
.ps2|PlayStation 2(EmotionEngine)7 \- x8 T: j0 e0 G
.psp|PlayStation Portable(Allegrex). P2 \" ?" {- P, T
.n64|Nintendo 64(MIPS R4000)
7 H- Q) Z$ J1 b  w  t; S& T.rsp|Nintendo 64(RSP)
' q- c+ z; _9 I* R.gba|GameBoy Advance(ARM7,默认是thumb模式)
! e7 O2 {# _% }& Z- j' }) j& w.nds|Nintendo DS(ARM9,默认是ARM模式)" b/ u# p1 V: g0 {
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
, K1 q2 P& L$ V! o2 {5 H& q  k* j.arm.big|( Y; m/ @2 Z; C% V/ s* W/ j4 p0 `5 D
.arm.little|
9 d+ i* w" V; _1 z
6 g, R  I# u" H- |, {) b/ e# f常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
0 t% z" I( f& W/ M% r; K5 T
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-2-5 03:14 , Processed in 1.151368 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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