EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2210 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
* @( S0 J6 y% p0 l  b0 y
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
! b9 x3 p; K8 d  y/ C
3 W: w2 n9 H, M6 W1 v7 p- VARMIPS assembler作者是Kingcom,目前发展到0.9版本* b* }9 Q& P' [" Z; W2 W

. {5 T6 ]' z. M5 F7 i  R7 a) {Kingcom's website:http://aerie.wingdreams.net
2 m) K/ _( ^: r* ]! c
# h& n4 M! N: GARMIPS assembler源代码可去https://github.com/Kingcom/armips获得8 M- g' m3 b4 z5 }, E$ e% A& k

3 `; H6 D4 k5 f& ~更新版本可去http://buildbot.orphis.net/armips获得" z( Q* z7 v: _% \8 [

( O+ @  f' `2 hARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
# |9 L# u1 i1 f/ Z
: l% o5 D1 W% c) RARMIPS命令行用法:* F- k' _! w$ f! p0 F' [( y

5 W. k( k3 F. q3 O- nUsage: armips [optional parameters] <FILE>
4 x/ w# Y# R& V7 S4 @. ?8 ~1 L6 m  C$ R9 q
Optional parameters:4 b; J. l. l/ [5 x
-temp <TEMP>         Output temporary assembly data to <TEMP> file
% O) O$ J, I/ y8 B' y -sym  <SYM>          Output symbol data in the sym format to <SYM> file
; S* p% L/ m% v; l; B3 z! x -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
6 e7 H2 h8 J+ x2 m -root <ROOT>         Use <ROOT> as working directory during execution
7 ^- E0 L6 g+ D5 J- ]) f -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code0 c/ k: ^5 L$ }/ p
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
$ N# A& x4 B' w9 b+ l  \& q9 r( t3 ] -erroronwarning      Treat all warnings like errors
. R8 Y! n" \0 G% D6 R$ d7 ~9 w2 b8 B/ J& @
File arguments:
* c& Q( ?9 \" V  G/ E* ] <FILE>               Main assembly code file9 a: S4 Y0 \% o% f

1 K! u( O7 N4 s$ X7 V5 d-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
: n: K9 W5 ^7 g# \-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
0 k7 p; o2 \8 C1 R7 a  \  r2 _" \- g-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp& o) d5 `6 n9 L4 N* W
-root <ROOT>参数是指定执行期间要使用的工作目录
4 v5 ?, c1 ]: n-equ <NAME> <VAL>参数用法不明
5 O: y6 E* ~) n-strequ <NAME> <VAL>参数用法不明  Y! B# U/ K" e6 K$ x4 e7 h
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
1 V/ O7 X+ ?( ?& K$ l7 Z% \. T# h; o8 @0 T! v& Q2 }# z9 p
<FILE>是汇编代码文件,可用记事本之类编辑
3 ^- Y. \/ V- m* Y6 }9 j9 A: k3 K* ~) S7 ~' M
注释说明:$ o1 p$ c) D' o% N" w6 z* _- p& d
注释可在单行指令后面“;”和“//”添加
6 V9 @6 g/ R  f“/* */”式也接受) H5 y/ ^1 @) F; M, I
. R/ k  R/ I) i' }  R% U8 \( w
例子:, h& d5 T) H2 m0 d
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000) u$ X4 |: ~$ n. t: l

  H$ z3 _4 N; P.close;/*关闭文件*/' d  A7 D& T% p9 T7 z
