EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2178 天

[LV.Master]伴坛终老

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

4 N2 a$ M4 U: y& X" q& r/ rARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40005 Y4 U) ^# m# B' _1 \

+ D5 Y9 _' X- R  ], a) z1 bARMIPS assembler作者是Kingcom,目前发展到0.9版本. C) D- N5 y1 f! J2 q" Y' w  u

" o5 f5 W) W- F  S8 MKingcom's website:http://aerie.wingdreams.net+ S+ P' T0 e) ~3 s( s8 i9 q
& X" ?; K$ H6 J" R( s$ L' u7 q
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得8 S- X# @5 `  {

9 U6 ?$ M( Q/ j, E1 ^, |! k更新版本可去http://buildbot.orphis.net/armips获得  V  I, t2 }6 Y( S
; Y! p& G! l, _4 f; @
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
" t: c7 `# `4 l6 F
6 P; {  F; `2 b. j, K& FARMIPS命令行用法:& ~3 ?+ T) y: K6 i9 d

5 e2 G+ F5 p9 dUsage: armips [optional parameters] <FILE>4 Q# D- I& Y$ W6 ^
! t2 C8 l- G0 K+ b
Optional parameters:/ `+ H$ I; _, k
-temp <TEMP>         Output temporary assembly data to <TEMP> file
2 I4 m0 C& v+ {6 v8 S -sym  <SYM>          Output symbol data in the sym format to <SYM> file1 K9 a7 W, y/ B
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file" u2 p( y$ Q; k
-root <ROOT>         Use <ROOT> as working directory during execution
. K( J* X' Y) z# {& b0 L$ J5 i3 ^" u -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
. r/ e9 s5 e$ z -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code2 ]& S/ ^' g, ?3 L( M" X$ Z. T
-erroronwarning      Treat all warnings like errors
, C, {" p& r  @2 L9 t+ ?* y; s& G7 T, P* F9 G7 F5 Z
File arguments:3 V0 Q+ h" ~# P
<FILE>               Main assembly code file9 z; Q. O1 X) w
9 N- H7 M1 E; R+ k
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件2 F& Z" A3 \( G: Q
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba' D% t2 H. n, j
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp; P& {  u# ^. j8 X5 Y0 V
-root <ROOT>参数是指定执行期间要使用的工作目录$ X) }; t8 h3 t& g* G0 H  l8 W
-equ <NAME> <VAL>参数用法不明
8 ]' S# V; d; N7 u0 B$ m-strequ <NAME> <VAL>参数用法不明/ J* x$ w5 P( n4 o0 `0 g/ y
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译! L. c5 F7 `8 ]7 c- F# S

) r* K$ E* b# Z* S% u. @<FILE>是汇编代码文件,可用记事本之类编辑
6 _1 b3 b! R$ h+ W  c" E8 J* W: H* t2 c& ?# n% C$ m4 }2 b
注释说明:* }- o% [4 A4 b+ B- C8 K2 L
注释可在单行指令后面“;”和“//”添加
7 F! `4 g, a" i) V“/* */”式也接受
- n  y. `( c  q- R& Y+ V6 M7 f( x
3 ^6 L1 u! H  n0 ~' V例子:
. R* A5 @2 w( K/ G& @.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
$ B( F! M: Z6 Q4 C  |. {) f# |
8 t1 i" [7 v9 R.close;/*关闭文件*/  d5 j# ~1 m% m

' O- |) y" w; X标签说明:
/ Q* p9 ]. Y/ j% G标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。# Y5 I) L  w% T5 Z4 P- L/ k7 l% T
# U0 i8 K; f  T8 R7 c! I. y1 G
数值说明:' X7 K( u& y: d4 `  c
“0xA”和“0Ah”是16进制数值
3 S% [) _9 d+ |# Z6 l“0o12”和“12o”是8进制数值; {3 \; I- I' e1 J6 N8 d, T( ]/ z
“1010b”和“0b1010”是2进制数值
, T$ V8 _8 O. v7 c6 z0 D( c& v6 _9 o: w0 K
equ说明:
; h' B# r' w" z格式:text equ value6 `1 o- t  Y0 ]2 s% n+ r" q
说明:用一个text代替value
; s6 A' c8 R' i0 E例子:3 U) S) `. y* ^+ t
address1 equ 0x12345678
, w+ U6 E$ Q* Zldr r0,=address1) J! D! x8 a, K& q/ c. b
.pool, t8 F) y' k: x: n- S( M! G
4 a% N! k3 p" p* z
函数说明:
  h! N- V+ F) h* R9 S6 [( {# e1 V* ~  U1 F
.open函数:. s! k- c# W2 t3 J7 @1 H6 Q" V
格式:, M( g: n: X- C; k( x
.open "ROM FileName",offset
, y9 _( F* X5 ~' S) Q.open "Old FileName","New FileName",offset
& m) R. a3 }: X+ Y2 t说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
* c$ N3 k5 j9 N1 i
( L% J" C1 q+ B例子:; y1 D. p; t5 f
.open "1234.gba",0x08000000
" ?7 _; H; a# C6 y8 r1 b# N/ ~7 W! x! P( G- N# U/ o  S# c
.close函数和.closefile函数:  D4 g, h) @! P  H& w' A& u
格式:9 v4 d% p! E! g2 {$ T2 a) b3 Z
.close+ L6 ], [( B' t" G" C8 k
.closefile, V$ T) l) {) }7 Q6 Q8 O( p/ \4 z
说明:关闭文件。  T4 t# @5 K. v9 D+ G- c$ O* v

+ y* ^1 [% X) z" @0 y.org函数和.orga函数:
0 b5 ~9 j  `" q, K' F4 }# \' h! p9 }格式:7 c% j- p5 Y$ Y! ]+ o( N' \6 u1 K
.org RamAddress1 U5 d: ?0 _9 a* @0 ~" E5 s
.orga FileAddress, v/ i) |6 z- z( {
说明:
9 m  B8 \9 `( d7 `7 X前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。/ h; u' C  e" J

# ?3 E7 c9 |. Z2 ^5 y5 V.orga函数可指定ROM文件的输出地址。! d5 Y+ m  E+ B$ H. }, F1 `

! O4 ~4 F1 A- r: D" d: c. q2 ], l.create函数和.createfile函数
$ V$ S5 z2 r& P+ L! L格式:
  j% N2 A: ]* `2 w/ G9 F.create "FileName",offset2 o6 \  J8 g2 i1 O: c# c
.createfile "FileName",offset( T% o4 S6 r. q$ }! v' v
说明:创建一个文件,如果文件是存在,他会覆盖掉。) D1 x$ I( r# B" a

4 l9 U$ b7 }* f: v.area函数
8 o; p- b0 t/ P3 h3 J格式:; z/ @# S2 R, A# ^( D
.area SizeEquation[,fill]) @3 s% r4 i' R
.endarea
7 |" q" L: I2 j& L  \8 ]说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
& @* b) j( W( C7 L8 c7 S$ U5 D( y/ S( t* ?/ p, C9 b
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据' O" h& L1 I# r$ C& F% s
org 0x100
4 S) j1 C0 H3 S: S! X1 }( T.area 0x8- k1 j* z+ k+ P! t7 P
byte 0x5,0x6,0x7,0x8
9 I& f+ A3 i9 q3 k8 |.endarea
6 b/ b6 X6 b1 S3 i, T3 F6 e5 v! _1 f2 D) m5 ^
.align函数
+ |1 H0 s8 p) v) T格式:.align num2 S* e7 J+ s1 c
说明:写零字节,num为零字节数量,用16进制表示。
. h7 S' y( Z: G# n( X. E' W. u/ c( M$ K
.pool函数) b" R; n8 S2 C+ b& ^5 {
格式:.pool  z& p! `! l$ \( P+ N5 p" C1 b
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。  W  N" i( H9 Q5 k1 g) l1 \/ ?
例子:
6 \9 ]! s4 _$ j. `& E/ i6 [ldr r0,=0x12345678;
1 Y# Y2 M- y; U# w1 c....- O# R/ M1 t  d$ b
.pool
$ D! c1 S: {, q) ?: W6 l
4 F% V, R( O/ f! P.fill函数2 Z' s1 x/ p& l
格式:' [' e) s) Z0 ~, {- H
.fill length[,value]; l1 }* m+ j$ @
defs length[,value]* Q$ ]. b7 j& ^! Z' t+ K
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。) I4 r6 A6 N9 P2 M
3 \0 v0 x( A3 s
.skip函数:5 h/ p6 D/ B" H8 K! X
格式:.skip length1 S1 [; j( D' i
说明:跳过指定长度单字节数值,length用16进制表示。- o& m3 t+ p3 Q. o9 h$ @
+ K4 o, u( _) `- D
写单字节:9 _) r3 h2 Z1 _! s- b- x. S* M
.byte value[,...]! W: W, x: Y& f5 e7 B9 H
.db value[,...]
  q  ?1 X$ T4 t5 X  ]* M.ascii value[,...]
