EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1979 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
4 V5 `8 Q  t* d9 k" L! D, o
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
6 R5 B+ Y$ t. C& \1 e3 }. E. u; _4 D% v$ F
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
/ r& d3 A  `: q- Q' N* l9 @2 n- r* D
- L" U* ~4 y) p( tKingcom's website:http://aerie.wingdreams.net% k- U" }+ r# G! e- t
8 R6 m  R% c2 H9 a! a
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得$ z& y5 O' Q& i

/ E" c& y0 n; {4 ~% ?更新版本可去http://buildbot.orphis.net/armips获得
3 f% n! A6 C0 W; y, w3 r' a7 K' f: I: m8 G1 a5 s
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。: z6 Z5 z& M' D- Q7 h
6 V8 I& l% P# K8 {: ^8 i$ J
ARMIPS命令行用法:
1 M9 @* L9 y2 G6 E% s) {6 x3 F- b* a1 Q( A  _
Usage: armips [optional parameters] <FILE>
2 H1 Z7 i+ c. S/ M
6 O5 Z' x/ ]4 {# kOptional parameters:
1 g; ?6 j! g! n* g$ c6 \ -temp <TEMP>         Output temporary assembly data to <TEMP> file
! l& u6 @, W. p* w! K& {) O, b -sym  <SYM>          Output symbol data in the sym format to <SYM> file/ a' ?( F" o2 E* {& U4 u/ ]- ?: J
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file! M0 f$ |+ g# h" h
-root <ROOT>         Use <ROOT> as working directory during execution
* x& b6 Y3 X3 x -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
$ p; ?6 o- i8 R2 K -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code( T7 K' _, X% P) R/ X
-erroronwarning      Treat all warnings like errors
# g; b4 k% O1 D3 b; L+ Q* z7 I/ p2 k+ B" ?
File arguments:; T% t; b# M+ U$ h
<FILE>               Main assembly code file
, a; Q& O( Q; ]) D% a6 o  f9 }$ a2 }2 i2 t8 U- T/ ?
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
1 u: `, V! ?1 ~- d/ ~" z3 i-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba! y* P# t9 N+ C( k. g5 n1 [# [
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
; C( R" r% S" X6 e( H8 R" `; |-root <ROOT>参数是指定执行期间要使用的工作目录. ]" s4 f0 P9 s$ R! y
-equ <NAME> <VAL>参数用法不明
0 v/ o- z5 W# `9 k% w! O-strequ <NAME> <VAL>参数用法不明& b1 M+ _! J. B; o% @; N
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译  u0 q2 m# f5 ?* n" o

