EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1928 天

[LV.Master]伴坛终老

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

: C  X5 ]# B% R; rARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
) ?+ {- G: M0 _0 X1 m9 m; b  ^9 h9 {2 X
ARMIPS assembler作者是Kingcom,目前发展到0.9版本4 p6 m5 o0 w. l( s; h. _% ^' I2 L
; ?+ I# g% n0 Q9 A/ K6 b
Kingcom's website:http://aerie.wingdreams.net
9 I& @, [, q; a5 R6 m# f$ _5 E( Y. d/ |8 |- {
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
% w+ K5 S" \. k, ]+ W
- f1 W" t% }2 X) y% L9 k# @. c更新版本可去http://buildbot.orphis.net/armips获得
) v  Y3 R, n: ?- u6 h) x5 e9 t8 v/ s7 E9 Q  v$ O
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
7 `" s; h* r. q* o) X
* s( U3 Y  N* r: f( [0 pARMIPS命令行用法:3 U: I8 U9 V9 }1 x* E8 c5 g

. N$ t" G( k0 r1 ^0 k! J4 k/ E& gUsage: armips [optional parameters] <FILE># l' A* q, m4 L2 m& `
6 \9 U  G! Z. r. c& v2 R( m. g
Optional parameters:
& P, m* \* \: ]7 U- g  t -temp <TEMP>         Output temporary assembly data to <TEMP> file
" z+ C1 R* i% e' g: Z& F$ F -sym  <SYM>          Output symbol data in the sym format to <SYM> file
4 s# V4 _1 ~0 L: J1 q -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file) ^4 D& ^& y- a% N/ b3 k
-root <ROOT>         Use <ROOT> as working directory during execution8 [" b6 i+ t' m. l# ]
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
- `- `% ]4 I9 e' M* e -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
5 v3 D% x9 i7 `( M& ] -erroronwarning      Treat all warnings like errors* x# t3 _- j& Q4 f6 E8 w' ?3 H' J

0 \! p7 r, L% hFile arguments:
! m0 |  C# w' d <FILE>               Main assembly code file; y$ i& B- f: @) O( y
3 X# h  Z7 ?$ ]& }5 H3 |# i3 ?, {
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
* ~9 z% G$ w7 |; V: ~" H-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba, u1 i( H* X2 d. m
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp! T& ~' s6 i: R' N3 {& w( P4 H
-root <ROOT>参数是指定执行期间要使用的工作目录- w' _  M) g5 |- j" L' v* }! `
-equ <NAME> <VAL>参数用法不明- @7 v. M& i& f/ v
-strequ <NAME> <VAL>参数用法不明
$ ]# r- S' n) H1 \-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译$ y# d  U. w; F
9 o: W, X. V2 o
<FILE>是汇编代码文件,可用记事本之类编辑  W  s8 X) l5 x0 c1 Q3 D& n/ W* D9 H
$ n! H6 C* _# p3 t6 n
注释说明:" Y9 f% V8 w6 j+ p% X
注释可在单行指令后面“;”和“//”添加' D. {/ s4 R' B' \& ], U
“/* */”式也接受
0 S# X; w. [0 E3 K2 p
. w9 x6 |: a8 E9 o5 i% L& J' w例子:
+ X, X1 i1 \2 C.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000; f1 i7 W8 Y3 }0 O0 h& k
1 }% V" R; c( W  q4 U, }+ i
.close;/*关闭文件*/
; ~3 f7 l+ I4 J3 t" \: d+ z# K) V% s9 H# ^0 O! ?
标签说明:
; N. F- u+ {1 M9 ^) e/ F# F5 }标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。. s! J! L: G0 X9 a0 s" F4 I

