EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2162 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
# D! N+ U0 E. j* N' l0 Z+ N
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
: c4 j/ }3 Q: ~* d. a) m4 j; W. }: l" E
ARMIPS assembler作者是Kingcom,目前发展到0.9版本* w1 i+ T% X5 Y( |1 A) w
2 W" Y- ^4 j0 d! w7 r7 n
Kingcom's website:http://aerie.wingdreams.net
8 C" m! }. p, g# {0 [4 E
3 p4 e5 l6 _+ JARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
! Y7 V0 `6 @0 t* F7 f5 @6 s- X8 B& V' Z: t
更新版本可去http://buildbot.orphis.net/armips获得& a( q) ~; H8 f$ ^. G" g

( d- w" d! @* a5 u- TARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
0 c5 F5 J& r# |0 n; `+ ~2 l3 l; H5 _4 V; l7 J( l' I) j
ARMIPS命令行用法:
( o; Q7 h3 Z8 X. H: b5 ~8 w( I5 E' p3 w1 Q/ t
Usage: armips [optional parameters] <FILE>
- m1 Z1 V. z  B+ d5 A+ t% j$ e. C9 H# I; S. S+ ^. i( X, ^
Optional parameters:
% B5 j+ U4 s0 r" E8 t4 o1 y7 G -temp <TEMP>         Output temporary assembly data to <TEMP> file- ~" _) N& }. ^8 \& G4 s- i6 ~
-sym  <SYM>          Output symbol data in the sym format to <SYM> file2 L" [* t, I4 l
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file2 |) q1 N# W1 b/ a" y: d! Y, Y" Z- U
-root <ROOT>         Use <ROOT> as working directory during execution
3 X) M- o' Z6 G. U, r -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code9 T1 E& J" h" i% Q6 [3 K
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
/ @# W% ]2 Z8 h  e- l  V, ~ -erroronwarning      Treat all warnings like errors
0 f& {& f: L( E) y8 b9 B1 K" f
+ I$ _) ]4 o8 F9 Y( G  @- oFile arguments:) U, x! o  S9 ^/ D" i" Y
<FILE>               Main assembly code file
8 U0 z9 p8 c. E9 [2 L, W! c4 J
( \/ Q6 B4 B; c, ^7 [-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件# d; o& W% N% f- T- ]+ W6 i8 ^
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba/ W9 u$ a9 ?# ^6 I9 ?3 B  S: ?
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
) T' L: z5 S- K# M" d# E5 L2 R7 `-root <ROOT>参数是指定执行期间要使用的工作目录
9 e; j" M8 d2 s0 C; b2 ~-equ <NAME> <VAL>参数用法不明
8 `3 @. }$ @4 {$ l-strequ <NAME> <VAL>参数用法不明
* D* N& O0 l5 b5 N- N, j6 \: a3 `-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译; l/ O6 i& \8 s% }  x

; H* B) f# t3 L$ u. Z9 r! Q! P<FILE>是汇编代码文件,可用记事本之类编辑% @. R( R( ~, ?8 A$ `5 l

; _) O. H9 E; G  F2 c$ m  D! [( a注释说明:
* r& b) d. v/ B: X( |% k1 P. @1 L8 G注释可在单行指令后面“;”和“//”添加  N' }, k9 R" @$ J  m
“/* */”式也接受
- Z/ `# Q& P, e. n- I: I' ^- d) L+ E1 P' m* y. a
例子:
2 c9 Y! s" N! v4 t/ V.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
* X, t$ z1 J, A! ?3 P+ A2 X9 p
; }  [, ?& f% U6 l7 u* C.close;/*关闭文件*/
5 ?) j0 F& ~# \2 ^! C
6 s  }2 p- d, C' [标签说明:
% Y; n1 _" k4 P# {标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。& M  N/ I; L* U# X+ h2 k

. k0 C1 a/ h( O6 F, V# c7 ?# f0 ~数值说明:
' R" ^' p- [6 x/ t4 D“0xA”和“0Ah”是16进制数值. n; I$ e' X# l8 J) u% U
“0o12”和“12o”是8进制数值" H7 F. G1 K9 B1 z! l
“1010b”和“0b1010”是2进制数值2 e: U0 q2 t- H

2 T% n0 s: z4 e* ?: oequ说明:
  q- e7 @# u2 ^  Y) _2 J( G0 }格式:text equ value6 i* I" o& D: @1 d7 M; [$ s! I
说明:用一个text代替value' R, o1 c' b' L8 V6 g3 l
例子:
4 G1 t* L& P- @; A: g6 gaddress1 equ 0x12345678
4 p& i2 `7 m4 J1 u. }ldr r0,=address1
" r$ G2 J* c2 y% H7 P.pool  {- o9 B! T2 D+ I/ n
' r( w  @& }$ h- L9 g# P. h
函数说明:
8 X9 d* H, M* Q# c2 Y
& o0 p/ s  L/ T& d.open函数:; q' n3 u4 W6 e- _2 G+ f
格式:
% }/ ?# `' z+ d, P/ J.open "ROM FileName",offset
3 X$ P1 V/ a3 _" p- ^5 x6 c/ A.open "Old FileName","New FileName",offset0 \0 g7 {( G5 \- Z1 V
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。  p$ X) O/ z3 p$ Q

