EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1977 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
& p! U& a7 f# I3 }' B
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40000 ^5 N8 z! M; j/ S/ T7 K
* s0 |3 S+ O! w" j9 R/ {% {$ O, ]/ N
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
$ I+ n( D; g. W* O4 j+ ]
- J0 i# q/ G) L8 LKingcom's website:http://aerie.wingdreams.net( K# N1 J6 _1 S- k( V2 ^
: |  g+ y, D$ ?) a. Y, e
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得9 ?4 q" ?4 X4 {; I  c  `
( h( u# x0 {* T1 H, g" D+ H# a9 a% m
更新版本可去http://buildbot.orphis.net/armips获得
8 f' w7 L4 K* N' ~
: O/ |  ^$ l+ ?3 ~# B5 A% e8 M; e: xARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。& y/ D; ~. ]2 O) G5 z8 ~  d; x
& c6 U7 {" {, T- G( g0 V$ P
ARMIPS命令行用法:6 ~; e  {3 d! j5 w- r
9 T! W. `$ y" o
Usage: armips [optional parameters] <FILE>  z  X: Y2 u9 j' [8 j7 w
3 s1 T8 \8 `( N  S
Optional parameters:- ~* J+ q; l3 G0 C9 P2 m( F# n
-temp <TEMP>         Output temporary assembly data to <TEMP> file8 x! n; A* I* F3 L- j- F" C- z
-sym  <SYM>          Output symbol data in the sym format to <SYM> file; ?5 x$ ~, S: M% e
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
; E" ~9 E( f2 t- Q0 e$ V& }* m -root <ROOT>         Use <ROOT> as working directory during execution8 a2 S/ [2 @. U7 M
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
* J' {9 I4 }9 P5 w  E: I, m -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code$ n: F; N! _5 d+ Y# L, v
-erroronwarning      Treat all warnings like errors
0 ]( X9 A; C" k$ J4 e' i- m
( K) Y" l' J+ V: f. S" m% @File arguments:0 J# ]' v! ~/ ^% T1 v. w' v, W' \* F
<FILE>               Main assembly code file/ x$ k9 r* ]) _* B( p+ V4 O

; K, ~4 E+ R% X8 M9 E' F5 g-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
% Q  \7 y/ |( ]& D) e-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
/ ~4 L* `* W' K8 Y3 @1 E3 [-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp, n2 k! |6 \( h
-root <ROOT>参数是指定执行期间要使用的工作目录
9 h$ [) K& d2 i5 {-equ <NAME> <VAL>参数用法不明
8 B3 _' T9 J9 q5 ~; r5 F-strequ <NAME> <VAL>参数用法不明
, ]) i6 c8 j9 }# ~+ R3 p4 G-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
+ u# S" b. C8 i$ M" |
1 f% c; a9 c; ?5 [$ i+ l! V<FILE>是汇编代码文件,可用记事本之类编辑  m$ W$ S" ~6 @: }* {. y- P

6 Z. [' d/ U6 `& T* [注释说明:
$ N2 H9 t4 Y, m$ u5 ]. K注释可在单行指令后面“;”和“//”添加
5 n9 H, a9 L6 Q# P# u“/* */”式也接受
$ i5 d6 f, R/ i6 B4 @' j( H2 G4 H1 P7 {
例子:  i: n% V! @8 h$ B) n
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
6 w) I' S' a8 b. c7 b+ z3 r
; a& o! i9 O9 h' D$ P- L.close;/*关闭文件*/
# B& d% ~; y; j+ ~+ G' G0 V( I1 D+ o
标签说明:
) t( m  N) V1 y" g/ i标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。1 W5 X7 U8 v2 g& ]( `

, a$ p) W( |4 w* X8 q0 q/ p' }0 a数值说明:9 {$ G3 a+ M  j
“0xA”和“0Ah”是16进制数值
9 L4 b. K1 H2 m+ u+ ]6 c( f. w“0o12”和“12o”是8进制数值
( b2 y, W9 m. e3 R7 K& H“1010b”和“0b1010”是2进制数值
# a" _& Z* I( Q2 F$ ^/ c, r. k% ~% k: `
equ说明:
$ g5 O/ d  K$ ~! ?( T: d格式:text equ value
- x7 Q+ F& H  Z: Z说明:用一个text代替value
4 |5 r6 c: o: T; C例子:
: o, z; O5 W, R& ~6 A. baddress1 equ 0x12345678$ K" s1 M* j3 H( Q+ H( ^# U! c
ldr r0,=address1
& l( N/ T; q$ P  E! t5 E. O# a.pool; W6 Y3 q' X+ b! d, B* w5 F

8 s0 M  |5 a3 ~3 _7 f" R2 G- F函数说明:
% z) S  a! f3 h* A) H& _5 i* I" N( k) @: g6 e
.open函数:3 Y( G6 _% [# g9 o; m% E/ Q8 V
格式:
' r( n9 O) f% ].open "ROM FileName",offset2 J  o8 H, a4 S+ L) |
.open "Old FileName","New FileName",offset9 A5 [4 b0 J& |. p' q' u
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。3 x5 k) f2 B3 E" M( n( U) ^/ Q
& f3 K1 C6 h7 E+ \
例子:4 \/ `- h# x! [; k8 p; s; h3 B4 V
.open "1234.gba",0x08000000
( y% Q4 |: I6 n( a( i
, G, Q- l2 i( e/ e  G.close函数和.closefile函数:
5 s& Y& O0 l* I2 ^& `% I& l1 _格式:
( Q9 k$ M2 K' Y% h.close
. p7 ~8 _2 W- L8 b5 T.closefile. X' `. m6 ~0 U9 T- W/ S, I
说明:关闭文件。2 g4 l  j" B! i. |3 Z& ^# m

- E" h+ d1 |/ ^7 ^& u: Y1 I.org函数和.orga函数:! B" w& J" R5 a
格式:& T8 T, b7 s* T
.org RamAddress* O* N. D& E0 j0 Q8 ?/ Y/ `9 X7 G& h
.orga FileAddress
- q4 _- Q( c& E  N+ B1 }0 O7 z说明:- t; Y7 m6 i, `  p% Z5 e& U
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
1 M2 J: |- W' V' v5 ?% x
+ f- b; u; @# ^. q.orga函数可指定ROM文件的输出地址。, h( o1 a2 s8 [# R

: U. E; p. \8 y$ u.create函数和.createfile函数
3 y4 N5 ?4 }! \  W; e格式:  F- Q( r0 Q, q. ], b+ t
.create "FileName",offset
9 A( L- }3 V' Z3 m.createfile "FileName",offset
# s; b* j* l# w+ \+ A9 E说明:创建一个文件,如果文件是存在,他会覆盖掉。. T1 c& z5 ~" R, X

/ h, Y1 a: U4 ^& j9 B.area函数
  W- X0 k& }# V+ c) z格式:, K& f6 n4 A1 H+ M. g
.area SizeEquation[,fill]1 U4 j( G. l$ ^
.endarea
+ T( O! F: c6 S$ H说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败) n9 X! M& z; d* v
8 l4 V7 s$ i4 S9 j2 m9 h
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据# O. i7 j' K* j6 q& R3 W8 }
org 0x100
, }+ Z, B2 K2 C3 m5 F: ?: k.area 0x8' @% g1 }" z/ X( ]$ O1 q
byte 0x5,0x6,0x7,0x8
2 {% d8 N+ H* q9 G.endarea
. ^; ~. f$ s0 O: a9 H; v
+ O' [' \6 w; B2 k.align函数3 m: E: `7 N3 K4 h( R- Y, y9 h
格式:.align num
' i1 U. r0 W* r, ?5 D' T说明:写零字节,num为零字节数量,用16进制表示。  o# f) V7 o+ k) [0 Q
# a5 O/ k: k$ b
.pool函数
1 ^1 G( S& u' P- ~格式:.pool
  ^: U* L  i9 `$ f' L! V- |0 w说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
. V5 S' e0 C3 G5 \3 I6 z例子:# \: v* Q7 `/ R" q7 w) ^
ldr r0,=0x12345678;
- r8 E, h- w  Y; n2 K9 z" H....: R5 M) z6 Z& d# S% K6 u
.pool; b, j  q/ S$ L  }
0 R8 }* o9 }9 F& k  E7 `
.fill函数( I4 `/ n. u& K- d7 f  n
格式:7 Z" `$ p* h. @- [" Q
.fill length[,value]
5 \# I) g: c9 Mdefs length[,value]
! ~) `6 s& n# T- z: [6 N2 R( y说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
& J8 _) U6 ]/ D' w$ T0 P
# E/ f6 I1 E4 r; n, w.skip函数:. G, G/ E3 u+ E( F" y5 i; X  e2 f
格式:.skip length
7 ^2 l9 v( O( G8 l  ]说明:跳过指定长度单字节数值,length用16进制表示。+ U) A; U& _& K  o
% Z, p! k  `7 |2 c1 L6 G( v# D* p$ X
写单字节:
* g7 w9 m0 h1 Z2 h  a.byte value[,...]
( ^- n  n* B5 T; c/ U.db value[,...]9 _- G, f7 S0 {7 c# t1 k+ @
.ascii value[,...]+ E2 }# n) e* Q3 x' R; w
.asciiz value[,...]
1 E5 y2 p2 V1 y: P# `dcb value[,...]4 T3 A' g0 b; Z, b/ @5 }. @3 F5 X

9 o/ @5 a. _/ |6 G7 h- m写双字节:- `# z2 H- s* o/ @
.halfword value[,...]# H' P% d1 }# E- r" G
.dh value[,...]
& b4 ]1 U: x7 |/ @9 p- x' `* l. sdcw value[,...]
# |0 o: @1 ?6 I5 }8 I" |3 k& S0 E% F$ j8 V2 P) B! g9 K; d  V
写四字节:& i0 J$ H' N! t. n  @+ ]
.word value[,...]
0 p) _5 e0 c! Y7 r0 J.dw value[,...]
4 O$ c8 |  c: q  }1 o% H: m* J" Q( [0 Mdcd value[,...]
, n9 o" Z$ K, U3 g1 L% p* x8 v- m$ `& b& s2 q1 s% O' f+ F6 {) W8 Z
写doublewords:) x- C" d* B% }4 j. Y7 c, J/ E
.doubleword value[,...]
* n& a$ R' T4 J: Y% P2 k& E. |.dd value[,...]
# t8 Q( K/ i/ jdcq value[,...]
; R  w$ Z0 U3 j# Z1 l% Q' F, G3 d3 \
写浮点数:
. b( Y) Y. x, Q  _0 f1 @5 _.float value[,...]" E, M  f: u% _  o: _  O
.double value[,...]
4 I4 Q# G; X: ~* A0 R: I# U1 I3 X) _0 c9 O0 B- I: m9 }4 ?
ARM的ARM模式和THUMB模式定义:
4 {3 v" }2 K( x& g.arm|ARM模式7 A+ O1 g+ K- Z# Q
.thumb|thumb模式
- U$ }9 U4 a3 }( C
4 ^& W. p/ x! F设置架构:9 U6 y% Y( K  t" Z3 d
.psx|PlayStation 1(MIPS R3000)
: g8 p" O% |. R9 I8 ?.ps2|PlayStation 2(EmotionEngine)' f+ f0 |! l# W- l; f# p$ b) N
.psp|PlayStation Portable(Allegrex)
  T% [4 K: J5 y  H.n64|Nintendo 64(MIPS R4000)
( P5 j% I: x+ M1 _.rsp|Nintendo 64(RSP)
. Y8 z4 d. L- E& T+ f% z' a- h.gba|GameBoy Advance(ARM7,默认是thumb模式)
0 A5 Q# T7 B. J0 B! |1 f* V7 I.nds|Nintendo DS(ARM9,默认是ARM模式)
, u0 }; e! a( c0 p, D, b! o.3ds|Nintendo 3DS(ARM11,默认是ARM模式), x, j, E/ G1 _' `2 Y# m
.arm.big|4 C5 V& a0 B5 D" d3 W/ k
.arm.little|
  g% @/ r# V( l# A$ H4 u+ x
: B3 h; e8 s4 }! g: R; r常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。& J% y9 Z6 |# m
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-13 19:24 , Processed in 1.086914 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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