EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2029 天

[LV.Master]伴坛终老

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

- E( R1 h6 u' j+ f' X- jARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000* g/ ^$ j  t; }1 e: {9 l: R& |
# v3 k: S3 S' i8 C
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
" k2 `' _( O4 Y5 t! Z4 {$ P0 ]7 q& F; I9 D  o% A0 M9 I; h
Kingcom's website:http://aerie.wingdreams.net
/ Y% {- ~* b  n" ^# W6 v
  a8 ?6 G/ Y8 aARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
, ^# A' }' Y9 k  R8 j% l
9 A3 p# e: i# \, g6 \7 g0 e更新版本可去http://buildbot.orphis.net/armips获得
/ v5 q+ k- r- T6 ]& M% i7 ~% |" a/ C4 L: b7 x5 u+ `
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。7 L1 o% d# v# i! ^* O

( r- [5 [* M0 [ARMIPS命令行用法:3 a) L6 l! }2 N! k/ U
; ?- x, i* O5 J  a
Usage: armips [optional parameters] <FILE>/ e  ~5 c. Y  W! q! N, L" d! K1 i$ l
" v) _* j+ U+ Y" ^% Y  z
Optional parameters:6 k5 h$ b; v0 e) J* H/ j/ [' l# f
-temp <TEMP>         Output temporary assembly data to <TEMP> file
/ Z& s# k* m$ m+ K* e% N$ w -sym  <SYM>          Output symbol data in the sym format to <SYM> file
3 j- H/ Y+ E3 f0 n: ^4 ^3 x! R9 h -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file6 x/ U7 P8 d4 `( a  A5 ]$ v
-root <ROOT>         Use <ROOT> as working directory during execution' m  G" m& r/ `. Z! b8 E
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
+ J, Q8 C3 ~3 o/ r1 s9 y! N -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code5 m1 @/ q( H/ x% k& E( j# S
-erroronwarning      Treat all warnings like errors0 G- S/ t9 ^3 X6 C

5 S2 f- S  ^1 F4 V" W" @, Z% C; qFile arguments:
$ x$ e/ p! p! d% R3 ~ <FILE>               Main assembly code file
) v* T8 [/ Q/ W7 P+ e1 M: j4 r2 ~1 H
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
. T: \% K' B! U-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
) f0 d$ f# W- ^2 w/ m( u-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp4 E  h. p! I5 V# O* |* A, p5 f
-root <ROOT>参数是指定执行期间要使用的工作目录
) n6 k( p7 T7 @5 E% y, h-equ <NAME> <VAL>参数用法不明) v: V2 Z/ e# s# [' b5 y
-strequ <NAME> <VAL>参数用法不明
+ |4 K5 d* @# L; q; y* ~-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
$ A3 ]0 X: Z: _3 Q5 N$ n( x" q; P! U) K
<FILE>是汇编代码文件,可用记事本之类编辑
0 K9 F6 P# R" ?8 I" g! S1 n; k6 J6 U0 e* I6 s$ W1 |; k& ?$ ?6 o
注释说明:
$ ]6 [2 d$ U: B9 l! G. R. C注释可在单行指令后面“;”和“//”添加
0 U' Q6 @9 r# v“/* */”式也接受
* R4 Q& J4 d7 g2 R+ s
: X! c$ S! W; r0 ~7 h3 Z! p) x例子:
  b) D& b. @1 I! |4 [* K4 F$ b7 G+ H.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000* u! P' @$ U0 n1 ?0 q& U
) r/ ~0 a5 ~( W( K9 |& h/ |+ M
.close;/*关闭文件*/
" f, h* g4 ^1 D3 R( @0 D( i+ e+ A9 k4 g
标签说明:/ ~+ t  i6 `( T- C9 r& Q! U
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。/ J+ _6 m: b/ c/ V; \

  z3 Q" n8 H. s! h数值说明:4 @- z5 h! K2 t. f$ I3 U
“0xA”和“0Ah”是16进制数值. ^( Y! [  p. ?  V& `- q/ F
“0o12”和“12o”是8进制数值' B$ n, _( `: s/ v/ B8 m
“1010b”和“0b1010”是2进制数值
" F9 r( X! U/ {8 w, A# i* w2 C2 ^  t, q
equ说明:
+ |- h+ t6 a* T# A格式:text equ value
0 i$ r* E* Y! [9 `说明:用一个text代替value) t9 A9 }+ d$ b- `5 y4 S
例子:
: a. s2 p3 ?7 \3 q2 }8 uaddress1 equ 0x12345678* X1 `# }$ x8 N9 d% e, B7 U
ldr r0,=address1; n6 f4 I5 N* M7 g/ b2 L6 \
.pool2 H# z4 `  n: h, F! P

9 D1 U* e+ b2 X函数说明:
. V/ F* ?) I% O! C2 g& n, l
7 |- F' \( A0 i  A' m, B7 E.open函数:
' d8 d* K) }8 _7 a3 b: Q格式:! w/ R0 T6 q& B  a* l1 f
.open "ROM FileName",offset9 y: i0 A8 H2 z  f  a1 o4 z
.open "Old FileName","New FileName",offset9 m; r6 e, l( X; W8 A
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
! m. z- `9 N8 @# q/ e/ a5 }6 F8 A9 U- S% I  B
例子:
' E* n# B# p' C/ Z' d9 B& W# ^.open "1234.gba",0x08000000: g  \1 k. U" }' c% e! n$ c
! H+ O; E; N  `# b  D: S- o% j
.close函数和.closefile函数:
/ r' B. b4 u, ]" B  H: Q! y格式:
! K3 d0 v# P  Y2 }( g5 v: }.close& a* O% l  i! Q0 b- Z
.closefile
. g' t, F3 T  {! i8 `说明:关闭文件。
1 T  I* d- r) I5 Q! ?7 K& }6 `) U
.org函数和.orga函数:9 Y1 N6 f8 o5 a& Q4 b
格式:
/ P# R/ j+ ?; w  V& K: ~.org RamAddress  u! a* v) x# f1 ^  z5 j9 B4 p" @" ]# }
.orga FileAddress
; J3 O9 p, Q( x! J$ _' b/ c说明:
2 n" O* S9 l! N1 l前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
4 s+ U" B) j2 ^6 [+ m9 ?" U4 p+ C; ?( z" m) X/ ~
.orga函数可指定ROM文件的输出地址。# b/ c- D7 j. I0 N

! j$ x2 M6 A, J! ]3 ?.create函数和.createfile函数
$ {& a: Z1 k2 o  F* R+ _2 _格式:
4 H! U: _# @" A! z2 i.create "FileName",offset
, x% B( Y0 z  E+ h/ G.createfile "FileName",offset
' c( h) U+ G; Y; b5 K说明:创建一个文件,如果文件是存在,他会覆盖掉。
- w2 g" ^1 [/ E; ^1 x
/ {; @# q7 o8 [- n.area函数
& r1 i  R- ^" M格式:0 W+ S, g  G' \0 S8 q
.area SizeEquation[,fill]1 y& P1 p' b# \: y
.endarea
1 L  [+ B+ U, z& f9 c, A) m8 ]说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败  O, b! q  I6 f- i

) Q; I$ n2 S# f1 N1 y例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
% a1 t( ~+ d2 O2 Gorg 0x1001 [6 J( q5 t+ ^( E( J7 w  w8 x2 |
.area 0x81 S9 s8 Z$ s0 Z/ o2 ~& U* ]
byte 0x5,0x6,0x7,0x8
4 j9 S. b1 b: g! q/ a.endarea% }4 R7 \  T1 p- k; `

) R1 x! K  l: `, K- ^.align函数; n9 h* j( P- P/ _; D1 e
格式:.align num  N$ \& S+ u! |7 X. p! S
说明:写零字节,num为零字节数量,用16进制表示。# j  S0 [9 ~8 T  z

  {: J7 N1 ]4 |. C; `2 M) X5 x# U.pool函数