* v/ _# S3 \2 R+ k& [. E- M! X# a4 H例子:2 [9 @' b2 w) p7 X8 f7 L# l, d3 z
.open "1234.gba",0x08000000- x" T: o% X. W/ _" J
$ ?+ _4 `$ A! R: w
.close函数和.closefile函数:
- ~* L6 C; o% V  g' k" M格式:
" l! X+ T, Q1 X# L/ q.close
( Z2 A0 m) b6 z3 U4 j4 s9 h.closefile# D) e4 V7 @7 @1 S6 Y6 z
说明:关闭文件。
- X) b) d' x8 o4 n8 z: N
/ D! D2 D& W* F& `0 W* E.org函数和.orga函数:$ P9 ]$ Z! r6 `  d& W  Y$ E6 S
格式:
2 ?: b2 E- f8 b/ A( S1 }.org RamAddress9 c6 X) a' B" q( C
.orga FileAddress. o; E4 e) J9 T( i! a
说明:
* L  d1 `' ^# c! j2 f前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。% O1 u" D/ E5 e  \- ~/ v) U

: F) B3 B2 |. {4 ]1 l6 _7 D.orga函数可指定ROM文件的输出地址。
) H! ]- r0 ^; B6 D! M
, [- I) [5 Q4 D) K+ u% Y.create函数和.createfile函数7 o; O; l9 _" F
格式:. Z: w' m# |9 D& X9 i
.create "FileName",offset
) O4 A/ r4 R" n.createfile "FileName",offset
' O* L" S- Q# C) W说明:创建一个文件,如果文件是存在,他会覆盖掉。4 w% F% ^/ X+ O( O4 l9 ~
3 E% v+ F) \9 ?+ C6 O  v
.area函数+ ]( K9 Y# D( h& |3 j3 O/ t" O
格式:
' I$ l5 P" X; h.area SizeEquation[,fill]" ?# O. M6 ~4 b- b( @; y4 h& I
.endarea
- t0 ^+ s/ d: V1 B说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
# q. p+ @9 b! i' p6 ]" t$ X  Q
! [. H3 x1 V4 i. T$ F$ I! H7 Z( Z例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据6 ?- b) |( n" |  O
org 0x100
4 j4 x# \  a% o2 w2 C; M; p/ @  X.area 0x8
" d( E/ z* t/ O: Z! O% Q3 q  Abyte 0x5,0x6,0x7,0x8& D& c* q: a* \. `+ s
.endarea: R5 M2 w3 F! T" U9 Z4 x$ j: ~3 A2 N
# h7 |9 Q9 Q3 @0 i2 G7 I' Y
.align函数
9 y; K2 ?; u) Z  t* j格式:.align num- D8 D+ {; }5 A% j6 |" H. b
说明:写零字节,num为零字节数量,用16进制表示。& O* d* t6 Z( g% p! j- z* Q
" v& D4 J+ q2 Y3 s! j
.pool函数
0 S$ B" L" R" \% E- L0 d格式:.pool
/ y4 a( y( k* x* x" F说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。- @( f1 k7 B" N% ~
例子:
2 T# ]( |& [% rldr r0,=0x12345678;) E  y. `- V8 t9 `; O0 h4 n4 l
....
/ x4 M& f0 C% o  k( C.pool
7 n6 {5 i2 E. F1 S) l# j) K3 E5 Q9 `; A( |3 p
.fill函数7 N2 J8 d- k; w  Z# T6 X
格式:2 |9 z, W, |0 U. i0 c
.fill length[,value]
! w' u! O4 W! a8 F8 T- J+ u$ edefs length[,value]
" T, [7 Y# C6 h说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。5 ~% E4 r4 T! A1 H- s2 S/ X3 ]. e
! ]0 O% A  w5 X  a9 K2 N; ~. ^& {
.skip函数:
5 K* j5 t* [1 l) l, k+ [# p格式:.skip length
+ _/ ]  g- f( h0 }1 g/ T/ C说明:跳过指定长度单字节数值,length用16进制表示。9 F, B0 r, O4 b
! u8 Z7 a) b& b5 i. t2 F
写单字节:
6 S3 h3 a* \" a.byte value[,...]7 D8 F0 }$ t' @" q
.db value[,...]8 U+ Z& q/ I" ~4 O8 X
.ascii value[,...]
5 Y; z$ I! e% ?7 C: Q7 S* L9 h, F.asciiz value[,...]8 L* m* o  U% V$ `5 E
dcb value[,...]
+ E& a- |- y' b5 t3 N, \# i9 w0 g% w( r
写双字节:& [% |) {4 ^/ z7 T6 p$ q8 z( j# z
.halfword value[,...]
$ Z1 R8 u- _4 J* x.dh value[,...]
/ e# x+ C$ `! P: x5 r$ s/ Q, odcw value[,...]* h" e% A7 l5 H
: `8 D/ k, K8 k6 Q9 w8 U
写四字节:3 m. m, F0 h8 j& h4 a+ O, Q7 j
.word value[,...]
  C  f) A: x1 `+ [1 L; ~& Y.dw value[,...]- \) {: P" p+ }& S/ o
dcd value[,...]: q3 t% X# [$ M: l3 \. a2 `

% G5 z& y0 a! O" O写doublewords:
/ U+ j6 r) Z' |0 [) B.doubleword value[,...]! M/ a- |; C8 Z0 m0 m% F2 I; b
.dd value[,...]( `- y+ U( k- e6 ~/ L( t- j8 }- ?$ g* c7 b
dcq value[,...]
7 ~, S) W0 Q3 l# v; B1 ]7 p
- P9 W2 l! E- Q7 L, r% v3 k' H写浮点数:' U) m) ^* M3 L. c+ Y  P9 s
.float value[,...]
3 U( @  [  F. X2 ]& n4 y6 Y.double value[,...]
! ^5 }4 {5 o$ ?& R9 e0 z, i& b. k& P  Q4 G% S
ARM的ARM模式和THUMB模式定义:
6 n2 `9 V$ \2 ~8 k.arm|ARM模式
) D) ^+ Q) M2 m) x.thumb|thumb模式
& h3 D8 ]; ~- L8 z5 R  G
% o7 |. z  |, ]) Y7 k设置架构:4 V& g4 H# T5 h
.psx|PlayStation 1(MIPS R3000)' j. D* q. d' o5 ^5 g7 J
.ps2|PlayStation 2(EmotionEngine)
0 }/ z" c4 t! `: x3 n; z4 _1 Q.psp|PlayStation Portable(Allegrex)+ F$ U& R# Y9 S% M+ r/ I' ^
.n64|Nintendo 64(MIPS R4000)& {) j$ {: ^  C  f* [$ |
.rsp|Nintendo 64(RSP)3 W2 w) j* a9 Z/ Q- J$ P' X
.gba|GameBoy Advance(ARM7,默认是thumb模式)  M3 `9 E% ?4 H' @2 r; A9 U$ d
.nds|Nintendo DS(ARM9,默认是ARM模式)
2 Q+ z( A2 E0 D6 ^% Z: s4 r.3ds|Nintendo 3DS(ARM11,默认是ARM模式)$ E7 [$ u' |# Q3 ~) p$ g2 m
.arm.big|# {; ]4 P: i& ^
.arm.little|
0 v7 _1 j/ \; J% R3 T" N
7 s7 _! M2 Z6 F/ w5 r常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
7 _( A, v$ Q4 Z+ t/ @, p  v
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-16 21:38 , Processed in 1.077148 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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