- C5 X, W& l7 `  P
标签说明:
/ q$ g; m( Y; p) @/ Z标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。* n6 j6 T' d9 e3 }
/ ?( i. q+ N, }/ A4 i
数值说明:1 f0 X  v# L+ h( Q3 Y
“0xA”和“0Ah”是16进制数值
1 f& a. {: T! T6 d& D“0o12”和“12o”是8进制数值5 C- i2 I" U) S. ^9 ?1 m7 ]+ T
“1010b”和“0b1010”是2进制数值% A/ N. ]# W$ C& M

" C) Z, l" }9 }" Zequ说明:' q2 _# |) M4 x8 W2 Z" A+ _
格式:text equ value7 K# i' q0 i  q0 I# D2 T
说明:用一个text代替value* A8 x+ ^1 d: K; H! M: t8 f
例子:# {0 F8 ?! C! p$ w" K2 h9 }' V
address1 equ 0x12345678
; \4 B8 ^9 J& c* ildr r0,=address1: V2 f) I# C. v# s: f2 w. z  J9 f
.pool
! I. N: p* G5 v
* c$ ^; u0 T) @3 n9 W0 O函数说明:
7 O/ M9 b! \1 p3 Y& X6 N! a
. P9 O, k/ M9 x.open函数:
$ _; y/ e+ k( b0 t5 i  V1 j; ], j% R格式:
# k0 t! [  r; L4 L( M' C! x: K" R" k.open "ROM FileName",offset( [+ z: ?- }  }: Z/ x3 Q* g
.open "Old FileName","New FileName",offset
9 a* _' `8 E8 v5 b/ l7 B. R3 \/ Y; T  u- F) h说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。. [$ u/ o* \& d/ u/ [2 |, W9 R
( G- Y+ p1 d6 }- Q: r# Z; T+ Q
例子:
' _/ _$ `: I: ]9 E9 o# p. j+ L! ]/ x.open "1234.gba",0x08000000
0 D& f( U* ]! \: P2 W3 P+ |5 R. p/ B9 l2 U& [
.close函数和.closefile函数:7 G8 _- i2 k8 K5 s2 ~" S' A% d% J
格式:
' y$ V: v% o9 B/ ?.close) u1 v1 p( d- K9 z) l# g
.closefile
0 C5 s; d8 P* I! D+ ^说明:关闭文件。
- @* d6 B, d; P4 F6 R# K) {5 ^  Q& w7 R
.org函数和.orga函数:& a1 K" M+ t9 O7 e
格式:# ]& o3 P# }! ]$ i' P; W; l4 i
.org RamAddress8 P, {8 R; a% A7 s2 \6 r: a
.orga FileAddress
# {7 E; Q" _; s! G% S说明:
  D: E& I. a# D! ]2 ^前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
- D" l0 S7 [/ }2 h
: K- R" G7 E7 m.orga函数可指定ROM文件的输出地址。
# ]/ G+ R" ~& I: ~6 V( N& t- ]$ u. X! O2 _
.create函数和.createfile函数- n1 g) d: R  H2 }. z' y0 e
格式:
0 l4 [, l" ~2 t- v.create "FileName",offset
6 S- o& J- S" u( q% g.createfile "FileName",offset
5 X/ x) O5 d/ L" r, z) I说明:创建一个文件,如果文件是存在,他会覆盖掉。
5 ?" K8 R5 b) l0 [8 F1 W
3 o+ z8 D3 P* w6 U.area函数/ K4 d. ?0 }2 h9 b- v# e$ a7 h8 Y( J2 K
格式:
# u7 d% v- W; y2 S) x3 }.area SizeEquation[,fill]
4 g* M) H) E# D/ _4 @1 |.endarea8 N, R1 H3 s4 W! c) t& N
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败, g  x: a" y" h+ X/ A$ c
6 `) U, H7 G" V- B. t' D- u' \: v
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据8 B# A/ W& d; }: b: |+ [
org 0x100+ ?- M! P. l0 {# D. Z! e1 D3 o
.area 0x87 p: C0 q  N6 s+ e0 z
byte 0x5,0x6,0x7,0x8
9 Q6 S+ N8 ^$ K3 b.endarea) l# s% ?! m. m  s7 D
4 d$ l. b# y1 \; q: [; ?  r
.align函数2 M0 Z+ h9 e: ]0 @/ t& Y7 g
格式:.align num
+ g$ y# j& y. d! g; R说明:写零字节,num为零字节数量,用16进制表示。& i8 Y3 B: }  h8 H

' d) I8 `! X3 e7 `; F.pool函数0 O- h9 B) I  y' C% y
格式:.pool
$ n0 |8 P- |* J- M0 }说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。4 L: B# W% p+ G" s  ?; P
例子:
: ?3 j5 l4 y/ e5 rldr r0,=0x12345678;
3 k* q( l9 }( Q$ a: o" G  J4 Y....
+ B6 N0 c+ A4 K; f; j.pool" V  N; s  c4 B5 D

+ S! t3 w& s$ e.fill函数
1 y, h0 U$ Y! a* g格式:: D% R: j7 _$ ?0 w! o$ ^
.fill length[,value]
; v: N+ F$ r/ Tdefs length[,value]/ i& b7 A5 ~, G$ `3 B. H& i
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。3 i7 ~) L0 F. d8 @! d3 m+ }8 H5 E
/ \  U( }5 P+ b  b
.skip函数:- J7 l( \% }" u/ s' Z6 z
格式:.skip length0 I/ _/ F  E' C5 }) \
说明:跳过指定长度单字节数值,length用16进制表示。
6 U' g9 e8 u5 W& y, E) Z0 L& D. C8 ?! l# J4 a0 w8 D. s1 ?
写单字节:, {2 Y5 U8 U; t
.byte value[,...]
, a( s$ b8 b- U8 n+ h3 L7 z0 D.db value[,...]% i* b* R1 U4 m% d5 s* [
.ascii value[,...]
) t- b( H# @; }1 ^9 t/ ?1 }.asciiz value[,...]4 P" V7 Y" _2 i9 i
dcb value[,...]
& V+ v  p+ l8 o- g! C6 G3 K  e. ^& u! \# t1 r$ j8 A2 p
写双字节:* a3 k' S; N" m9 B( S: ^: y0 P
.halfword value[,...]4 c% \; c( z5 p5 j
.dh value[,...]# C( h* H3 u9 p+ H- d2 v
dcw value[,...]. f) I+ x/ i8 ]- w$ G

+ }  }) m& O% T1 M( c写四字节:
( w6 H/ h5 r; l.word value[,...]
7 R4 i  }7 _/ f# z" }% ]! ?, Y7 V.dw value[,...]. K9 {: X* a$ W* P+ r5 z
dcd value[,...]
2 h0 Z. V/ G, Z" u7 k; R2 w+ y8 L  P  I9 b# U: v- F+ Z
写doublewords:2 W# e5 S" y0 l, v: v3 }' Z  T
.doubleword value[,...]  w$ l0 \6 ^# e7 ^' x% s4 p
.dd value[,...]
0 }* T: {3 H( a* B9 @dcq value[,...]
' l4 O; i) M# z, Q4 C, a
( B0 a" N; A, C6 M& l9 }写浮点数:
* L# W1 f/ f6 k; G3 `' e& X.float value[,...]
0 g7 o; u/ B+ B$ T4 k- n6 X5 V.double value[,...]
$ }" T5 ?& A1 L" s* X* J9 K
8 P/ Z5 x' H! Y( e$ q0 f" A5 L. UARM的ARM模式和THUMB模式定义:
8 d# i) [% P; o.arm|ARM模式, R1 n: h2 ^" Y" \2 u" e- y
.thumb|thumb模式( d0 U9 k) w* }

/ X7 h+ P: m- |0 R设置架构:
' d( F/ l0 _3 {# n4 P.psx|PlayStation 1(MIPS R3000)4 M! z5 Q: W# I1 ~( m: p2 X9 o
.ps2|PlayStation 2(EmotionEngine)
; p$ e4 K% D! D7 \" Z5 m.psp|PlayStation Portable(Allegrex)7 {! X" r- S, P% @
.n64|Nintendo 64(MIPS R4000)0 l7 h7 u, V/ p& N4 N7 z0 f6 R0 L; `( W
.rsp|Nintendo 64(RSP)# v. T5 O* `  K% E6 Q# u4 E
.gba|GameBoy Advance(ARM7,默认是thumb模式)
' @3 b" Q; {4 U.nds|Nintendo DS(ARM9,默认是ARM模式)
+ Y/ C' m, d: B5 U/ L9 a) U3 c" M( g' Y.3ds|Nintendo 3DS(ARM11,默认是ARM模式)9 B1 i2 s' s; s; N* o
.arm.big|
# P# V$ O. k# d! q  d, ^) M.arm.little|* f, p( L; r2 a8 D& @1 q7 q

9 A. _0 R  T+ t( f: C( d常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
; N1 g( k: O, ?5 ~3 R0 L
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-2-2 16:02 , Processed in 1.074219 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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