EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2130 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
6 e6 d$ a5 O! i+ b: x: A- ]
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000$ h+ x$ |9 `/ z

" w, K0 \; C# y8 \0 QARMIPS assembler作者是Kingcom,目前发展到0.9版本& \+ t7 \: f  x! z' a/ [+ a

/ Z. ~: D1 J2 z4 ?Kingcom's website:http://aerie.wingdreams.net
8 y$ G( t) g  ]% H8 S! D
4 A8 e$ u# h8 w( R# SARMIPS assembler源代码可去https://github.com/Kingcom/armips获得; q1 w5 n, I- F9 ^
- ~* Z0 V+ j' [6 T! G6 |# J2 n7 m( T
更新版本可去http://buildbot.orphis.net/armips获得& {  M# E3 ?$ t5 J
: `% y9 T, S  T# u3 {& d
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
9 b8 j  X" Z+ [" m: i9 E/ z; T  G! E0 V
ARMIPS命令行用法:
1 p7 [6 T1 M9 n$ a+ b- ?- [9 x5 Y: [" O- Y" N- I8 W& |
Usage: armips [optional parameters] <FILE># c* V7 r- c$ P4 N4 F

6 C; d$ Z+ }) B6 d9 q& VOptional parameters:9 G( k/ `* Q2 ?* }' m9 u2 C$ K
-temp <TEMP>         Output temporary assembly data to <TEMP> file, x9 u+ }7 O2 p9 ?7 R! ]: ~
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
8 d4 s* c/ X! R9 B7 h1 m -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
4 |- Z+ ?* m* A/ ?! Z/ W9 c -root <ROOT>         Use <ROOT> as working directory during execution. u: ~- @6 P+ W3 Y
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
& t" }6 c! V( w -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code9 z. P/ o4 f6 Y1 x0 Q
-erroronwarning      Treat all warnings like errors1 R8 T( \; z! @: V5 x: C

9 ^/ t4 y6 C) S* J  d* ~, iFile arguments:
3 s6 T6 k# n* e) X0 h <FILE>               Main assembly code file
. a$ I7 b6 S! u+ Y5 L" U
% \1 q' ]' {0 A# |! Z5 F+ y+ x-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件* r4 n6 j4 u$ n, g! }6 V& V
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba) Q0 J4 j* Q9 ~+ K% M
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp5 B0 R. j- y4 x9 W3 S8 ?
-root <ROOT>参数是指定执行期间要使用的工作目录, l7 ]2 i6 {" M9 I
-equ <NAME> <VAL>参数用法不明
, L: _- A- {6 V# B6 M" b6 o-strequ <NAME> <VAL>参数用法不明9 X# J; r% ^5 I( I- \; ~
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
/ z' _) A# ^  C8 e" b% }1 ^8 ]8 I# V9 \$ @: O. P/ G
<FILE>是汇编代码文件,可用记事本之类编辑$ x; U' ^0 }# A. ^$ g& U2 a+ [

3 R  S4 v- i: l6 R注释说明:* \% \3 d2 ^: W1 F7 E- t$ {
注释可在单行指令后面“;”和“//”添加
! Z; |: B5 F, _6 a9 T8 W“/* */”式也接受6 ^( t5 i/ v) }6 q, ]
/ ~& n' c3 e/ @5 x% A  r, x' }
例子:
; v# p+ t6 E+ T* J5 g.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
! l; j0 ?/ i7 {# l* X9 X% @
# e2 ~2 _  ^9 b1 k+ w4 O; V.close;/*关闭文件*/
, M6 K* O' S) D+ S  G& q; Y% D
9 c) Q2 r+ R$ S. E; w0 i* S% X/ y标签说明:; C' o  x$ P$ O
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。, e0 R7 x6 i" U2 D6 \- g# f. \
* w( m! H3 G5 `, q( ]- `0 F' K
数值说明:. O( j; r9 p! O6 d' C/ W, b: U
“0xA”和“0Ah”是16进制数值
1 e+ L& w! D( A1 [“0o12”和“12o”是8进制数值
% n# ^2 ?+ w3 N: n1 K# z5 v“1010b”和“0b1010”是2进制数值' ~! L" E6 I/ r  X) f8 T
, v9 b5 x8 b2 N( H0 ~4 J) c
equ说明:
* |9 V. X# _# h4 G1 }# c格式:text equ value. \2 ]1 Q& f7 E8 k; b3 r
说明:用一个text代替value" P% r5 ]0 ~8 Q/ d- y9 E
例子:9 L! z( {4 Y& k: m* N. ]' Z/ ^7 X  ?
address1 equ 0x123456785 |7 l( B9 w& X! Z9 v( l
ldr r0,=address11 c5 @5 i* k" n3 C
.pool
2 X! q' C# K2 \1 ^+ F9 X
1 r7 u2 {  Z' s函数说明:: L! n9 ~  s. ?9 j

' t' ~) m9 p5 `9 _& I# r  T.open函数:% W1 c4 D) O* Q/ G7 a
格式:, [% K0 F6 w- r( }( i9 C
.open "ROM FileName",offset2 b9 z# v4 A% g6 ]" c7 @! f
.open "Old FileName","New FileName",offset
6 q6 _* c1 [! o说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
- H- J1 R4 {. ^9 `* Z$ u; v$ i' E5 {. W+ a/ K; A! l  S
例子:0 s2 j! M* Z4 B% `; x% m7 `5 C
.open "1234.gba",0x08000000
; m8 a6 a4 K/ @6 t
* K8 O  b) f4 S, N.close函数和.closefile函数:
' L* `4 I  D* J: `# f+ Z格式:
6 H0 u% B7 D) P+ ]+ g. v  s.close  w( S' B- p# s! s
.closefile% j2 y, p+ ~! v9 |/ A1 e) G
说明:关闭文件。
( P. D& Y# F* u1 p
! K* S* g0 b9 y. ]! G6 T# m.org函数和.orga函数:
* M: [( j, E( O: [0 E" f格式:
6 S2 Y& s+ T4 J# Y) H: q6 P& |.org RamAddress
5 y: c5 s- r/ c* }8 s3 g) P- h.orga FileAddress5 V( F6 L) S0 [1 ~' k' g" b
说明:% c4 e9 I" V* b
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。* F8 z1 Z$ P" S. y; X1 l
& a. |  h3 D! c0 ]& A, {( ]4 G& A
.orga函数可指定ROM文件的输出地址。
5 r5 f" Q  Q, v- @" {2 Q6 a) Z) G: E* D; S
.create函数和.createfile函数
: E' I/ d8 L& S7 y" M3 E1 E# g格式:
6 C0 X: u% P) u" q6 U.create "FileName",offset  `8 G4 v7 C0 r5 c
.createfile "FileName",offset
* Y- U; ?' x$ q4 X说明:创建一个文件,如果文件是存在,他会覆盖掉。$ @: @. k( L8 B6 c0 i- ]% q+ t8 |
5 I7 f% |! Z& F# q! ^
.area函数
1 |+ k* v9 f1 E: M& K( t格式:7 c" C, l3 m" u$ C
.area SizeEquation[,fill]. l8 X8 f" G" q6 O3 b# }
.endarea7 u  S# e9 _* e5 c( _
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败4 A% O; x, c' K& v. f! E
0 t# S7 F9 y0 A6 T
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据! i0 g. s5 v9 N1 h
org 0x100. v: v. P) T0 g8 M, n, n  B3 {2 s
.area 0x8& |# ~% H( d/ |. C: w' V7 b
byte 0x5,0x6,0x7,0x8* E8 `2 T2 x% ?
.endarea
- V  K5 H0 O1 f2 H+ |- ]2 k6 _6 Z+ z4 C* A. t- {
.align函数
; J: N8 Q/ `  c: _7 b格式:.align num
8 D/ X+ W& o2 b+ r) p说明:写零字节,num为零字节数量,用16进制表示。7 g& r* K. n" x0 y: H& B/ j7 v4 T* L

; s; k6 ~3 @2 k6 g; K; |7 D.pool函数4 k1 O- b% m% Q7 s0 U6 A# I' t
格式:.pool9 N" S7 K1 `" l* P! B0 S  v$ w3 a: r
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
6 `6 \) L$ s$ V* ?% n* t2 Z; p0 N例子:1 x" F8 P' s: O
ldr r0,=0x12345678;/ \8 ]1 m7 i/ s- m6 V2 _7 ?! y
....
" n' H5 k; Y) L+ y& g8 |' |.pool+ C! C* O3 i4 r, x1 \
$ z9 K' e* N/ ]' c2 ~
.fill函数  h2 \$ R* J% ]+ ^6 _, L" l% D( P
格式:6 e% l; S- }# @5 [( d3 z- I
.fill length[,value]  E. K, @+ _5 ~8 I
defs length[,value]
1 p9 |6 S2 C! d5 I, b说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。6 ?8 u3 t7 @& Q8 W. f
( n# Q- t+ j) H. V$ S6 h
.skip函数:+ g% A8 f  l, |2 \9 G. p1 Z9 y
格式:.skip length5 W6 r, D) Y( Q
说明:跳过指定长度单字节数值,length用16进制表示。! K# Y4 M* A0 i, q, H9 i6 ?
5 [  P- f# y1 Y% }- p) T) o  k
写单字节:2 w  x+ u9 |" @6 i+ Q
.byte value[,...]
- e- T! @/ L( M- ^% @: x! X.db value[,...]6 w* Y: F5 ~* `
.ascii value[,...]; A9 I9 }/ V3 i6 j, _' z
.asciiz value[,...]- l5 G) R" h! @* u* x
dcb value[,...]$ f1 C  I# h3 x" Y

" h2 P3 m. f5 M写双字节:( A! L& j! K8 N) p$ l( h
.halfword value[,...]
4 w4 q* z( g* e3 ^.dh value[,...]/ _8 O  ^, ?6 e+ \% Z
dcw value[,...]
6 \8 G: S. ]* `. Y. A6 _8 m0 i- w, \5 r8 ~! G
写四字节:" T4 X7 C: F+ g4 `6 @* t
.word value[,...]
) L: C( o1 q" b+ v+ n7 `$ J) J4 [.dw value[,...]
0 k& c# F( e) c4 j0 xdcd value[,...]9 h1 H3 j) O7 x  u

9 y; D, w6 l) p: ~1 w4 b. A写doublewords:* T7 z7 q$ H0 O% I; o6 A# U: d. p
.doubleword value[,...]
' @; R# l' ]7 o.dd value[,...]
/ j3 {8 g. E1 X5 I/ X7 bdcq value[,...]: h0 z5 O- J6 G& s2 ~

4 f" ?# A7 g$ a  r3 u) Q' R7 E写浮点数:
) V/ K9 @& y$ Q0 I.float value[,...]/ Z0 l2 P) c& v( X
.double value[,...]& |6 Y3 r7 j2 H9 @& U! t; s6 k% n
. X. U+ V; B2 Q/ G+ \% N
ARM的ARM模式和THUMB模式定义:: S/ f1 |+ f2 J6 {( N1 `% Q% p
.arm|ARM模式
6 U3 _. q) n8 a.thumb|thumb模式$ D& h- H- F3 e" r; k* n
% z7 {0 d' e) m4 ]4 f' T
设置架构:
/ Z: ]$ V' z9 I.psx|PlayStation 1(MIPS R3000). x( U5 u5 l6 p9 ~+ k4 F. W1 ^
.ps2|PlayStation 2(EmotionEngine)
2 z7 X0 w: F" q% o+ B# @.psp|PlayStation Portable(Allegrex)
6 {, |; `! Z- k1 j- q+ W. \5 J.n64|Nintendo 64(MIPS R4000)3 l4 _# \+ F8 V0 U+ j1 G2 z
.rsp|Nintendo 64(RSP)7 j/ U* V$ l0 ^0 Y  t
.gba|GameBoy Advance(ARM7,默认是thumb模式)4 W7 Y, Q" y# i& K" W- e) P7 X
.nds|Nintendo DS(ARM9,默认是ARM模式)& p7 p$ u: c# D. N0 M- b: L4 f
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)5 U) q0 l  C5 y( ^- ?8 d
.arm.big|. d3 ^6 F" e% @8 a
.arm.little|
9 [2 u$ \+ ]7 I
* I. i% O8 p  a% M' U常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
4 ~8 Z2 e, W( Y) j
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-13 19:12 , Processed in 1.067383 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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