EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1978 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
# F9 W" n( q" o! D
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
4 q0 @" W8 A/ R4 w, A! v% F- o( Z+ ?
ARMIPS assembler作者是Kingcom,目前发展到0.9版本; `. |9 `# A0 ^9 O8 j$ D5 F5 e1 }
7 b( L2 L( Q3 a5 z' c
Kingcom's website:http://aerie.wingdreams.net, S" |/ L3 }8 v% X  h

2 M2 c4 r& n7 E1 K5 W2 F( WARMIPS assembler源代码可去https://github.com/Kingcom/armips获得$ {/ K/ |7 X, u' ?- d3 B7 a* c

$ z7 s7 N3 j. b1 k更新版本可去http://buildbot.orphis.net/armips获得1 H9 ~) [& o/ u. t8 _; m- [+ u

. M' C+ s9 s; D) b6 zARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
* S- ]! p1 z% k6 ~6 G$ v
! O5 k$ m/ Z9 n+ I. M# Q: fARMIPS命令行用法:, A& z: R2 G( E! V
5 M7 @( z5 Q& s, g
Usage: armips [optional parameters] <FILE>
" b. L) F4 k! j+ W
: o" O. o. R& l* UOptional parameters:
# s! o- X& k- G& T/ |, i -temp <TEMP>         Output temporary assembly data to <TEMP> file
6 l/ I; t. S! ?$ c+ f+ }" a -sym  <SYM>          Output symbol data in the sym format to <SYM> file5 A$ d  @3 n/ \: g; L7 a5 f
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file6 ]5 k7 W+ U* s) ~! M3 _% t* ?
-root <ROOT>         Use <ROOT> as working directory during execution1 d6 E0 P+ M% i4 Z
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
7 B: X: p+ `+ J1 F: H! { -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
0 W6 Y. a# t% f6 h& C' _6 T -erroronwarning      Treat all warnings like errors4 T4 r" E0 C' l3 R
9 P. k) f$ _, r9 L4 C- J( G8 `  y
File arguments:
* V9 a2 @3 h' f( U# x0 H/ O <FILE>               Main assembly code file6 r" Y/ O9 g: T( F0 O

1 R1 p( Y* _! r/ K6 V2 V& k& v-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
  C" ]2 ]7 [& m( X. ~( J& O! E-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
5 U* k( s1 a5 Q! E- d- z( o-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp" @( _0 `: i5 f5 M
-root <ROOT>参数是指定执行期间要使用的工作目录) f$ B" H2 A7 y
-equ <NAME> <VAL>参数用法不明5 O6 c* l) O0 @, Z' E) X; h9 V3 i
-strequ <NAME> <VAL>参数用法不明
( M0 w! O! B" E9 ]/ U  y  ~-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译# R0 l3 N: c4 W
, {2 T; \, d* m* D4 j+ k8 _
<FILE>是汇编代码文件,可用记事本之类编辑
$ R$ p/ x' I, Q$ r& B* B1 k3 J4 m
, G5 ^# }# q: U# t' r, @  _注释说明:, V2 N; p  H. a$ a
注释可在单行指令后面“;”和“//”添加
* h& ~9 Y$ |6 K. D+ s. J3 |- h“/* */”式也接受- Y' _1 U6 a8 M" o$ h
. P* `/ j! P# z# o* Q
例子:  b$ r* r; u/ k8 |
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
& F3 M8 s9 M4 C4 O6 o
, j7 b% c  p3 `' O3 P/ X( ^( t.close;/*关闭文件*/! S$ A9 g* B! a  a+ B# C
) U" s. T( X4 t2 }
标签说明:
  d! M1 G# Z3 O标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
. Z8 x" L: t- W. N! F$ }: H/ t0 W. _, x  _, \" |! U! w( F! Y
数值说明:
. ]+ L" C* h# G6 P6 {+ o9 m( U- H5 j6 p“0xA”和“0Ah”是16进制数值
" i* O% z: e$ Z9 Z6 m) K“0o12”和“12o”是8进制数值
6 h1 q: b/ x/ E9 x“1010b”和“0b1010”是2进制数值
- k1 B' W$ o9 s! v7 Q" S" I8 S! `% _2 h0 h1 f) ^) d
equ说明:! L, c  m9 ?7 s4 K2 F3 w
格式:text equ value3 l7 U" F0 V8 t0 C2 T
说明:用一个text代替value1 L9 r1 W# V. |! e4 Z6 z
例子:- a7 L9 z6 B! X- V* ^1 f: U
address1 equ 0x12345678
( U2 E) _3 e' N8 n4 fldr r0,=address1' o1 s" d6 z# n  k! V: I, |% t
.pool
% I2 z7 [3 ~) l' J5 ~9 g! F4 ^
- h1 C4 }1 u0 [' c9 r7 u函数说明:
/ T4 J. X* s+ U2 N, i8 P; o: H, _- i0 d! Z/ H; W0 w  @
.open函数:0 J. Q4 E+ @0 g' E4 v# J
格式:# v1 H: F, Y4 i- s( t3 o8 X- i
.open "ROM FileName",offset/ C8 H" y& E& }3 f8 ?
.open "Old FileName","New FileName",offset
7 g$ p: B/ D5 U+ h说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。2 l5 @& x. `: }
7 `' B% m0 z: a- s% p) P
例子:3 ~- k9 Q) A  K: O
.open "1234.gba",0x080000006 W4 Y0 o" @  l
2 l8 M; q8 X, ?# `6 l
.close函数和.closefile函数:& M1 x- w* f+ h* h) F  Y9 t
格式:8 ?7 J4 B) A+ }8 X
.close
( X2 y8 B- S4 q" O2 ?7 `( q.closefile4 M* j: h& O% n+ q$ M! |" p" X0 Y
说明:关闭文件。8 _- S2 D) l: H0 d

