EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2190 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
6 v; T3 Z( W/ L+ w0 y9 y0 o4 j
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000! Y7 c& F5 W, @0 |

, M3 u! F$ n+ E5 t' @# c* AARMIPS assembler作者是Kingcom,目前发展到0.9版本. n7 Q7 q7 k# A" ?- j" G

* \6 D3 A' J* o+ j& G3 M1 l" DKingcom's website:http://aerie.wingdreams.net# d- {* K9 g9 _7 s/ h* |
5 M1 Z2 u! q9 N: ^
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
6 {: i2 d* v8 j/ H" I
! G  F2 w# r) c9 D+ @4 q更新版本可去http://buildbot.orphis.net/armips获得0 `9 |! d  M# a  o
/ z& p+ r: I5 ]
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。2 N: H! ^5 [* n" p! D0 H

1 ], M) O  w0 X. `% \/ M3 E8 XARMIPS命令行用法:$ x; p+ K) X9 w% X: k
8 O6 T& Q  {4 B9 A. \3 O
Usage: armips [optional parameters] <FILE>7 [+ [3 S2 V1 X+ i; r

3 ]$ X: s, ]  k) u) x# H! bOptional parameters:% }2 L1 j' A: }# F
-temp <TEMP>         Output temporary assembly data to <TEMP> file3 a  o8 i& b; ?3 R5 k1 k
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
- U/ ~7 Y6 M+ c+ f  r! E8 D; {2 k/ h -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file9 m9 B: b$ D; v. z
-root <ROOT>         Use <ROOT> as working directory during execution  \9 v- W; B8 s: m% T
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
  L5 v4 H, f& ]0 L7 a -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
: B8 \0 D6 B. [/ |2 \ -erroronwarning      Treat all warnings like errors
  K, e* \! V- E6 w' U+ W. m3 N* _9 v4 ?  ?+ }0 u
File arguments:2 P6 t, t* z6 B5 v3 _, q8 R- V" M' o
<FILE>               Main assembly code file
5 ^( _, w* s  [+ t  G3 T  d5 K
/ y1 u2 x: Z1 A) c-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
& @  `! v4 V; F3 x* F( ~; C4 E-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba8 o5 K! W7 k5 c6 L2 c) Q* \" X
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp( u1 f2 n& _5 J/ w0 s6 g/ T4 G
-root <ROOT>参数是指定执行期间要使用的工作目录$ Q! I  h; u3 a. [  O% n, }% C% Y
-equ <NAME> <VAL>参数用法不明7 _6 I" K5 p3 A. {  @2 d: W
-strequ <NAME> <VAL>参数用法不明9 L- j7 S" P7 ~; q3 o
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译4 D9 ?/ ^. `0 I7 a
3 P0 X1 k% v/ D8 X
<FILE>是汇编代码文件,可用记事本之类编辑5 b; q9 }% b# p4 k$ Y6 U- p* {

. v, A6 M# {7 A* f2 K注释说明:0 l, t/ U- v) k8 D6 V2 i2 ], K; s
注释可在单行指令后面“;”和“//”添加
# g; F( l( [' l  a5 s7 D$ b“/* */”式也接受- ]- @: k; Y) _! t% F0 j; d6 `

# d' [/ D( P0 }& F8 G例子:' w9 l0 W" S, V) d# d* O
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000, U3 ~% x! l1 P' ^

, J; m0 g- Q/ w6 V.close;/*关闭文件*/9 j/ L# _6 b9 V  @0 j( @" Y3 X! @- i
6 U" x$ `2 V0 i6 `" ^3 K
标签说明:
3 ?7 \- f, Q# I* `; t  X% N标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。3 N) T' Y/ B  Q2 N' d+ s

$ O- ^  _; _" p) P- E( E% s3 c数值说明:9 W! W' z0 ?) x4 P6 g5 q7 Z
“0xA”和“0Ah”是16进制数值7 D: ^7 v! L/ D
“0o12”和“12o”是8进制数值. K2 J0 |6 a0 d7 }
“1010b”和“0b1010”是2进制数值
8 L6 H& w' I0 h; D* E/ ]
2 Q; g  l" e6 A! V7 pequ说明:7 l; t4 d9 G; f6 r
格式:text equ value
. D$ p4 d. P6 H说明:用一个text代替value
) O# z+ T# O' O" K例子:
3 q( F- G, C) a. ^) I! Z; c! Paddress1 equ 0x12345678
: r& L- `' o) Lldr r0,=address1. ~1 N- S0 J# z, [
.pool
2 C# T! F& q# {1 f2 C8 D" M5 I4 ?" o6 K  S6 y- p9 u
函数说明:+ N3 N+ X) r0 z" Z+ d! P- a! }
# Q4 p3 n- }* g* A
.open函数:
, H# L% l. b, L- N& U5 M- }, C格式:
- p: p6 \2 n  v3 [, h. J.open "ROM FileName",offset9 x! B& b. z6 v  H) ^0 E4 z/ l
.open "Old FileName","New FileName",offset
- G9 D. }: s$ x6 z说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。" {# c& U/ H$ b9 a  y7 @6 ]

8 V7 f+ v7 f2 E( L4 A例子:
  W2 ^1 x: E! |4 w.open "1234.gba",0x08000000
7 F# o, ~2 X9 m1 P
: A  I0 T; n7 ^& q, O4 j# c3 ?.close函数和.closefile函数:
: [" c' E& Y3 m8 L* e; m. H格式:$ N' K$ R3 d- F# u' X4 G7 i
.close
. ?& x9 m; S( c( ?! y.closefile6 w) G2 g1 s/ ~( ]7 n/ q) j
说明:关闭文件。
4 r: H9 R1 M/ I$ Q
" v" ?! {2 Z) k$ W6 ].org函数和.orga函数:
9 P- B- K* c/ u( S7 _% x, N! T格式:! f9 [- |3 b$ ~4 O
.org RamAddress
! k: Z0 ~  G! b3 D. `) }1 T5 o.orga FileAddress& g' k7 t# [& s& D0 V+ L# \
说明:
0 x$ [$ W9 {, j% f7 j6 K( H前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。' o: C( e- t& p$ t
8 o* B0 f# E1 Y
.orga函数可指定ROM文件的输出地址。
- w. t* j. V$ ~2 l# S  `( H# p. X, I. s' ~: n" B/ _
.create函数和.createfile函数( K. u, Z, [+ _
格式:- P2 _' b. o/ B4 Y- x3 r
.create "FileName",offset4 o" ]: ~( c9 d: E$ H3 s
.createfile "FileName",offset
" [7 U" e  y' ^6 m! O说明:创建一个文件,如果文件是存在,他会覆盖掉。
6 }5 C% O) `8 r4 O) c7 O; ^: c- t- e) W3 }2 \% _* ~$ ~3 I
.area函数) i! C; H1 O1 E9 c& `% b
格式:
: s8 p7 T! U# l& T8 w2 s# b0 k.area SizeEquation[,fill]; I- P1 L, A5 V# v) q+ u
.endarea% d  ]/ D7 E- b$ s7 H
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
6 |% x" t- B& I$ Q# }% H; X7 B& r3 J6 z: ?, X' e
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
5 y! R% `" v0 b* s" o1 `; Eorg 0x100; P' a! a) r& k5 J
.area 0x8! A7 A0 K' {# v6 p
byte 0x5,0x6,0x7,0x8
; V2 ^0 [$ t1 l* _7 E) [.endarea, j% ^6 |3 q( B6 w- r* Y: }2 j

2 P+ I8 ~  e, r0 t& e  X  ]2 B.align函数# Z" i6 K7 T$ G* G! `9 m. ~
格式:.align num3 {% m2 S8 t3 J1 }7 x
说明:写零字节,num为零字节数量,用16进制表示。
2 l1 z7 X5 M: B3 l
3 _! D7 b% ?  E; l. [# N; k.pool函数; ]1 _& }6 x, [
格式:.pool
6 Y6 E0 w) \1 {说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。+ m* h5 p6 q6 K8 ^
例子:
( y1 R- X- A$ ?. w) P- lldr r0,=0x12345678;
5 I4 Z" f% H! @& X....! \) ?$ l7 R8 }" g0 _
.pool& m' h. y6 F3 F8 L# }, g; m+ u
) K0 }1 H4 R* M  o
.fill函数; Y+ J9 Z" X1 x6 U, @1 H
格式:# o) G+ H4 k" A& `4 g2 C% |
.fill length[,value]1 T" W5 h# O) U) Z
defs length[,value]" o; y" ]9 X. p
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。; L* u0 B# o; F. C) D! K
! Z7 l2 c: g$ }, f1 k) U
.skip函数:# r4 o! x' m8 {0 a0 }
格式:.skip length
. X# O: q; h3 Q) ]说明:跳过指定长度单字节数值,length用16进制表示。& O; p# ~: ]0 V$ Y' E7 _/ g4 E
" D& S5 P' ]! H
写单字节:4 @. e$ S7 t" {7 |
.byte value[,...]
) ^( H: D+ o3 z! [6 O.db value[,...]- I4 P- H% N3 ~% I+ K5 t, X
.ascii value[,...]
" f( f& K+ Y8 Z0 C4 J.asciiz value[,...]
; l7 e5 V  M: D/ V, q5 W% Ndcb value[,...]
3 P! k, {! K6 G, i4 N" U3 o  U- V2 H
写双字节:3 p% `) k& v4 s1 o; A
.halfword value[,...]
/ |. P: Q1 O& ~( r, I8 q9 x2 w! q.dh value[,...]
* I: [! L* [# M1 J$ b7 ddcw value[,...]
+ }# Z. t' y2 }+ S; I; p5 P* r1 O
写四字节:
9 E. Y, r; X$ m1 u.word value[,...]
( d( B8 A9 v  Q# ^% q& @4 ^.dw value[,...]6 F& m+ [6 Z: K% ]8 P2 ?
dcd value[,...]* c1 z" R8 u  |; m9 Y9 H) h6 i
: }, C& K) \, a+ q! w( j5 o2 [
写doublewords:5 ^% K( f/ r% S+ g. p+ _+ F3 m9 `
.doubleword value[,...]
  V2 S- k; C1 _.dd value[,...]
! c1 F- }& L$ T: Z- }  Ddcq value[,...]
$ p. r4 A" _- K6 `/ B. |" ]$ s
) d4 C7 Z# T( W写浮点数:
" Y3 I! l; E$ l% _.float value[,...]" J, ?6 c$ i) l0 I5 a' u$ }
.double value[,...]
" w0 U6 a! H; Y9 F/ |# x, B1 R2 Y
  E, M  c( I- S0 \0 BARM的ARM模式和THUMB模式定义:4 k+ l! d2 g5 V' M3 x. W; S- M! |
.arm|ARM模式
# ^# X6 |5 B/ s% C2 {" q.thumb|thumb模式
* B0 M  q3 z& _; m, A' _& R& i/ t+ K* C% n! C
设置架构:1 R  z- t( g1 I6 h: a
.psx|PlayStation 1(MIPS R3000)
. X: A/ x5 N% A% Y.ps2|PlayStation 2(EmotionEngine)# x( L7 u) M& A
.psp|PlayStation Portable(Allegrex); K4 r1 g6 O! p
.n64|Nintendo 64(MIPS R4000)# k$ z" E; m  D) f! Y% z
.rsp|Nintendo 64(RSP)* X: C& V3 P$ u
.gba|GameBoy Advance(ARM7,默认是thumb模式)
/ @; O( k% N# K" E" o4 I.nds|Nintendo DS(ARM9,默认是ARM模式)9 Q3 Y- w0 j$ Q* m
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
# Z; p) ^1 `- ?/ x0 ?.arm.big|/ F$ a+ `2 B  H( i- h3 |5 ]  J
.arm.little|
! i; g8 h8 j# n5 e
: W* d( [4 w$ B1 O) W常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。2 s, ]5 f4 G. L' A( C
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-14 00:03 , Processed in 1.080078 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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