EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2173 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
8 J6 ]6 v: [& P* d$ M3 N# X$ C3 V
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000. L" L7 k; e4 G% j
  w+ F$ S+ U" H. G, M
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
1 X4 v; a& |: W6 Z/ S& _( w! }# {5 E# [) M& y1 a
Kingcom's website:http://aerie.wingdreams.net# \* H  \) p1 F
1 [0 B3 U1 N  I4 Y
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得; }: x" R5 U; X$ k: W, P0 [

8 z2 m6 ^. Q7 Z/ n更新版本可去http://buildbot.orphis.net/armips获得& J  J% \4 Z7 d7 O  e

& c; _. j+ L8 ~) ?ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。  X  H; M! h& u  V7 ~# z, }
  C; j7 L5 u) |5 |- G- i# h) `
ARMIPS命令行用法:
6 V% n. Z; p: E; Z2 ^; _$ ?* ?* X+ A9 I# C" t
Usage: armips [optional parameters] <FILE>2 q3 p5 w4 y& k+ m" S3 f) m
* }& I3 g$ o2 h2 s
Optional parameters:
2 o* I. k2 M' q# p# R: _ -temp <TEMP>         Output temporary assembly data to <TEMP> file
2 w! p& x4 h) C; v2 h: G- }" Z/ P -sym  <SYM>          Output symbol data in the sym format to <SYM> file
. ?0 ^: y6 G6 P  ~8 r- N -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
6 J# I# [  R! C -root <ROOT>         Use <ROOT> as working directory during execution
' K+ S: _( z6 w/ N( A8 F3 o -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code( z; c" f  T1 _6 f2 u0 |4 J8 `
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
  |  o/ ?/ u; f) l6 B( _6 J -erroronwarning      Treat all warnings like errors1 Z' t2 R0 o6 J; k8 C
; b) E5 B3 A/ ?2 R% Q1 O
File arguments:0 Z0 I: b( S1 c( y8 n& a( q
<FILE>               Main assembly code file: f, ]$ O$ t) h
; u2 Y  Z0 ?4 g. o! J/ t! {% H
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
) t, x' h- w* r-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
& D2 ^7 c% k. O6 C-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
* o. Z4 a  [% i* i( V+ `3 `4 \-root <ROOT>参数是指定执行期间要使用的工作目录
/ h) v1 @, }9 M" N-equ <NAME> <VAL>参数用法不明7 L* Q, P" L# t
-strequ <NAME> <VAL>参数用法不明6 a5 ]; q9 X! [% b5 ~" J4 t+ v
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译/ m, {4 e6 x3 H! [; o) l

' `0 F9 X  ^" b& V<FILE>是汇编代码文件,可用记事本之类编辑2 A9 V( Q, {" M+ e' w) g" V6 u$ A" E

$ K- q) T: U& B$ i注释说明:
9 J2 c1 t. ?. A& l1 b注释可在单行指令后面“;”和“//”添加
4 v9 f2 ~( }8 d: j. n* B“/* */”式也接受7 m! j- g. X: }( j3 e

6 i7 `; ]2 \$ O7 w& B0 d. u例子:
" ^2 i7 a, H1 J2 D0 F7 V* w% m.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000! i* `: j! o9 L6 ]2 k5 [
6 y( y$ m9 F, m" Q, M9 R" Y
.close;/*关闭文件*/" [* c& s! `  A  w* j
2 Y. T& I3 x( S& t" }4 V
标签说明:
. c; }7 ^7 ]3 n1 K( _/ O标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。: c7 H8 z5 i" ~$ \1 o* o. i2 h+ @! E
! [: ?) H7 ?/ z/ t& g
数值说明:0 G+ k: h; u/ V
“0xA”和“0Ah”是16进制数值  S4 r" o" h- W8 @6 K9 ~0 H" j
“0o12”和“12o”是8进制数值1 A+ L% t9 u2 R6 A6 W) j
“1010b”和“0b1010”是2进制数值
0 N1 D7 h( s0 R! v4 a6 u: G# J" e' t& E. x
equ说明:# K( @& A3 C: {! g9 K- p# B9 W: b* W- m
格式:text equ value
3 d* f$ D; E5 u$ L, A& D( \( b说明:用一个text代替value! Z0 u8 |, z( O' y* I
例子:
! S. b+ v3 B7 taddress1 equ 0x12345678
; t3 l+ s: j7 X* S/ p* ~ldr r0,=address19 F% @, j3 u& \3 x, D$ [: U! K+ N
.pool$ Y* ~5 u- _" Q  J

* D, c2 u% s  i2 i函数说明:$ _) ~1 W& _# e
6 R& V1 r: l$ E; c4 C3 B. T# j! J
.open函数:, c& E* L+ b0 Y0 k* A' i9 l
格式:
9 ]* i/ _0 r% P% `2 K% r+ c& Y.open "ROM FileName",offset! @% ]% ?, x0 N7 u# j; U- V
.open "Old FileName","New FileName",offset
) x" N$ g+ X; s  W# w2 b说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。7 W4 J3 \# {) _8 M" \. f
* j- H! P" U" l, `
例子:
. Q( W. ~, h' X5 ].open "1234.gba",0x08000000# j4 }& C9 B# d( e5 z: ^
8 w% l9 k- ]% v' x  V
.close函数和.closefile函数:$ @; Z: ^* C, d/ x# s
格式:
, }! a7 u! ?) G4 x.close
% j. V) \. f) S" o.closefile
6 Z5 w7 V' B+ `, r: G9 m说明:关闭文件。; @+ ]- b' S4 @1 k