7 _3 l5 K9 p0 Y! p2 E( a0 T# a数值说明:
. W. K, j& f+ L( Z$ P- f“0xA”和“0Ah”是16进制数值
0 d# S8 B2 Z' p“0o12”和“12o”是8进制数值9 O8 t2 l# f- g0 c+ w2 @
“1010b”和“0b1010”是2进制数值
: D6 C  a5 K% r1 B0 q
+ w- @/ R# ?1 R0 o# t% @; a' Wequ说明:1 V1 V/ |# p' k: t
格式:text equ value
1 d' v6 H; c' g. c说明:用一个text代替value* c, [! `" i5 Q* T7 W% t$ J
例子:
: V, t6 R) U0 M4 B1 \* C2 D1 yaddress1 equ 0x123456783 K2 t  I& S/ d% m1 `5 i# g
ldr r0,=address1
) h" P* C. m3 D5 J.pool( W2 r8 a! M/ }6 `5 ]$ N. L5 R

3 f: S! ^! w, j4 m/ S函数说明:) S% _/ M  F. l- R) Y" E

9 T1 ]& o! k& s( I.open函数:
  P. u0 C" \; l& h格式:$ t# T- q; L7 l6 ^6 F
.open "ROM FileName",offset5 Y, g$ `" D' T6 [5 g" N% v5 R( `
.open "Old FileName","New FileName",offset
/ N$ C7 d- ?( M. ^4 |! S说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。: W5 J6 K+ X: J: s$ j

- I) ?5 C  W* I, i例子:
( s% c+ h# K+ a' \: X$ H.open "1234.gba",0x08000000
4 r' e1 V* O0 S$ Z2 o" J' L+ q6 V: E- ?$ n  M+ l3 f' V8 M
.close函数和.closefile函数:
; x; [7 c# S% E& h( m/ G6 Y格式:4 G  k5 a" l* J; `; I0 [, N1 o
.close0 a( D% Q- }8 q% Z7 ~- A) C
.closefile8 z: s! f/ h* Z0 S
说明:关闭文件。! L  v$ V5 j  R% `4 I

- B5 `+ z" |) H) a  m1 c.org函数和.orga函数:
" ~2 ]) Z" F5 {3 x格式:
. V0 R8 G0 m9 K& J- ~" f; j.org RamAddress
# }7 O9 i3 I" `7 c% e' U.orga FileAddress, t- Q) M% B7 ?- O9 a8 B- I
说明:
4 J2 p  [& ?5 Y. f6 [, W前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。1 u/ M# v6 }) b/ N; T4 {: x/ Y
0 a( W  U$ Q  u1 U
.orga函数可指定ROM文件的输出地址。
% k0 U- Y7 ?8 `9 w9 `% {$ X1 ]$ o. j% H/ h
.create函数和.createfile函数
$ V' v( D# a. y) w, E0 K6 ^* _6 |2 H: \格式:
" C1 `0 c/ J3 ?; A: G.create "FileName",offset7 s' m0 a7 V. j9 k( t0 W
.createfile "FileName",offset8 Y; Q7 b5 K: F( h
说明:创建一个文件,如果文件是存在,他会覆盖掉。
% x6 U8 `5 [9 C( g
* V, O( K- {" c$ V.area函数3 b- a' I( I( G+ R! @0 P
格式:. F: _- C, f5 `2 g2 E5 g
.area SizeEquation[,fill]
. Y7 @( y6 @4 s% z+ y1 D/ @2 @) x) v.endarea
$ @5 C0 f/ {- p$ ^说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败- h: W& u: u1 h( [" e9 [
# k5 D. i* j' L5 D: t2 {
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
+ ^- s  u" T& f& N" aorg 0x100
3 S4 Y; f4 v4 {8 y5 @- ?: n.area 0x85 b& p9 Z6 f' M0 |
byte 0x5,0x6,0x7,0x8* ?9 c9 S& [% w1 ^, @( ]
.endarea+ n2 n& Q+ G9 z; a

& {5 P& o; d2 N8 U: d& v/ l5 z$ b' E.align函数
" n5 z4 l5 T# N7 p格式:.align num7 X* \' m. d8 H
说明:写零字节,num为零字节数量,用16进制表示。
( n" U6 P2 h  ^$ n" a; `& [9 R- x# ~7 {& x6 e4 }- B3 H  ~
.pool函数
! h; J5 c5 \& ]) O6 ?格式:.pool7 c* f/ f/ \6 G) a' d
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
. U1 ]1 t5 i. h8 f# C例子:4 d: ~5 R. h" v2 `
ldr r0,=0x12345678;* p7 V  k# D- n$ s3 \, A" D
....) {  c. ?7 ?1 T" j  n" W! V9 P9 e
.pool+ o# |0 m* ?. x! V

! Y" i5 K' |: n% e+ M- b5 a- M6 y.fill函数8 g& N& _1 _8 D/ b* C# |/ T  {
格式:
( y( X3 U, K# W, _' F6 }7 j% X.fill length[,value]
( Z& v4 u2 E$ f7 Xdefs length[,value]3 r) L* h2 [4 A/ F! ~" M% y
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
" r% G& {( [2 V8 r/ f# X% B& ]: _! Y1 l' Z" U9 c
.skip函数:) J8 f* F# }+ Q/ B$ w' ^3 Q
格式:.skip length$ F$ q1 l& z; C6 r5 L
说明:跳过指定长度单字节数值,length用16进制表示。% `$ d! R9 t& n% j+ c1 l: G# D" n

6 C/ x. w3 h: H% w写单字节:
6 p. _( i/ v- P6 f; N.byte value[,...]
" U4 W: s/ U  `9 ?.db value[,...]% ?% a4 T; Y. [
.ascii value[,...]
2 ~5 g$ C7 B4 P- I: d9 q.asciiz value[,...]
, f4 T* R* G$ x; Pdcb value[,...]8 y( U2 L! M) S# Q1 B1 F0 \
% Z2 Z3 G& t: e/ d+ K
写双字节:& J! J: [6 P! t8 T* R) ~
.halfword value[,...]
) O% C. E- {* D) \0 P5 N' ?.dh value[,...]: I" ^; T) f6 h) _* a" }
dcw value[,...]$ ~! v, w& |+ x/ Q& [

0 _5 ?2 r% X9 y$ s写四字节:
/ ^, o6 D2 W+ ~" t0 O% v.word value[,...]% m, x$ i, [$ X5 Q
.dw value[,...]
6 c2 u6 j5 h& `- I0 J& Cdcd value[,...]
/ q/ E+ _/ r3 z# t2 p9 D( p. g
4 L5 J1 E& a) B写doublewords:$ {! X9 z6 R# h+ r% r0 J) h3 p
.doubleword value[,...]
9 k/ ~1 \0 }1 e9 x/ S! H.dd value[,...]1 F3 x* F. s* s1 g$ l  g5 e* M# Y* T
dcq value[,...]; ~+ ?% r& a/ m0 T' H+ e5 F
$ @1 M& J- H, m! g; F* Z  y
写浮点数:- W- j6 D( |. v) M* \: f1 `
.float value[,...]
  ~1 F- |$ ^* E.double value[,...]1 @& G, o* z/ W! Y! f2 _

: ]$ t0 [3 @1 mARM的ARM模式和THUMB模式定义:
1 w! H0 Q3 c9 o8 ]! M) B.arm|ARM模式
! e# ^! w  w& X! U( l# V: X.thumb|thumb模式
. j+ c9 b  M1 _) l3 s! H1 I: f# ^* G, i* B5 E
设置架构:
* P! B; J( @1 V* ~2 z5 e.psx|PlayStation 1(MIPS R3000), \/ q4 j9 M  p3 T
.ps2|PlayStation 2(EmotionEngine)! Y3 z. R9 D3 x
.psp|PlayStation Portable(Allegrex)" R! G* ?3 Y7 O
.n64|Nintendo 64(MIPS R4000)
$ y+ ~: I( H) U5 I! i* z, z.rsp|Nintendo 64(RSP): t: T9 l: _+ \9 g- x
.gba|GameBoy Advance(ARM7,默认是thumb模式)
; m8 G8 g: Z  O3 r, t& S" t( z.nds|Nintendo DS(ARM9,默认是ARM模式)* W0 y2 Y1 n" J- A$ i3 o7 D* |5 I' a9 ?
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)4 d! _1 D* L, I* c$ |: Z% p1 E5 ~
.arm.big|
, Y/ O" G0 z/ |; B* l.arm.little|5 E) p! ~$ w$ E, O! [
' g% J, D- h& q9 h) m; V# N+ K
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。+ [2 }9 H) m) `" p
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-4-23 00:55 , Processed in 1.142579 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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