" m; x, p+ Y8 b<FILE>是汇编代码文件,可用记事本之类编辑
! d  x) F* N% E  _
* h+ V/ X1 O3 q  [' p注释说明:
9 d6 }  d& W* c) G注释可在单行指令后面“;”和“//”添加! z* M- e5 u  ^1 V8 q
“/* */”式也接受
% g9 Q* u2 c$ [. u6 M! N6 S( L  z# a" {# F
例子:* d8 ~0 P2 D3 x$ Q6 K2 v% r; e. G
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000' `; X( Y4 B1 |' j

& d1 _. I4 W& E/ v6 b- |6 v/ S.close;/*关闭文件*/3 M" N- b8 x" d9 B3 O' |, @% ?
  A- K" B. ]  g9 S! O+ n
标签说明:+ s2 I/ L* ~( C. A+ b( G
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。+ e; v- D+ b# y+ N5 T
( j' r7 _  t- s. w0 K5 c% S
数值说明:* `7 V& ~. l/ x/ f  V' b" N
“0xA”和“0Ah”是16进制数值& H: f  m6 Z8 T0 Q+ S3 H
“0o12”和“12o”是8进制数值) ^+ F7 q4 D' P$ c" H3 W
“1010b”和“0b1010”是2进制数值
2 x2 X. X1 i4 ^' c- W1 A9 J! R" h2 n
equ说明:; s$ O; h+ o1 a: L7 d( q
格式:text equ value
0 u+ x6 w: l" ~6 R5 N说明:用一个text代替value
" y# |( v) O1 G" F8 f) T$ g例子:! D% n2 s* k4 G
address1 equ 0x12345678) q  j+ C, ?$ q# M, F4 @4 R
ldr r0,=address1
7 l( W6 S6 S: K3 t! i* V! u7 S.pool
2 q) `0 ?, q3 z) c# C! X6 O( |- P+ ^9 _; [$ v
函数说明:" E$ t4 ?  P2 Y  ~7 k

3 Y  S+ e% |0 ~.open函数:
) i" ]$ \9 P1 E) X" D格式:0 T! O7 P, X$ t" F' l
.open "ROM FileName",offset& N& V# x* Z' l* s) H! x' Z: }+ |
.open "Old FileName","New FileName",offset
8 O" Y" x1 T2 h- U" ]: S8 f  g说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。5 l; d% ]) p# O2 X" |8 x. a2 _  D
1 _3 [; s5 ]: C8 t4 F5 Q8 P
例子:
' O! s3 k  l$ M" _1 I.open "1234.gba",0x08000000
" k8 p2 e: [/ {% [- N9 J5 }0 i" Z  P4 Z0 ~8 E. I2 k5 J" g; U6 Y5 |( D
.close函数和.closefile函数:6 U* k9 O) I) H/ z% |  [! A$ t
格式:8 ?' I5 Z& _0 P
.close
+ n1 E- }  X/ z9 |.closefile( E7 f$ O* h5 W
说明:关闭文件。% t( U/ ]% b# c" m3 n# w0 F6 ~1 Q
, Z! l9 U& u' k. A( x  _
.org函数和.orga函数:
- |8 b; C/ E5 m& J格式:
# R# R4 n9 Y! g* X+ X2 x$ L.org RamAddress
% I2 I( V% _) s.orga FileAddress8 N$ p; r) r; c5 K) |4 X1 b
说明:8 G( Q- f; G7 V2 m
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
4 L+ H8 x* A; V9 z8 @  q  G. J
# p1 y0 G6 B1 }  I) M0 B.orga函数可指定ROM文件的输出地址。+ P0 d3 R4 \* v/ F6 r! M
9 B8 {) x( _- K. L/ o  u) U  L
.create函数和.createfile函数
' ~/ G% X# T& G/ b格式:0 F$ f. H2 t% w) g- u# r- E/ D& _9 h
.create "FileName",offset5 W8 G. [% B, X. Z) p. }" d
.createfile "FileName",offset) F+ s/ i; }. C2 H$ s
说明:创建一个文件,如果文件是存在,他会覆盖掉。4 D- z+ e6 U4 `
! F& z: B& A2 f  l) {
.area函数
# |7 ?! a3 N& D  H" j* s格式:8 M8 {7 C" a3 @9 d2 Q# E& @
.area SizeEquation[,fill]
9 H( x$ A  p3 K* E/ x+ H3 e.endarea
' w8 q# E0 V- D% a; Z8 i1 u说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
" v& j; @. D6 P0 ~5 s+ n) U
  ?. O, U7 _" I' H0 `6 n  `8 ~例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据3 k% Q$ t, q8 w: q( Y8 k$ S
org 0x100
6 B" D4 ]. |* j; I$ _% s6 @& f.area 0x8! L# `2 |" R* z) |* z: y1 {$ t
byte 0x5,0x6,0x7,0x8
9 j3 ^4 G7 K/ t- ~2 Y$ }5 h9 F2 ~; w- |.endarea0 {6 G9 q, G4 R, J  q  p0 Q1 }

