EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1975 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
' W0 `* O$ Q7 N4 r7 n: B& [4 a
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
$ N2 k% a! b; C" r
3 b+ Y9 O" E- }0 I7 _) X. }ARMIPS assembler作者是Kingcom,目前发展到0.9版本% ]: X  S* j* P& z' J

& K, Q% N# U! B! o) B& ~Kingcom's website:http://aerie.wingdreams.net
/ b! X) A0 e, ^+ h) `' u) x& g) m
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得( Y/ ?2 |- v: c4 b

7 @0 @8 e# f8 G7 e8 r9 M更新版本可去http://buildbot.orphis.net/armips获得* A# V$ O  r9 B& k' T3 l
* H. _4 p3 }! D* J* a
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
  X. Z( x9 p/ Y8 q* u3 Q- i8 b- |5 v$ T, f7 B3 c
ARMIPS命令行用法:! x$ j* T; b& n8 ~: r3 n& q0 ^
1 i: ]+ `( i  \" P- ~: ~  J
Usage: armips [optional parameters] <FILE>: z8 W, d5 Q4 \/ [4 h0 j7 H
( \3 w2 D: }9 R8 m  o
Optional parameters:% s. p9 `2 x- ~
-temp <TEMP>         Output temporary assembly data to <TEMP> file
# Q) D" }: k: a- }! v -sym  <SYM>          Output symbol data in the sym format to <SYM> file
/ |5 X  ]% l' l -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file( `  R: ?( k. P+ i$ X& O% ]
-root <ROOT>         Use <ROOT> as working directory during execution$ `0 Z& X/ t( W% ~  r0 a
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
; a4 y* X) T9 r0 M- k% J( B -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
9 i7 B+ ^7 G1 R0 h3 P1 ]$ } -erroronwarning      Treat all warnings like errors
7 k( b8 W& p7 \; W/ B" J: S" a- [2 e6 @+ c9 o- y
File arguments:
7 V5 |" [( s4 [8 B- v <FILE>               Main assembly code file
" k2 a( ~5 J; Z# w5 ?+ s5 l0 ]- u3 c
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
' d0 m+ G1 ~- G-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
0 O1 s4 X  E6 {: g-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp) R& X& L# F" q  h+ r, M+ V8 k
-root <ROOT>参数是指定执行期间要使用的工作目录' ?% P/ d( N- \5 |( p
-equ <NAME> <VAL>参数用法不明: x# T! y: e- i8 e' o' W7 s. Z. k( Q
-strequ <NAME> <VAL>参数用法不明: I; O$ V. w3 P
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
+ p% X- Z. Z. p- J7 p+ h7 o' I8 R# w" b* v% i6 R
<FILE>是汇编代码文件,可用记事本之类编辑. Y: Q9 g! B# l7 g+ q" M

7 ?0 C0 U# z9 \: ^1 V# D3 T, [" D5 [+ l注释说明:
  e# d$ {+ U$ K注释可在单行指令后面“;”和“//”添加3 \' X+ `1 Z: C
“/* */”式也接受: h2 z0 n# d: o
$ e. S* y) ]* D6 d; k2 V
例子:
- E9 @) b- V; L.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
4 |4 e% q- G  j9 i+ H
! F& F& @8 e+ R  p% T$ Y' T9 \! i3 ?.close;/*关闭文件*/1 W. Q: T- O) `! C- l- K1 q, I+ c. P
) }- V- `5 d$ v
标签说明:$ k. m$ L! T8 p, B7 `$ g: ]
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
& s  m' P1 o6 z9 N/ C8 c- E% G  i$ D; f9 j# f
数值说明:. O+ X0 |/ f" L
“0xA”和“0Ah”是16进制数值
, n4 W5 T* h- i6 Z/ S& F“0o12”和“12o”是8进制数值
/ Z! |' U. I; O% ~/ `' r“1010b”和“0b1010”是2进制数值
+ G3 Y# a  y- U9 t; A" k, q1 Q5 m2 k7 C
equ说明:
: v! \5 ~+ y* T' r$ L9 [格式:text equ value
/ p1 j# S9 u7 Z! A说明:用一个text代替value
: W" p% A! {4 p3 ?0 b. z) @9 ^例子:
- M6 B# `- R- @2 q, e* \address1 equ 0x12345678$ [% c) a7 Z/ n6 _' e% X
ldr r0,=address1
# p! u7 H' d8 L6 ^) b7 G5 j4 U.pool
& W6 Z5 C) _8 L3 G$ k5 Z/ j$ Z
; X, n( F+ |5 K$ r2 ~4 Q函数说明:
: w& _. Z2 `! j) N3 b
9 h, u, ~+ }+ ]" r5 ~' o2 G' e4 j.open函数:
; c$ P! P3 O: Q4 D格式:
/ S6 W  Z% ^& I/ F/ _2 P.open "ROM FileName",offset
# |- o0 P. {+ K; z.open "Old FileName","New FileName",offset. t- L, b6 G: a/ y, p
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
8 {- y: m$ C% E. H; m
4 H3 _0 e& e2 j0 B) b例子:4 y; \4 y3 I. U* N- H
.open "1234.gba",0x08000000
" j2 R' |; t2 ^/ ^
" \" F+ K+ O; R% i8 W6 O2 y.close函数和.closefile函数:& @, o5 U5 t4 ?  b# g3 ?
格式:. A' r9 C+ `2 Z: X, b4 K/ q* `
.close5 \" H& e+ M, X: d% Q* c
.closefile
$ r" h; y' V9 z说明:关闭文件。& m" V0 s1 p$ U0 N
  D) d0 \2 r2 v  z# h
.org函数和.orga函数:7 h  O& Y7 P/ h7 ?  o
格式:
2 J( ~7 F( T4 r.org RamAddress
+ I2 }& I9 S! D$ G* K% \4 I) b.orga FileAddress
6 }& J6 m/ e) m" C说明:3 n' _# ?7 {& o: H1 O
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
) Z1 E4 L; W9 N7 K
" t$ M' k& A: G.orga函数可指定ROM文件的输出地址。
6 X4 [1 Q) p6 S+ N# }! m1 I# l' n  j
.create函数和.createfile函数
3 P* X: ]9 c, o7 c. X  j格式:
' p1 C' ^  W# H' G( z; P3 E.create "FileName",offset% ]" o' s3 g6 R
.createfile "FileName",offset6 x# U3 c5 H1 j& N
说明:创建一个文件,如果文件是存在,他会覆盖掉。
( ^+ D* ^$ M$ C( I, O( m' B' d6 g/ a7 B
.area函数
. l4 Z5 n' z& ^& |! w格式:
9 O8 D/ i7 T2 N2 g7 B% o6 Y8 R.area SizeEquation[,fill]
3 \5 q8 z* M! \$ ~5 d; C.endarea" Y- R9 P+ B3 p3 ]  m/ a3 K% K
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
/ J6 G0 P! |: Z: f2 T
  o1 L, u$ }1 V! R例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据# Y5 s3 Z% F9 N" {" s8 R5 H6 X
org 0x100
6 i- h0 [" p. q$ ]8 r.area 0x8
* u4 V0 k( p8 t( [byte 0x5,0x6,0x7,0x8
- d, S1 \7 Q2 t6 V! a% }.endarea
" u/ P* ~3 K0 ]% Y& }' ]
& V7 o/ _3 B/ y3 m0 i1 Z8 P.align函数8 f# e- e( K/ K( A6 {+ p
格式:.align num% x; h0 z3 ?( J, S7 m4 k) R
说明:写零字节,num为零字节数量,用16进制表示。
. \% v- _  q/ V5 I: F0 ~1 ~* o  ^
.pool函数- y0 E: g$ j$ v% o* I& o" X
格式:.pool5 K* m% q$ L+ B4 ~7 G% n7 V
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。: S" c# B. `7 E  V4 q- k' ]
例子:
+ @3 w: w5 [, Z+ ?6 H! }* ~( O& l1 \ldr r0,=0x12345678;. z6 {' G* V8 B& P; @& P
..... r! Q8 Z& v: b& c8 Z# X
.pool: m% i' S& r$ y

1 u0 ~2 K- ~6 A$ n.fill函数
. v) A6 r4 i5 v格式:- r2 k6 B# {: x2 L
.fill length[,value]
5 W5 `' w2 o7 ]! D% J6 bdefs length[,value]2 W2 |2 i- w- o8 q. F
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。# V& o$ W' k* R8 K' q+ c

, E& l" X/ w( q3 J5 y.skip函数:( c! W# N3 r* B+ @% b/ K/ M; r$ K. B6 K1 e
格式:.skip length
( Q3 `5 x$ Q0 W! i$ e1 Z说明:跳过指定长度单字节数值,length用16进制表示。9 D7 R# v! w3 t

0 q6 t: S2 _! L. j7 ~3 m) `3 ~写单字节:( J( y" u6 d3 X' q* U, L" I3 d
.byte value[,...]
- m+ x1 p- o+ ^5 M8 d.db value[,...], a/ v3 }2 o. V8 D0 t* p! R6 g
.ascii value[,...]
7 x& h9 o3 [- Q.asciiz value[,...]. @& e" @  G& o% P9 I7 K
dcb value[,...]% e' Z  L" g6 y
/ Z4 I2 V. u# Z. C
写双字节:
% t6 M9 W( ~% n) u% |; H.halfword value[,...]
: \+ a, I9 }$ L& j7 C.dh value[,...]% T' }8 \' s1 l; r5 N- O
dcw value[,...]
- h: a- ~) p5 w/ O
, v; i# Z) G. Z写四字节:
" y% o" Q, l& v2 O& j.word value[,...]5 u' c, L2 J+ B( Q2 {! _- c/ O
.dw value[,...]
$ @+ V+ G/ J0 R8 _dcd value[,...]
2 F' e  s% U1 E0 F. q
3 b6 ~0 z  o4 ~; s$ W写doublewords:
* b& F/ t# d: Y" N% o.doubleword value[,...], u; x+ ?7 b2 r
.dd value[,...]9 c$ G* \  m4 K' A- _! ^
dcq value[,...]
+ f7 A5 ?# w8 B1 v6 i9 u4 |3 c! @8 u% p
7 x! X/ ^; V* m- |" S+ J写浮点数:0 d" w1 T+ _: b) L9 Q0 X# i
.float value[,...]
- a/ b# B0 S, W" e.double value[,...]1 i6 t2 R$ Y. N! [
) I! K  r) k$ i
ARM的ARM模式和THUMB模式定义:
( q- A! C9 \$ r7 d, q.arm|ARM模式6 G( v' U" v3 Q% Y/ E' o; r
.thumb|thumb模式
! B, i4 a! F8 i5 W! H! f) r  O' R- l, X6 R* E: e
设置架构:, Q0 g( S0 A0 K: Y
.psx|PlayStation 1(MIPS R3000)- d! F: v  M- Y
.ps2|PlayStation 2(EmotionEngine)8 D$ p7 |0 i8 n1 C4 M. |4 S, z
.psp|PlayStation Portable(Allegrex)1 e3 K- Y8 v; E& i, d
.n64|Nintendo 64(MIPS R4000)3 Q1 w/ c3 R$ W2 N
.rsp|Nintendo 64(RSP)" q1 k( j! B* u* @* E
.gba|GameBoy Advance(ARM7,默认是thumb模式)9 M$ F5 m, }. s7 H3 n5 W( k
.nds|Nintendo DS(ARM9,默认是ARM模式)  g, O  g# O6 H' _* L* m2 s
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
# w) c; \4 A6 _2 C2 m.arm.big|* O' a: G2 ]5 `: U1 n
.arm.little|, _' v  U7 e- h6 |) ~# K+ P! U* p) U

: G$ G- ]* F! I常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。' [$ m5 y: J) s+ m+ b
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-11 04:33 , Processed in 1.065429 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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