0 H* \; t# }  f' |- z.org函数和.orga函数:$ S* m# x$ z2 H5 ^" b+ z
格式:
0 h) U7 j$ p! Y( i8 h  e9 H3 ^.org RamAddress  O3 [0 n9 u+ h) @3 f6 s4 n
.orga FileAddress
8 w" e+ [7 c7 I说明:: G" D; j+ p) j. x
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
$ L9 S# c8 N1 B& _/ I1 h
" g6 }1 c1 }- M$ s. H.orga函数可指定ROM文件的输出地址。+ m9 c5 n- u0 K8 t) r$ \( d* j
, k9 Y1 n# Q# J9 c) E9 ?
.create函数和.createfile函数* Y( S5 \  ]! x  g: t
格式:
" b; m) ?( N  A$ j* q  B.create "FileName",offset* J' S  v" h0 W# U
.createfile "FileName",offset
' ?& i, B. y$ V. H% {" h说明:创建一个文件,如果文件是存在,他会覆盖掉。
8 p, D0 `: Y1 X; x# `, `# n0 `- G5 E' `6 l% v8 d1 o
.area函数
* O8 I' W7 g# ]8 F% k4 M格式:
" H! X6 E" K" z! X9 ].area SizeEquation[,fill]( p9 o) @7 I' ~, O8 {( l- Z
.endarea: f' n7 v+ G4 _/ |/ @
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败6 M  t; {2 D& E! Y' B
- H9 z2 j- f1 V; O( h
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
+ d& K2 _& a' K! Y* v- Z8 Jorg 0x100
7 C9 x& W: j- I- F% ]$ S$ C.area 0x8
6 N1 f2 \4 I: h! r8 O3 cbyte 0x5,0x6,0x7,0x8! f5 i" X1 [3 O' [
.endarea
1 O, b5 p1 ~7 `" q7 _9 E$ h- G2 |% M9 `; `$ W
.align函数
* P& B4 h& c& R格式:.align num7 I! l- ?' Y! ]0 J" a% x
说明:写零字节,num为零字节数量,用16进制表示。
; O' F- X' `, F0 G' j8 j7 O( L; J) x. d- q/ ]9 E- C
.pool函数
( M  j& F9 ?7 ~6 V8 R  M格式:.pool" f1 [+ D8 Q- x" n
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
& U9 L( M, F; {% S+ }9 P) E例子:
5 q' w2 e3 D. Q& b0 b' }ldr r0,=0x12345678;/ B" N' o) d5 y% s) C
....0 |; ~+ i$ \/ q7 D/ n8 v
.pool& G/ w1 H, j  `

/ ]/ H9 B, [8 _.fill函数
: j8 y8 a: R% E4 j, G; U+ S格式:/ y, B, `" D8 c- t6 h7 ~
.fill length[,value]
8 V/ R( w0 f, J' l' r, T4 wdefs length[,value], H3 s; M; z6 j1 o' K  L* _
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
2 F4 n/ P) S# Y% w) @6 D, L0 ^6 s1 X! q" |
.skip函数:* W9 p* y/ t- ]/ Y0 ]8 [
格式:.skip length
( I& s# V  q) }' S- k; L! D说明:跳过指定长度单字节数值,length用16进制表示。
- }  j3 |4 W( g! \% K8 j6 i# k- k8 h5 R  }
写单字节:
0 t' h5 C( t# N" `0 v.byte value[,...]( C$ w8 I2 E0 B1 _4 J; g& x# ~+ R8 A
.db value[,...]  E. y' Z- m1 Q8 m% I- L3 _
.ascii value[,...]. w- E* c- l. g) S" m
.asciiz value[,...]4 B) k) O# \" J. N. u
dcb value[,...]
$ r) M* H7 ]$ k$ e
; u6 Q5 B% @; M8 c. E! p* y$ v; I写双字节:
8 q* I- T/ A" `# _" d.halfword value[,...]7 ~5 p4 L  l3 e, P9 S  d
.dh value[,...]5 `% _, k) p+ |
dcw value[,...]
) r1 S4 d! G1 q1 C
# w/ h; b& j7 K" v( l+ B7 F写四字节:
( t5 B. }) K+ L2 N% K; R.word value[,...]3 {& o9 W* i' S
.dw value[,...]6 X  R) T! r4 R; d9 O; ^
dcd value[,...]+ {* j) g5 k4 J1 I# {6 t( v

; G7 k1 j0 A$ T写doublewords:
2 d5 m( ]% L+ ~# [8 m2 Y. g" K.doubleword value[,...]& l! W) u$ D" Q3 a  i
.dd value[,...]
  @- Y' a/ {4 P+ ddcq value[,...]
1 V# t5 H( g9 r3 o6 J4 {; S% S, Q  l  A1 E- Q
写浮点数:
+ V$ Z, ~( k+ b# ^7 U0 x.float value[,...]
  o  h; ]+ L4 B# d; h6 B. s* ~4 b.double value[,...]
# m7 v: \6 R+ F$ ]
' B4 m* L* P, R4 O# `. Y! lARM的ARM模式和THUMB模式定义:! u3 y" d) _" I* v' [1 S$ P
.arm|ARM模式! ~; H. |' Y# G# X9 P- |) G
.thumb|thumb模式4 S4 o. ?7 A) S  d2 J

' h7 \  [: Y" f: i; |+ X2 d设置架构:& w5 M$ S. \, Z  W3 w# o
.psx|PlayStation 1(MIPS R3000)' ^0 _+ @% N! p" y) e% L
.ps2|PlayStation 2(EmotionEngine)
; \6 r6 O6 i9 G2 O( _.psp|PlayStation Portable(Allegrex)6 p" E& v, E1 x- i& c
.n64|Nintendo 64(MIPS R4000)
4 ~  K7 S& O5 j9 o+ j: I2 G.rsp|Nintendo 64(RSP)
2 ~2 f5 W* y8 G4 ]% r9 n.gba|GameBoy Advance(ARM7,默认是thumb模式)( m. v! B  ]" a. f1 p' Q2 Z! J
.nds|Nintendo DS(ARM9,默认是ARM模式)
5 f" F! h1 Z5 ]. d% F.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
0 Q( M& O% E9 G: H: l6 N.arm.big|
3 L: _4 H& A/ k.arm.little|& F/ c' U# G  t8 w  [
% K1 U, ^  k" {8 B
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
  `3 Y. k" h8 Z- x4 \$ E6 p) Z. O2 z% }
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-6-14 10:35 , Processed in 1.088867 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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