" w( |, i& W, ~.asciiz value[,...]( V8 y2 v* R+ p
dcb value[,...]
9 a' p  C' S# `  ^* W# B
2 Z% `5 K. g4 U) F7 v* \写双字节:4 L0 e- W4 w7 ?! f
.halfword value[,...]
3 \& d9 Z+ _9 ]0 B, _.dh value[,...], s" R" J" b# S- p3 N( B" ^3 }# w
dcw value[,...]8 n! M' r8 e; B2 l) @' n: b' j* Q

8 ]. @$ V/ i+ E" ]* R: R. ~5 X写四字节:
: z. z# a. H0 x6 ~2 a' I.word value[,...]
0 J) P9 O; s/ A3 D.dw value[,...]! v7 \5 W, G0 O9 }* E
dcd value[,...]
* v& E$ O- ^! }' Q6 R5 R4 g- b6 R7 h# d
写doublewords:! J" U, u  a( }0 S) M: V1 W$ D
.doubleword value[,...], @2 l0 I! g9 l/ _1 i) c2 t! m# V
.dd value[,...]' x! z) p! s6 F! d/ q
dcq value[,...]
( P' h+ c6 B8 S% m
7 h3 q" w0 P+ @) }6 n; M写浮点数:# e$ \: Z' ?/ C1 [5 [0 x9 X5 r1 b
.float value[,...]. `7 L9 H& E# F  h
.double value[,...]
' ^. F: J3 A, |" b% j  m# k; E% u* j# ^/ M9 {0 \
ARM的ARM模式和THUMB模式定义:
' Z/ l  a2 Z8 G0 g1 ]% _.arm|ARM模式
- K, v  @, Z% D7 G% d" W2 c+ d.thumb|thumb模式
  C  J3 t  y2 ~- M
: D+ c  P% @( d( B- r  }9 _8 g9 ]8 E设置架构:2 n' b: L9 z$ E& H( ]. p+ ~
.psx|PlayStation 1(MIPS R3000)
- B4 y/ y6 I' Q0 u8 R1 j/ }6 H.ps2|PlayStation 2(EmotionEngine)
  ~2 H6 t7 g) M.psp|PlayStation Portable(Allegrex)
# @# }$ v6 B$ n2 f.n64|Nintendo 64(MIPS R4000)
, o5 I8 l8 U# P' W.rsp|Nintendo 64(RSP)
3 G/ F% ^5 Q- Z1 U.gba|GameBoy Advance(ARM7,默认是thumb模式)
9 y  y* H9 O% ?' R) t3 t.nds|Nintendo DS(ARM9,默认是ARM模式)1 Q& ^" M+ d7 I
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
, H+ U7 P. ~! u) b+ }5 F; d.arm.big|
& o/ D# c1 d" ^% Q: f.arm.little|8 ?/ S* h  V* K. u! A6 K1 o
- K. m! ?# Y- T+ I* ?6 u% V
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。- s4 J8 M) ]& ~' s+ W2 P
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-1 19:51 , Processed in 1.071289 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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