EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2158 天

[LV.Master]伴坛终老

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

) B# U8 V/ S- @2 w# jARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
' x" C  P5 L: f; f0 C" n. i. U
* P" C$ a4 [$ c: N6 Q2 sARMIPS assembler作者是Kingcom,目前发展到0.9版本! s6 A9 g7 a2 m0 w4 A4 A8 r
) u/ J9 I$ q* l& p' O
Kingcom's website:http://aerie.wingdreams.net
+ ~0 q9 V/ }! L  c; q; @
) n2 e. ^, n9 o; {2 AARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
! J. R* p+ r6 j' M1 v! S  o6 z; ]# q9 f" ?
更新版本可去http://buildbot.orphis.net/armips获得
' d( g9 {, W' x4 K$ W3 B, Q. o3 ^. F1 U7 V
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。$ J5 e* s7 c" b/ K
2 [1 P; v5 ?. s/ X* c
ARMIPS命令行用法:+ @9 }; {2 M+ i
2 R3 t# b, v  O) ?! `  C
Usage: armips [optional parameters] <FILE>
: S- U2 m6 e$ b
2 N: h; S9 N; w) @; JOptional parameters:4 o4 w0 d% P, Q3 l* Z: M  A& J' k& J; O
-temp <TEMP>         Output temporary assembly data to <TEMP> file* \) e1 Q  Y! F. A! l* ]
-sym  <SYM>          Output symbol data in the sym format to <SYM> file& `  ?9 ?, ~  E! ^, h) `
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
; b2 c2 Q0 q, t% ^: j -root <ROOT>         Use <ROOT> as working directory during execution
& w; _9 c8 v9 E% ?; v0 {! l- j -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
7 f) ?+ ]8 G' M6 c* N& Y -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code+ a' x$ u( e$ h+ ?& N; s
-erroronwarning      Treat all warnings like errors
! t1 U! f" U0 |$ |7 D4 D; H6 G8 O7 T
File arguments:
( c& X1 L- p8 e3 L( S; d <FILE>               Main assembly code file) W* m3 n' `) W% e+ D/ ^  Z4 N

$ I" |7 Q% |; j* g- B4 f- j-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件* k2 P6 C% }. n; N; j# l
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
4 i" W  r! b$ p  M-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp- c4 ^$ x& F% w5 Z1 X
-root <ROOT>参数是指定执行期间要使用的工作目录1 _; t' M. J" _( {
-equ <NAME> <VAL>参数用法不明# L% I8 b" p5 K9 [) |
-strequ <NAME> <VAL>参数用法不明; ~, r- u; ?! |( ^4 f' R7 k
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
+ i5 r4 V& x1 f* K1 A* N" P4 m( D. y; d* ^8 W( K9 P3 V( I& E
<FILE>是汇编代码文件,可用记事本之类编辑0 Q( \3 j; _9 [7 x

, T( ^2 t$ F3 h2 P  X' h注释说明:* i7 J7 F! O9 U# s
注释可在单行指令后面“;”和“//”添加
* h' v4 n7 k0 |( \3 M5 t& K0 I! ]“/* */”式也接受
' V1 o; y) ~7 z! X; e6 g- ]+ l% a9 v: E" [3 ~& V
例子:& V2 B4 D! s( w. W8 c) N
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000/ v& Y( `" e) F9 [# S( [3 q* D6 l4 Z

( p1 R: q8 [. _$ {+ O( F# T3 c.close;/*关闭文件*/
8 O* v3 ?# u0 |3 Z* _$ p& k) U! `* I" i$ E& w! `! U. m! i  ^
标签说明:
& q% @! V) P* ~7 {. w8 A$ F标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
" l: R, ^; p! D/ m5 }$ ^1 U, x4 l# d. C$ W3 V/ w
数值说明:% ]9 ~1 _0 s$ W3 F
“0xA”和“0Ah”是16进制数值
  y+ W* g7 f* E$ `: o" k“0o12”和“12o”是8进制数值
( W/ B1 X% P& S5 G; N& e0 p8 ]. j1 W“1010b”和“0b1010”是2进制数值
4 |4 t6 V  L3 Q/ l, }" d& L$ w; g& T) a  o. i
equ说明:
1 _% g  X- _0 W" I4 G+ l; n格式:text equ value4 a% x) _: q) E$ ?: F5 r+ ~* P
说明:用一个text代替value) U! D& n  m" E. c- y' }  E% z
例子:
- u- L! w" Y3 ^7 c# t' laddress1 equ 0x12345678
3 G3 q5 D4 Q+ B% Q1 @% d+ i2 Kldr r0,=address1: o2 T! r5 d' C' W6 v1 ?
.pool
" x% \! t8 s4 v% b# j& X, X9 {6 y: c, @0 Y
函数说明:( Q. ^/ G! J2 w, g" u

* L+ P. Q2 i* ]; V$ H" B.open函数:$ a4 Q) t+ R0 n/ b  K- V5 E  e
格式:5 @/ @! ~! [/ B8 t  W
.open "ROM FileName",offset+ w( J$ g! s3 |) n* Q2 o
.open "Old FileName","New FileName",offset& W! k) ~0 H" ?% q
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
3 e# U% v: a. i* k* \. g' B/ a# T% q
例子:2 q" g; A; s1 t1 d. K* R: Z
.open "1234.gba",0x08000000
. H0 |' l' q( i1 [$ R5 l8 b
! O0 b, M( s, P8 s! H.close函数和.closefile函数:! G4 W1 p/ x+ V
格式:( V9 M! H5 j) C) `! a7 M
.close
7 v: ^- M. g2 Z.closefile
9 K1 ^( X; W: }说明:关闭文件。4 o1 F; N* D4 c- g% F
. Y, x: l. ~2 V/ a4 M6 _+ d8 [% X3 x
.org函数和.orga函数:
+ M" t/ C! A6 x" _: Q格式:8 K* o0 N+ g7 b4 h, C; n2 ^$ U
.org RamAddress5 m: M1 ^3 y& k, u& }1 e
.orga FileAddress
& v2 ]& {  A& b! F8 e说明:6 q6 {4 f7 w& g* ~' Y: K7 h
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。2 ~/ [' j* B# w: `- S) U

6 t6 v1 G0 L1 M: }8 g1 P.orga函数可指定ROM文件的输出地址。. R! d/ f7 V' |5 M. S% [) k; V

0 Y0 C, x" P2 D1 H: y.create函数和.createfile函数
! L5 h# Z0 u5 H格式:
! ~) `# Y9 t+ V% E+ y" J.create "FileName",offset0 e% r3 ]) G$ `; E; K& ?$ @  R
.createfile "FileName",offset7 d$ }; h( y+ B" R4 j
说明:创建一个文件,如果文件是存在,他会覆盖掉。
" e/ @/ \! v. n9 w( W/ [/ _: q, a) g
.area函数7 b) c* h) H! W- I6 v
格式:
/ M1 y$ G+ p7 {5 L# D0 H.area SizeEquation[,fill]
/ s* a6 q. m. T/ R: a6 t. K.endarea
& f) D7 {( |9 L9 e7 b1 x说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
3 ]' C9 Z. l7 i% c' A. S  G. M1 M4 J' y& E& o3 O
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
) g& X: X- U( J3 a. m- ~org 0x100
/ [! }( s& @$ P  Y2 M.area 0x8( t4 P- a9 E# x
byte 0x5,0x6,0x7,0x8
9 p- U, v' c8 Y.endarea# h0 U7 Q7 L* x

$ v7 M1 T7 I# L# ~  j" B.align函数
$ S: K* L8 z2 ?8 a" {1 N格式:.align num- V$ n" p5 h! P6 h
说明:写零字节,num为零字节数量,用16进制表示。
/ B( ]- D  U; \$ [" N0 W9 l( n, I; u' Q$ A2 ?
.pool函数
2 V! _6 @7 k! Y0 P8 _格式:.pool& j! S+ h" L( m
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
4 _6 y. e* R" s1 U: @例子:
0 y# i. k6 r. S- d- Vldr r0,=0x12345678;
" E. n6 Y# q: a2 M! Z....
! K" ^- |& O" z: i.pool) u& U) _8 F; y9 d6 [" }# L% u

5 t7 p1 H  k# g7 T.fill函数
7 i: I6 o0 H8 E) @, e6 S. [7 Z6 S格式:
2 m: m( L1 b3 |" D! F.fill length[,value]! s. i3 w0 d7 @) ~: `1 P0 Y: n
defs length[,value]( S$ A. a" B, g
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
0 w0 Q, l" M+ ~# C
9 b: q" K( |0 p6 K* r% ~; v7 A.skip函数:
6 d9 h) ^1 M" n$ |( n: A7 J# R格式:.skip length
( z; h. d7 q% x3 G9 A1 Y说明:跳过指定长度单字节数值,length用16进制表示。7 k/ l. `( z+ t7 Y2 Z, L* V7 ^
8 d, r$ _' [/ o, a
写单字节:- r  Y! b6 u! ]" s4 [8 ^1 |
.byte value[,...]
) D* e4 t: g2 W8 i  v1 O0 Z.db value[,...]$ p; s" g4 E! L) J
.ascii value[,...]
( B7 G6 v$ b6 e& ^  V; @.asciiz value[,...]; U% O! `- L) }9 M  b+ L( g
dcb value[,...]* u2 H1 D" }' F% f( E% V, r7 o2 j

4 p9 g6 K0 i9 T1 E8 l! G写双字节:7 a0 y8 A, Q( Z
.halfword value[,...]
& ]+ ^8 O1 L/ S2 F  T1 a.dh value[,...]
8 E; V- Z8 z1 g. L# ^# `dcw value[,...]
9 t" ~; q0 R/ v5 ]$ E2 e& O# _7 T8 I* f6 w. j
写四字节:
9 B" [, K2 Q" l9 ?" ^7 |+ P* m$ w" P.word value[,...]
) N' w2 }0 ]- x0 k; a& H.dw value[,...]& u- B  v/ c0 T- F: C* B2 u0 n
dcd value[,...]/ x/ y& W6 _3 o  f/ ~( T

/ c# o' G. z; w$ ?. E7 E5 s! _; z写doublewords:
' L6 o0 y* }" v3 \1 }; d4 |.doubleword value[,...]
$ P& B% b2 T- o+ `  f5 f5 Z  K5 F.dd value[,...]
: C. B: ^% g5 e' r/ \9 Wdcq value[,...]: ^) j* c, u' g6 N: J
2 w  ~# b6 v) U
写浮点数:+ ~& X8 V# x% L% i8 [' S+ C
.float value[,...]( F+ r9 a9 U* I8 f
.double value[,...]
% \6 R3 U' b  c( c) b# Z6 u0 i4 M- |0 ^/ g( |
ARM的ARM模式和THUMB模式定义:- _- _2 s  Q; R+ L
.arm|ARM模式7 {0 \1 c. p/ r+ |. O( Q4 X
.thumb|thumb模式2 D; n) _: {$ g1 [7 L
0 _) t2 D* r3 A
设置架构:
3 f2 ]# i1 g$ V+ l2 Q: L.psx|PlayStation 1(MIPS R3000)4 t1 J, p- Z: ^0 Y
.ps2|PlayStation 2(EmotionEngine)3 J5 Q$ a2 F. {
.psp|PlayStation Portable(Allegrex), c+ i" J5 |9 m& w2 i  e* b0 X; E9 t
.n64|Nintendo 64(MIPS R4000)
8 T( y- I& c/ E6 T, ?8 P: a' n.rsp|Nintendo 64(RSP)
: l# B3 j* x. E.gba|GameBoy Advance(ARM7,默认是thumb模式)) b0 o5 B5 x9 }8 v& R0 [
.nds|Nintendo DS(ARM9,默认是ARM模式); {% ^( M! C1 N2 Y4 Q( l3 h
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)) `1 q) B+ y" }' m; A* _: o& u: m
.arm.big|
9 s5 X2 D" K7 k3 x; u.arm.little|
0 M  n+ R2 |2 E" Q+ w+ J: c' p% m$ ^6 p9 O$ s
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。: V2 s- L5 P/ \7 j: o' ]5 |
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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