EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2093 天

[LV.Master]伴坛终老

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

" N" T4 e$ }1 h! k; B# l. t) s" aARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
' s) i: o* Y' S" D
( n4 n$ c9 r9 {6 vARMIPS assembler作者是Kingcom,目前发展到0.9版本+ I# o+ C( J$ i5 w& M
2 f9 I, M% T4 s/ b; H' O! d
Kingcom's website:http://aerie.wingdreams.net
' B9 m* H) k* t5 X  E$ R8 E8 y6 p9 s, t
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
$ H: R+ A. I5 v3 e/ ^- I/ ^' c/ T5 F% l) o
更新版本可去http://buildbot.orphis.net/armips获得) l$ r, f* O; m/ K* b* m5 F
5 ^' I3 u% s9 O& h: v1 p
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
# v, |5 j# K4 x1 M6 P- a9 m) u1 ~" a, }+ I! B3 \4 @
ARMIPS命令行用法:! P6 J  v6 i5 n+ _' m
' O; H4 F, R0 \* ^- ^) B1 S# K
Usage: armips [optional parameters] <FILE>
* l0 g6 y. x# s& V. b
) }2 u) v: p% r1 v: B- f' MOptional parameters:' k1 Q4 E+ ]9 D
-temp <TEMP>         Output temporary assembly data to <TEMP> file- c( F- _' H9 m) d
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
1 \& O, H' d7 {  Y4 q( b( P! `1 s7 \4 ]' y -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
8 ]5 {' T# _: n' J( L3 C9 G& y -root <ROOT>         Use <ROOT> as working directory during execution" L# T4 Y7 }- W* p* R2 f; W
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code+ a' s- h9 c7 ~& l
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code3 b5 G! b; G8 V, C
-erroronwarning      Treat all warnings like errors5 j% U% R2 Q6 J. d6 m$ A
( q% U! \4 f0 y; v  f+ ?
File arguments:
! G0 g2 Q" _+ T, t* l' ?& x <FILE>               Main assembly code file
, H6 p! ]3 `! w, I! J0 i
" {/ b1 E3 i/ Z6 I- z-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
) f' |, u& A" A-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba/ E' ~& j& L: s2 e5 A2 P
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
% [6 x7 J0 O, d; s-root <ROOT>参数是指定执行期间要使用的工作目录! g7 g, O0 X, ~. i% k1 n9 ]
-equ <NAME> <VAL>参数用法不明+ P2 P8 _4 ^. ?8 H3 C" g& z
-strequ <NAME> <VAL>参数用法不明
% A: N( V0 D8 n$ v* ?' ?7 J7 \-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
* w- ]# d: Z; z6 H* x1 W
; u6 ~  Q+ w: ?) f. v5 X<FILE>是汇编代码文件,可用记事本之类编辑
" v$ G/ P+ A. b% K3 E, i
# A6 u% P8 ~. Q$ N4 d注释说明:
4 D$ t" Z$ o  d0 U; Q注释可在单行指令后面“;”和“//”添加% i$ ~+ L1 G8 c) A
“/* */”式也接受
# h) o) X3 G3 q7 C. K* c8 x5 y' b/ X! v0 l; X3 f
例子:
! Y7 Y0 ?# x1 x7 R" g.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
# f: V, p+ j) @: q7 P+ |# S8 H5 Q$ M1 I  M7 j% i/ W# z3 U
.close;/*关闭文件*/
, L+ K; p3 c  Z+ V0 [' k2 z& d* K* N8 z) g2 V' w
标签说明:: f6 Z3 v, F9 |" D6 h+ M8 C
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
% O2 i2 P- S6 a" m! a! R5 x1 _( r$ U" i
数值说明:
4 N6 T. v2 \0 u. k. k1 k“0xA”和“0Ah”是16进制数值
8 E6 h- }( l& b, ?" z“0o12”和“12o”是8进制数值
  ?7 I9 o- c. H+ f& j. T7 _7 N“1010b”和“0b1010”是2进制数值1 k: o7 F+ k9 y% z

$ A; c% }1 i' c# \# ?! Lequ说明:
2 r( C( a/ `* \, V3 Q格式:text equ value
: H. I( ?# T& ^# _& y. r6 X. c说明:用一个text代替value
6 m6 R( H% B1 W# p. [& l例子:
" @( f$ m: d. A  V# U+ Y# Maddress1 equ 0x12345678( T1 ^- V, p: s# w
ldr r0,=address1- M2 \$ b' S. `$ d+ X5 o. N
.pool
9 [+ D4 d6 X4 x- _: m9 W
5 `6 ^$ D; y- g; o/ Q8 K9 N函数说明:
3 v0 W$ U7 v$ {$ x% n" f% {+ c0 C2 L$ ?' `; N% [& J# E
.open函数:  I3 q; N2 n: o5 i
格式:. S7 B, Y9 n, e) Q; R. T
.open "ROM FileName",offset- P! m) X8 c( h2 H5 ~" F
.open "Old FileName","New FileName",offset, I+ [! p, E6 Z1 K* f/ E1 z
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
! C; A: w* p7 i* {! R" G3 O; _/ G7 ]8 @! ~' u
例子:8 Q* y# V8 ?# I
.open "1234.gba",0x08000000
3 x3 E! [' p0 p. L1 Q6 P7 e6 D+ H3 Q2 s. d4 f0 c4 |
.close函数和.closefile函数:
4 S1 m( Q2 ^1 r: U格式:
* S  w" t3 b. P" i2 I! B% Z8 ]+ C.close
7 S5 a- m. `& m, @7 [.closefile
) Q2 k2 }+ |3 M) E' X7 C说明:关闭文件。
* [: L  m  o0 L% s% ]6 S
  D1 O1 g$ n. U" ].org函数和.orga函数:
6 b5 H6 @3 m, F$ x9 g格式:
% ^- C  ^' J4 v3 ?.org RamAddress
, G6 J7 Z  h9 c! G.orga FileAddress3 A. P( T" r* r7 u
说明:
9 Y2 j; n$ `5 {# w前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
& Y. M' y6 b% E5 a6 f' n) Z# _  C& _" O1 e" q9 X
.orga函数可指定ROM文件的输出地址。0 M( i# y6 z; g& y

% N9 o( |7 S9 ]9 F.create函数和.createfile函数
! v9 c5 J2 _. O6 x* ^2 m格式:
1 f4 l$ O- @' G+ c& w# k.create "FileName",offset
; f* [2 B7 `9 t) x. A.createfile "FileName",offset
2 E, d) \6 l5 R5 {% N9 u# r说明:创建一个文件,如果文件是存在,他会覆盖掉。0 l! l" {8 K* M

: G: R# s/ o- D( u7 S6 \.area函数
1 q" g7 \. M' T5 ^  p1 [4 G7 q格式:8 Z4 b. V3 v& o5 b  {7 w' V2 w
.area SizeEquation[,fill]4 H7 J* Y3 |. S( S) u% M8 ^
.endarea
, e  I" f3 X$ S  T& E说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
% J% h6 H, K1 ^7 U( u' m* L+ W' a5 e2 j
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
* U7 v" f/ {7 l2 C) z  e4 E0 borg 0x100; M6 F9 E4 \) X
.area 0x8
( q2 b8 G& \' r2 C: K& Q9 j" mbyte 0x5,0x6,0x7,0x8
' f/ \+ x" V0 G1 }! @' \. n9 g.endarea) P6 J2 C, u: y& @
9 \# g- j0 A: u9 E3 R+ H3 q4 c3 e
.align函数
7 x1 Q" x! D) i$ y% J, `8 d格式:.align num5 v  s4 N+ r* u, Y; }$ D# R2 E  H
说明:写零字节,num为零字节数量,用16进制表示。0 [& ?( W! g2 R

. l3 }, |6 L& X.pool函数
; O, v; D# u# _! ]- N! ^格式:.pool
3 T- e8 f( R0 ~说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。. f* v1 X( b& N9 c. q4 |: y$ a
例子:
5 W" _# J! m/ D+ `4 Fldr r0,=0x12345678;
, x3 I8 T) b0 j1 x5 K' C: x....
" t* a1 P: A; A.pool5 b: x  B1 E% ^  x. C$ [
% g5 W7 u, b' D( H+ x
.fill函数
: a% {! K: \2 Z  O格式:
% G3 R" Q/ l6 P6 {.fill length[,value]
3 h6 F) ^: v1 ~$ F  V+ _defs length[,value]: g6 L% v( Q- P, e! C: ~8 V( q
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
* v- l* x* ^8 _; ], c1 e+ B! H6 k) F2 r/ a! j" {6 z
.skip函数:
7 v! B6 D( X* G6 `4 V! W; R1 S格式:.skip length- r2 C; w% F+ ~: S8 g6 I0 x6 z: @
说明:跳过指定长度单字节数值,length用16进制表示。& v4 L% @" r) ^1 f2 U" h

6 U; w7 f4 }/ T) J4 S写单字节:
! ^1 E% i: S: d! B( @* r+ ~.byte value[,...]" ^- L9 q; A, L  T( S: ?4 _
.db value[,...]
6 {4 z. J( D; B4 \% }4 m7 b& r.ascii value[,...]: V7 q3 `3 M& A) a% k1 ]% C
.asciiz value[,...]* T4 O& W+ }, Z3 b2 X2 N
dcb value[,...]/ C" ~8 C; C1 F/ n+ W& y' i
1 [+ n; F8 a) W6 X1 o$ a) u
写双字节:
- y# J$ F! [; a8 g7 |4 A% p.halfword value[,...]8 r( S! c( R0 H
.dh value[,...]
3 v: f' N0 L7 z1 bdcw value[,...]: u# R4 j0 Z* P& [
" c! V! l2 n0 q7 \) r# L
写四字节:: j: I: e" q; Z8 r& _/ p& d
.word value[,...]
6 C' M' p' ?8 i.dw value[,...]8 e1 I! x/ y) {
dcd value[,...]
% {5 Y: n1 A! Q6 y
! D" F0 ?$ A0 [/ g% z0 _# _写doublewords:+ i! D+ E$ {0 g6 u+ D2 R
.doubleword value[,...]
6 |, Z# Z* W, C9 L: c0 ?3 ^" z! T.dd value[,...]* i2 T' b3 H- R. K
dcq value[,...]
3 q1 T3 ~- q$ o* o# P1 _9 \! Z" ^' l: G5 e7 ~/ _$ y. v) e
写浮点数:) a9 ?; T5 X+ u0 q: `6 p& [
.float value[,...]
; @$ S* D  \$ N.double value[,...]* h( l3 U5 e2 K7 Y, H5 \, j' `

! X$ q+ J0 q; U& Y. UARM的ARM模式和THUMB模式定义:
2 u. r9 v" o3 ^- J  d.arm|ARM模式7 h4 L) |1 S5 i; n
.thumb|thumb模式/ v2 v9 s6 q6 Y

% t0 n. f7 @! m  q. ], @1 L设置架构:
5 C" x& v* \+ C! r6 I.psx|PlayStation 1(MIPS R3000)% y4 [5 u. U# V  G  \' [
.ps2|PlayStation 2(EmotionEngine)
+ @' K' }1 ?  k: U! d% A3 @.psp|PlayStation Portable(Allegrex)- F2 f& k- L+ @" N5 v0 Q9 j
.n64|Nintendo 64(MIPS R4000), c# E- G, O8 w+ c" j
.rsp|Nintendo 64(RSP)6 l9 l+ q' o! J5 j
.gba|GameBoy Advance(ARM7,默认是thumb模式)( S, h6 [, t/ F+ U6 ]
.nds|Nintendo DS(ARM9,默认是ARM模式)( z3 Q5 w; ?- v7 t( x& P; B
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
0 `( w5 l9 j3 X  N* Q! V.arm.big|
$ h+ G+ g8 k+ {3 i.arm.little|
! `: D( D# D4 ]4 {0 Y/ D$ t9 G& m9 f' f6 _$ k' P9 D
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。# ^  w+ x/ q- f6 b. L. b
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-10-7 03:32 , Processed in 1.071289 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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