' |8 ?3 q' L3 u3 q7 m6 d5 ~格式:.pool1 z0 b. @- \, N/ n1 j. P
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。" N4 d- y1 J2 K
例子:
; C$ r$ R; ^8 ^. F3 ], Yldr r0,=0x12345678;3 w& t# w: }  O
...." s5 L& _" h3 t0 y, s
.pool
* H7 p6 Q# M4 Z) l& ?: S6 V$ l$ r
.fill函数
, j- E, K) x  P# P5 Z0 O4 a4 g格式:
9 ^* ~% @0 S1 H3 Z  [) r- Y/ f8 S. D.fill length[,value]# W8 E# Z0 {) `2 \2 \& |6 {6 {
defs length[,value]( h$ O. M, I/ }, q
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。# K  L# g4 F* G3 o, K

; g7 \* A/ \% G, ~.skip函数:* d* N% K/ A6 `; P; [% Z6 N; j
格式:.skip length  E1 ?" N. I* k5 y  Z
说明:跳过指定长度单字节数值,length用16进制表示。
+ `8 B; N) t" [) E3 \
( K0 X2 ?3 o3 ?% U写单字节:
( E, j8 f3 E) I1 I) B.byte value[,...]
8 t1 m: \* x4 e  V.db value[,...]
$ Z6 t) ]! n5 M.ascii value[,...]" U  F% Z" O  ]1 X
.asciiz value[,...]8 q! W. V: c9 x, H
dcb value[,...]
: B% k1 T& b& R6 {4 Q
  o$ ]6 L( @* q; H" ~写双字节:9 h$ ~8 c9 ~, v
.halfword value[,...]
+ w: R* w, J) X" t. ]# n% Q.dh value[,...]
7 {- t, `& p' b0 m' ~" Ddcw value[,...]$ t% u( B& z" I! H
( A: s3 A$ H1 T; N
写四字节:
+ h3 Y% ]6 c: o.word value[,...]
1 R% U0 q& _. N6 E0 T# q.dw value[,...]2 G( h! o0 w, u
dcd value[,...]. x* d, f1 V1 n  @6 \, J( R9 i
9 R( q7 q' q" C% N( ?6 n
写doublewords:
7 W# D6 S$ d6 S% `% H( S.doubleword value[,...]
" @8 f: a$ a6 y9 {2 G! L5 @" [- U) ~4 U.dd value[,...]
* F* k0 g+ T+ ?0 R/ ^dcq value[,...]! ?* D4 e  z1 S" J8 _0 F3 [
) M/ ~2 T" M* y2 n
写浮点数:
; ?: X7 r2 H. c& P4 T.float value[,...]
6 y0 c* a! j# h6 [) B9 |( T: X.double value[,...]- d/ a7 |2 B; K
+ R5 e1 B# N! U! O2 ]
ARM的ARM模式和THUMB模式定义:
4 d8 [( l, w* F# ^& i& A1 q.arm|ARM模式
) C3 g6 S0 ?' |7 |- ~.thumb|thumb模式6 a& Q! C3 W! N! E' t) g7 N' S

" ?# X, M/ M( d8 p) n' G( z9 G$ |设置架构:# M! s+ j% f) y) U) |) z9 P  ]0 a
.psx|PlayStation 1(MIPS R3000)
8 B2 ~& G1 {! N! `# B8 D8 T.ps2|PlayStation 2(EmotionEngine)# G* _# r3 m* _
.psp|PlayStation Portable(Allegrex)5 ~& W6 A' `3 k2 p3 N7 j: _3 w
.n64|Nintendo 64(MIPS R4000)
5 \/ P% J5 m9 [: ]* r.rsp|Nintendo 64(RSP)1 H' h( S' K6 f- N! M! P. s
.gba|GameBoy Advance(ARM7,默认是thumb模式)
) Z8 C4 K# j  ^8 ~3 b0 b.nds|Nintendo DS(ARM9,默认是ARM模式)
9 Z$ h5 V6 z/ E+ P, p" c6 ?* v: f.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
- y5 @/ X+ N: x2 F.arm.big|$ f9 B& R& z/ F+ b
.arm.little|
* l! h8 ?: L. h: B) g: Z: j) j3 i3 l( R+ T% I
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
) i0 _- m0 |5 Y$ G$ m0 B  K
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-4 15:49 , Processed in 1.063476 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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