1 S$ ?. ]8 V) G# G. t.org函数和.orga函数:
. ^8 @5 M3 I1 g) D4 O格式:: X# A& g% \( o- w! `
.org RamAddress; f8 k1 A0 z) `! i! y3 |
.orga FileAddress& u$ j6 h6 ~: k7 I& N- U# y! |
说明:7 u! c! @, o. i- ^. A) A
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。' V- e! [* m* ~
5 B' ]" K3 x; \  f9 a6 J
.orga函数可指定ROM文件的输出地址。8 p% M( L& d1 D) \; h
; q' r8 v  `0 O1 u- o$ ~4 F2 }
.create函数和.createfile函数1 L4 u% ?8 c3 v* l4 l' p0 T# X
格式:4 A( S; M. V2 ~1 q0 t
.create "FileName",offset
4 B# H+ k" Y1 q. p+ Q. ]! x.createfile "FileName",offset
  i+ l3 q- G% t; P! B7 X说明:创建一个文件,如果文件是存在,他会覆盖掉。
* E9 G' d5 o& q# w1 \7 y5 h4 w" X% d* C0 u* ?" g- |
.area函数* \( U* f" |/ A% P( g8 f: A
格式:' k/ Y  F0 \  x' L6 U
.area SizeEquation[,fill]
" a& X8 e# ]+ @( U.endarea( t% b* _2 t$ A: f/ e& I' F4 c
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
. F$ I0 C( a; Q3 l: J) ]" {$ \7 y# b) \/ g7 V- L
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
0 L) u$ i, w& n' d: q' Q! lorg 0x1008 C' L# |) L0 z4 D0 M* O
.area 0x84 a. B! _1 R1 F" ?  [' u1 l
byte 0x5,0x6,0x7,0x8# E! A$ b0 F% l4 c4 [0 V
.endarea/ O# O8 b$ H' A/ x/ i" R4 R# q

