EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2207 天

[LV.Master]伴坛终老

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

1 T% p, ^$ T4 {8 K' c5 M) o- K" vARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
8 J, A) v' x. I& P" c
. f% q3 M7 F) z% Q# ]: o+ hARMIPS assembler作者是Kingcom,目前发展到0.9版本* w. |2 E& y+ h# x$ n- `) K& w1 Y
& E1 c% w# R) e8 K6 R3 F6 Y
Kingcom's website:http://aerie.wingdreams.net
" e: A+ n7 N% e% m& \7 d. `$ Z! G; I; P, _4 t
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
! Q4 d1 ]7 _# `; [* g  E
1 q. S& Z; H7 ~: `3 P3 z更新版本可去http://buildbot.orphis.net/armips获得
. I+ i' b: u1 G; P( |3 @8 [1 L) S, H4 t0 E) z  M
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。/ Z( O8 R+ ]  n! V; [

3 m7 R8 S" i, Z  H: c! rARMIPS命令行用法:, P! \$ c; h; u5 g' C: X: l

* z- T& |, z. z2 y" xUsage: armips [optional parameters] <FILE>
6 G: o$ T) Y4 V9 A4 v9 `& B1 e5 f, _5 e/ w+ _. H5 t
Optional parameters:; Y8 ~+ F2 T( B- T2 `" g9 l
-temp <TEMP>         Output temporary assembly data to <TEMP> file
7 B4 U6 F2 `6 p- F7 ^: M) ^ -sym  <SYM>          Output symbol data in the sym format to <SYM> file& q( u1 O4 a* X; t( ?$ F; q& R
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file4 d7 g" `4 o9 w( p. B: o3 W  Q4 i& q
-root <ROOT>         Use <ROOT> as working directory during execution
5 k3 P% e+ r1 u7 W. y: [* b -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code/ b# t' U9 A1 x; U1 F" S
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
. e2 S9 d: `8 m1 f -erroronwarning      Treat all warnings like errors
' y2 M+ w" v9 V( g9 o6 B& _
" K, S* O: }- }% bFile arguments:
  y9 t+ n, @5 D4 @2 l <FILE>               Main assembly code file
9 ~6 O7 M2 I9 ?* V; E" u3 W: e1 J! R! y6 E3 t" e, ~
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
. E9 n( {. H+ D( ]) `7 k- s-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
$ I! Q; v1 W, W! X: S-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
; h% k! `2 D% h: ^-root <ROOT>参数是指定执行期间要使用的工作目录
! {8 s# S5 v: H; O-equ <NAME> <VAL>参数用法不明
& Z1 \4 Z( q' b; g6 ]-strequ <NAME> <VAL>参数用法不明( h, D+ S7 B' I" @6 s+ j8 ^  A9 r
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
/ \5 W7 A2 p2 p  N6 L2 s% f' G1 j  }8 s% u. a1 c8 }
<FILE>是汇编代码文件,可用记事本之类编辑4 j1 U" t, C8 k3 S2 T3 e" Z( h
$ U: K3 G9 A0 X( E8 P' i3 _
注释说明:
! u7 Z4 }- a0 E2 C, p2 D7 l注释可在单行指令后面“;”和“//”添加% P9 f. g; I. h  m8 Z
“/* */”式也接受$ J3 R% n9 W. P

0 u" z- y2 {4 {8 a1 T0 X9 K例子:
; }3 v8 m0 i# V: H/ {, {.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
% p% p" M5 @4 P! B* h
9 M. ^! {1 v) {5 E2 }.close;/*关闭文件*/
  z9 c# A& o2 |( ]) I4 M1 t! Y# e( h
标签说明:4 \+ ~( e) e0 t! h: c! r7 b
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。  n/ Z: s8 U7 l' }

- k! r* J5 O3 }5 ~# ^数值说明:
/ V* N) r/ g3 p( b) l; p( G“0xA”和“0Ah”是16进制数值2 h# D0 V  |- o1 h- f
“0o12”和“12o”是8进制数值
3 I* m5 ?, p! h4 ]“1010b”和“0b1010”是2进制数值& H$ n) |+ i5 Q6 w5 W7 e  W  Z% K- m

! I/ f" h  f$ F$ ?$ V2 H, u# T8 K" Pequ说明:& y: u9 F1 b7 H" |- Q) T  S
格式:text equ value1 D6 i' d6 @4 U: r% H
说明:用一个text代替value% `3 V6 D" ?1 f- _0 _, S
例子:
2 S' G; p' O* X4 W- ?0 Faddress1 equ 0x123456789 y: O7 \5 q  h/ ~* [
ldr r0,=address1
8 x2 `! t, f* g.pool+ t, P2 v3 i! y4 A+ K

. X/ ?* H  D9 N& v; d. _9 ~函数说明:
% j  Y( j) H* H' s- d3 _- E
- M6 Q& W) n7 z8 n1 L: a# ^0 \8 @.open函数:7 B3 L# M! Q, i
格式:
1 d" c; i- C6 u$ g" @' x3 V.open "ROM FileName",offset2 A) ]7 K) h6 G$ I7 p0 B, ^
.open "Old FileName","New FileName",offset
  K, n: [* o. @3 Q0 r4 b- L说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
2 K# |% ~: N* Q5 K/ j- E  h$ T9 R; x! b- s4 R4 k; r  Q
例子:$ k2 p4 O8 }" S. ~
.open "1234.gba",0x080000009 r! e/ c0 Y2 a3 ?2 S3 R

& h- j; P( ?2 @8 S3 e; |.close函数和.closefile函数:
1 S- p3 |) s, q5 V& F* @格式:
+ B/ `( {' F4 R/ y5 _/ Q; s% Z.close: Y7 }) q# w) M2 p* Q) b+ `1 T
.closefile
$ d$ l# b" {! d" F$ C+ w说明:关闭文件。
+ R& w: w( Q: w
2 ?0 b' u2 H3 c.org函数和.orga函数:
$ T% `( J* Q  N3 e; T- k格式:
# b( P5 Z8 c4 G& l.org RamAddress
# ~$ z6 a. h* }.orga FileAddress
% Z+ X- x# `+ e; Y. Q& A说明:7 X& C3 O% N2 g. I
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。/ r8 H) N: H2 c+ c( a: |; P1 R

5 y1 H1 @+ R" V7 j5 ~0 h.orga函数可指定ROM文件的输出地址。
( |9 v/ T: B3 b. u/ @8 w- U. H' F; ?( x) M7 H/ T
.create函数和.createfile函数, s; f* p4 a( ~* k8 t; Q+ ?) z
格式:0 [7 N5 J: v$ k* E* V8 @; p
.create "FileName",offset: `5 i! h' q/ ^1 Y& U, `5 X
.createfile "FileName",offset
' \9 B1 J  `, N说明:创建一个文件,如果文件是存在,他会覆盖掉。
, f; I3 X* k  A3 _  C' C/ B0 w, c: L( W0 |
.area函数7 E2 A! l( T8 G3 l! M% G; f
格式:7 g) K$ ~' M6 v5 @* A$ N/ ?
.area SizeEquation[,fill]7 U3 l" m4 Q' [: Z
.endarea8 M3 S  U- W$ Z# X* o
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败4 N" A; ^( o, I- I9 i2 ~) V# w' [
6 e3 i+ k  Q  M
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据% g7 A/ K/ N( ^) `8 C) ?) ~4 m" w
org 0x100
. }7 P+ |) A8 N& |.area 0x8
. ~+ p: `6 b6 J$ t8 F9 g* Obyte 0x5,0x6,0x7,0x84 z$ G8 B: \* r
.endarea
1 {1 [- F# a+ o6 d% E
$ v! V& p# V( a  |.align函数+ }( A: g$ s* M) r
格式:.align num
" s$ S( L) p4 G; p说明:写零字节,num为零字节数量,用16进制表示。
6 B3 V8 K9 w) ?1 h! t2 H' L# ~
. z9 n. F% v* ~* n' `$ \1 @.pool函数9 R" o& I2 g6 d- u% I
格式:.pool
$ r  B8 [4 P$ j+ P, E# G说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。. Y7 W# h) n9 z; c! L
例子:1 o) Q6 g3 e5 {- M2 K$ _5 v
ldr r0,=0x12345678;! U7 m1 U* E" V6 T. u9 F) p
....
5 }8 {9 `( |% O: @: y  J0 I  ~.pool
/ k% K2 m: _/ v' r! P" F& L! @# n1 Y6 M
.fill函数
" P. ^) l, v4 l: f9 a7 A2 {格式:
/ b+ C0 y' y' X2 F+ ].fill length[,value]
1 Z3 @" i# h$ Sdefs length[,value]
7 h1 j9 y8 x  U) `* K说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
, k% r$ d9 X. n! c2 `2 J7 h, b! I: n- c  _* \* B& h4 v
.skip函数:+ J: E" [& c( ~2 d2 \3 {( ^
格式:.skip length' q  k, _) \0 E" N* f
说明:跳过指定长度单字节数值,length用16进制表示。) n$ d' a" h& J, d5 l

+ N' J- z  v& y+ V3 z9 w写单字节:
$ @) ^# v6 H* m5 K- }0 g. y.byte value[,...]. ]6 A3 u/ z+ Y/ c
.db value[,...]
  s2 H: y3 C, w: W$ o! |.ascii value[,...]9 l4 o1 u# k9 e1 G2 ~% m
.asciiz value[,...]$ ^0 s9 V- k+ ^1 |* z4 ]
dcb value[,...]
2 }! o6 O6 g: }# s* P2 D3 k$ s, g6 r9 e
写双字节:4 v; a' N9 Q+ {' p  o9 N
.halfword value[,...]$ R) ]; M1 f2 v4 q( ]
.dh value[,...]* p9 r( O" m. L9 z4 u- l% F
dcw value[,...]& ]1 E% f: S8 O0 m. w( ]7 P8 j$ V

  K, w/ Q3 X5 t- n3 f' z写四字节:5 E, a2 N) n# l! ^+ d- j
.word value[,...]
& N% E6 q; x" x.dw value[,...]3 q9 c7 o! X/ O6 o
dcd value[,...]% e. f* e3 [0 _4 {( v* f
  q' k' N" T4 [* M' t, U# d3 l
写doublewords:
% H# M5 ^: e4 Z) ^) A# N* Q.doubleword value[,...]
% j+ \2 b6 `9 Y2 d; h0 U.dd value[,...]
; D3 V/ Y# t$ I' m* _dcq value[,...]
3 ]! E# s1 U' C# `. R5 `0 ~
7 c% p0 f# i* @$ i4 t6 a  c写浮点数:
! g* p+ {3 B2 k- t7 r: p.float value[,...]7 I/ R- {1 K; f1 l6 f! p
.double value[,...], i, T9 J, S0 F5 D8 D! _4 f) f' d

1 B' H5 g0 B8 g8 F0 wARM的ARM模式和THUMB模式定义:6 k/ U3 b' x1 f" c6 d
.arm|ARM模式! J) f- u& T1 `- {* g/ V' T9 I
.thumb|thumb模式$ {' H( O: u# M3 k9 I
8 g" M7 m3 R4 E
设置架构:& L8 M8 p. Z- x  ]; K; b
.psx|PlayStation 1(MIPS R3000)6 i0 m4 d, t& N  }' ^
.ps2|PlayStation 2(EmotionEngine)8 K) e; c# ?2 J. P' j  f; m
.psp|PlayStation Portable(Allegrex)( P% ~3 W% ?; ^6 D' e
.n64|Nintendo 64(MIPS R4000)$ Y# g. T8 a/ ~  ^
.rsp|Nintendo 64(RSP)5 _. R: I3 d) J" i
.gba|GameBoy Advance(ARM7,默认是thumb模式)
+ v2 _0 j; X0 U* o' m& I.nds|Nintendo DS(ARM9,默认是ARM模式)
, N& y( r& B( ~.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
- r; _: \9 v2 M* ]" |# H9 w: D8 ~3 g.arm.big|" @; b- y  t' p1 c& t1 Q
.arm.little|
! }; K$ E, ]6 L
) W  s0 J* A: j% d4 {常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。1 p2 n$ a) R! K5 T
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-30 11:57 , Processed in 1.083984 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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