% g1 y. `7 N0 O: J$ K' |$ y.align函数
7 i" R  R" ?% \格式:.align num
0 J! A* M. t& R0 h说明:写零字节,num为零字节数量,用16进制表示。. N4 R% W+ S3 {; |9 p1 C+ k/ C9 V

/ t1 k6 |& [( _$ K; N4 K.pool函数8 U. [6 ?3 E% H# _* J% h+ p' m
格式:.pool. G- k$ O6 @$ y1 _& [
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
4 m" P9 `3 D7 @, a' ?5 B例子:
+ }( Y$ P' G9 A: bldr r0,=0x12345678;
) e2 \8 R5 J9 v9 `8 Q....0 k% P% u, K5 d+ |- T
.pool
  q( e! L: L" I: M; F) G+ m
* G: L" v2 r$ K! N% v  g.fill函数
' i) o' X; Q9 C' T+ T格式:
" P1 s# f" D+ u.fill length[,value]  J7 e% [9 y. O0 ~7 I6 z# f* ?* y" q
defs length[,value]  D7 v4 x8 i1 l$ l5 |
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
, x, x5 x( b! i- W6 ^0 P7 ~* J* M& `* ]3 g
.skip函数:
0 U# G7 r2 V2 [( }) C格式:.skip length
- V% ?5 J& l. k- s' v说明:跳过指定长度单字节数值,length用16进制表示。! ^! Q5 a) r& L, t. `4 _/ O

0 k: m- z; H6 {( c# C写单字节:
  U+ L. ~, m. t" w- h4 T6 H1 U.byte value[,...]& x+ Q$ ]9 y  g3 c7 ]
.db value[,...]- `  S& a& M7 v, `/ g3 F
.ascii value[,...]' ]+ d' ^0 j! l; _* }% X! E
.asciiz value[,...]$ R' ~1 ~* p, M: X
dcb value[,...]
3 J9 v2 ^5 H$ ^( {2 z1 E/ l' _
& f3 e! L* u, y: Q6 M写双字节:9 T0 c. `) w4 U3 _- E  J1 [' b
.halfword value[,...]5 Q# L$ l7 ?1 a; B* ?: i
.dh value[,...]
1 |8 G. A% H. I/ a* idcw value[,...]' o0 C2 y0 @7 C1 l. F2 X2 [

: r2 N9 q5 ?. R+ ^* u# V写四字节:7 r  J: i' {; y" o
.word value[,...]
9 U9 C( R0 u6 ]* [8 x.dw value[,...]
4 S. R$ X5 s5 `& B' D* tdcd value[,...]
3 j2 ?" J, y7 M3 `& i) A5 W0 h4 i
写doublewords:
- F) y0 m& b) B1 n.doubleword value[,...]
1 V$ g. S* |: ^' X6 i" h0 F.dd value[,...]
6 D1 o" W. j0 z2 i7 N4 _+ zdcq value[,...]
6 y5 u9 S( G( U, |1 ^# ?
. \+ b" V, I! a' N4 N0 l写浮点数:, s# O& v8 l. r7 O
.float value[,...]
) T+ b; m9 J  F2 {.double value[,...]
. H' Z  ]7 Z* m5 g9 }: `+ A/ K" y6 s2 Y$ a, J9 Y
ARM的ARM模式和THUMB模式定义:
/ H5 |/ |7 m9 n.arm|ARM模式
; y5 Y; O2 @6 N7 L4 _& _.thumb|thumb模式6 h! i% r1 S% Q) I: w7 b; I+ _1 o9 C
3 `( ?: l1 a2 d" U2 q
设置架构:- p' R1 g( v' t: s7 q3 Z2 z  c
.psx|PlayStation 1(MIPS R3000)
8 L5 _( D: V7 E9 o' l.ps2|PlayStation 2(EmotionEngine)  }! Q' g, n/ _" n/ J+ I
.psp|PlayStation Portable(Allegrex)
) Q( t" |7 s0 G" j( n! z.n64|Nintendo 64(MIPS R4000)8 t5 }! \) l! w' Z! V9 G
.rsp|Nintendo 64(RSP): Y8 d4 @3 O, H) {
.gba|GameBoy Advance(ARM7,默认是thumb模式)% I1 x+ ~6 c( g) j% T# s% \
.nds|Nintendo DS(ARM9,默认是ARM模式)" r4 a$ A# E% y; p  m
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)7 x; T4 W% ~2 T% {
.arm.big|
0 Q# L5 ~) k9 p% H$ D# T.arm.little|
8 T- N. B) y7 [8 S$ E  |* ]. u% T4 A* p6 C7 C
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。4 y& P( D+ q1 B, r1 Z1 v0 A, F
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-15 23:10 , Processed in 1.074219 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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