3 B( b* M2 A) D' o% n8 S1 q.align函数$ |! ~" [) b1 n' Z) G4 p* ]
格式:.align num
. h4 j, a4 j4 X说明:写零字节,num为零字节数量,用16进制表示。0 B- p! w. E& a. b5 c( h1 o
5 e# N- T: \+ j1 t8 v# w* B
.pool函数
( s- V0 y; P5 w0 i( X" p格式:.pool
6 f% [. M/ J1 E2 L' y* U& ?说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
* \# B4 A/ a) E例子:0 z( f+ f" P$ h+ j( P! ?
ldr r0,=0x12345678;
; N4 h. [4 r9 a! m7 Q# A....
6 N8 S) {( L& y+ T7 s.pool
& L! k. M+ J; w( M8 s3 C4 r. m2 `0 {- q8 }# F) e
.fill函数1 O: F9 r1 H( K& `. O2 U) }
格式:& t6 Q  Y2 \' z6 x( V
.fill length[,value]; \* u* R2 ~( q1 O- w  ^
defs length[,value]; {( d: a" L* @+ N. s6 [
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
( h8 G; D' X/ K3 b. t5 d# Y. o6 ^% m( {2 v
.skip函数:) D5 Z4 ^- d( Z! @. N
格式:.skip length
4 p# b; M, r) N" n, |说明:跳过指定长度单字节数值,length用16进制表示。
4 C* u$ V2 T  V( j8 ?  S3 e4 ~0 F- h8 ~
写单字节:3 f/ j# r  G8 Y% h4 D& H* G& ]
.byte value[,...]
4 |8 Z# o/ g3 V+ e2 x.db value[,...]: E. ]( T& W% W; {$ x* \% M5 ^4 i
.ascii value[,...]
6 S" D9 K& J. h: @.asciiz value[,...]
1 G7 n9 C1 C# n; P% adcb value[,...]
) V! k+ Q6 s6 |* B+ o1 p/ ?) i' Y0 l& e' [& Z4 W9 K' L/ ~
写双字节:
( X) ?% R/ n8 I7 h.halfword value[,...]5 N4 Y( a1 M, F% y$ F' P4 a
.dh value[,...]. r2 k. v! c5 a* X& q9 k
dcw value[,...]
, a( Z' U+ X' v
& m+ g: J+ c& P* X写四字节:+ l: j$ c. H& z: a" }+ B3 L
.word value[,...]
1 W) c  [% A5 h; ~.dw value[,...]
: J+ l) F0 A# r# N5 D/ M  l$ P+ zdcd value[,...]
; V2 M$ N' X  r. l! G4 }. P5 e  b$ V. E9 O6 V. J0 i) x: G5 S
写doublewords:- L7 k- D# @& b. j  g, ^
.doubleword value[,...]5 J/ N  K3 s- t* x; }9 t+ T
.dd value[,...]
4 |/ @1 n6 G3 r* E, {dcq value[,...]
" W% b( [/ [& C  F. t5 C+ v5 l0 ]. c
写浮点数:4 s3 I* Z5 w1 o
.float value[,...]/ C8 A+ W2 H+ V' n! c8 i: c4 I  I
.double value[,...]
, x) g. L; Y1 e9 X9 s: l, m
+ ~" P% |$ c, ^3 m* k6 l+ t/ p; ZARM的ARM模式和THUMB模式定义:+ N' I+ Q' O' F# g# k3 |
.arm|ARM模式8 S/ b, T6 t  N+ f" A1 h* g
.thumb|thumb模式" ?. a0 N/ p. O4 ~3 D

( b: r% m, Q; V+ T$ |1 B设置架构:
* g" {" d; P& i0 Q7 L.psx|PlayStation 1(MIPS R3000)6 w+ ~8 x" H0 y% |; H) u
.ps2|PlayStation 2(EmotionEngine)8 R4 f" b6 G0 Z( N' N9 ?  _- D
.psp|PlayStation Portable(Allegrex)* `+ C% Z+ `) t
.n64|Nintendo 64(MIPS R4000)2 W& F5 `" \2 r/ C' J" W
.rsp|Nintendo 64(RSP)
. R$ z& n/ S; O- j& T.gba|GameBoy Advance(ARM7,默认是thumb模式)
* w7 ^6 ?4 n# O' ^7 V.nds|Nintendo DS(ARM9,默认是ARM模式)
6 H) ]( M* Q/ p.3ds|Nintendo 3DS(ARM11,默认是ARM模式): z& n; O5 I/ m4 R! C# C1 b
.arm.big|8 y7 l* p/ h; I9 Z. b: E
.arm.little|) c! ^% G: L: K, C2 d5 s
$ H' P+ a- A5 @- Y" B& U! p
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
+ r8 Z5 x4 I% s" D2 e6 R" r4 c. ]2 ^
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-27 06:05 , Processed in 1.083984 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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