EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1716 天

[LV.Master]伴坛终老

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

# V0 i5 W/ n- t3 xARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
- W4 M3 ?+ n, v1 p  |5 _- x+ |
6 _; e% t3 E* T& `3 MARMIPS assembler作者是Kingcom,目前发展到0.9版本' p. t% ^' b# J/ n

& t3 o1 l$ M: K- @( `; o' ]1 |! o3 xKingcom's website:http://aerie.wingdreams.net" J% M5 H% C2 c( p/ r- ~, t# b
- z% A: _3 X; V+ m
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
$ b) l2 C! r9 ]5 ^+ m% W% e
6 m0 J1 D# Y5 R7 i更新版本可去http://buildbot.orphis.net/armips获得4 |; l* Q- d$ G, Z" S

4 r1 [, S" _8 f) V& \# j' NARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
8 c( W% J9 [) Z! |/ n9 X9 M+ T0 r$ {2 E% x5 v- ?& g
ARMIPS命令行用法:+ U) R% W7 f9 m7 U9 {$ V

+ D& j/ i, B6 N: tUsage: armips [optional parameters] <FILE>
+ y5 [& ?% h8 O& l; H* A0 e! {. d  |7 J1 N/ ]6 S  A( d
Optional parameters:
3 n, E2 F# l, r+ A6 l/ @2 C8 h9 x -temp <TEMP>         Output temporary assembly data to <TEMP> file' ~5 X9 s+ ^. V: m. K1 k+ j
-sym  <SYM>          Output symbol data in the sym format to <SYM> file: S3 a1 x3 w6 S5 G6 h
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
# P3 M; `. N5 F -root <ROOT>         Use <ROOT> as working directory during execution1 g& q1 I* O0 \* }1 H
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code0 R* `2 K! Q  e( ~
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
- |# n4 o0 \0 G -erroronwarning      Treat all warnings like errors1 `& l$ b1 v8 V, U$ i  h
: u. f5 n! F; b8 L( d
File arguments:
* b( m( i9 B2 O' _4 @$ n5 ^( F8 X <FILE>               Main assembly code file
) r' e7 |2 f* x( O1 q- |4 Y9 P& J7 N1 l
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件7 n* t4 ]' y' b( ^
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba: U+ S: a" D: l
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
4 |" j  m7 `0 k4 O6 D-root <ROOT>参数是指定执行期间要使用的工作目录+ u2 b% l3 U$ V. n' q# ]( Q- ~' ]+ p
-equ <NAME> <VAL>参数用法不明3 y3 F5 d& U* v" n. D0 S5 B7 v5 c7 T
-strequ <NAME> <VAL>参数用法不明% Z% p; O) {/ Q; X
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
1 c2 t1 @9 o% T3 D( j8 P# z8 B- s$ o# ^% F8 k# A! I# k1 c
<FILE>是汇编代码文件,可用记事本之类编辑
+ O4 {# ~8 y* \, ?6 n# v
) @0 a/ T/ p# x: l: Z$ x0 t注释说明:
7 X$ w. p; N9 X8 {- S注释可在单行指令后面“;”和“//”添加
. B5 W/ m$ f% z“/* */”式也接受
. a/ s3 Q( J! i8 `
* }; ^- G/ z% {+ N& V9 y! S例子:+ w* E  V# L/ L9 E+ |: Z5 ~
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000; v6 V) g2 D& X! O

' [  S3 Y1 ~& c& n.close;/*关闭文件*/5 H2 ~) R2 ^" @) J. G

% e' y2 t. h- b) C* o. p5 X3 E; s标签说明:0 K5 @+ H8 F  a# `" E/ B. }
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。- I3 B' T; b2 d7 Q9 ~- Q: f' A6 |) E
" e- a! e# j2 ~3 F, S# }& `$ H2 G' s
数值说明:7 R) V& g1 I( N
“0xA”和“0Ah”是16进制数值1 T9 m9 K; b: |! y
“0o12”和“12o”是8进制数值
% u9 i2 h! t6 ?- ^0 e“1010b”和“0b1010”是2进制数值
6 N+ d0 T. U0 l% U: O! }2 B) d# N% L8 j( J1 K; M: e- N
equ说明:; S, c$ S- D+ t
格式:text equ value
. n9 V+ a$ p4 `2 D) s说明:用一个text代替value6 A8 f6 U/ J, Q4 M6 s1 ?
例子:
( s2 Z, n& y! laddress1 equ 0x12345678, j) l: e* F' I7 A" A( C5 g1 Q
ldr r0,=address1
8 d) D# [3 q% G7 J* I.pool. R' E& a( h/ g

; f' L( j3 M# m函数说明:
, r& z. W. H3 q  X4 L  k, d; c( r* B, }
.open函数:( ^8 O. _; ?6 o8 ]
格式:8 n8 `% r) u7 X! u% P
.open "ROM FileName",offset% p. `/ p: d+ W- V
.open "Old FileName","New FileName",offset
- r9 f0 ?2 Y7 i, r说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
" l7 w, O) g3 [
1 \+ d* w! I  f5 R8 o2 A' p5 M. |% s+ L+ X$ l例子:$ C' z/ M5 E% o% K% T% b
.open "1234.gba",0x08000000) V, q- F6 n9 ~7 b9 m5 e
3 L3 _, V. `) L5 w+ C% a
.close函数和.closefile函数:$ M0 E3 U- d) k
格式:5 _: h1 {% r, D( ?
.close$ w3 G3 t: _: c7 Z* m% x# h1 f
.closefile* m1 r4 Z, K* ^1 v
说明:关闭文件。
" P2 l& D; m6 [# P  z3 Z9 T
: }/ N( p7 E8 z. E  M.org函数和.orga函数:
$ S. n/ G( o. G格式:+ u; _- m$ v4 ]/ P
.org RamAddress; s5 ?9 g- |( f0 X
.orga FileAddress
! `8 n1 P# d. i说明:
1 c% x" L: h) t前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
9 ~& J* b( o3 a' D9 E% I9 n# \7 u+ ^6 k: J% _/ m& W$ l) E
.orga函数可指定ROM文件的输出地址。7 I; q9 ~' }- R  ^! ]5 U
5 j/ K8 T- w1 z  y
.create函数和.createfile函数
6 N* X: z! c1 f格式:4 S- x% R3 h1 `( C  v
.create "FileName",offset$ q6 E8 @+ T! a, O, J) o; p4 E0 l- }
.createfile "FileName",offset" h: \' X4 g# M! a  T0 c; e
说明:创建一个文件,如果文件是存在,他会覆盖掉。% B. b: t( ]8 Y& X5 @" c( M+ j' [
" [  F3 m2 K) b5 j- q
.area函数& K0 j+ e! P4 N9 x  }
格式:
: ~3 C* S  ~  Q9 e+ ?, Y.area SizeEquation[,fill]9 @# Z* F6 j4 {0 P% R& T
.endarea; ?& [1 f5 g* d- o
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
1 i7 P: I. U. p
' ~+ f5 H% q9 J; A+ a9 ~例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
4 i7 K, s4 J" U6 h# r1 Yorg 0x100* o  }# V) j' c) E8 e% F
.area 0x8, Q, V! y8 n) e- e7 W
byte 0x5,0x6,0x7,0x8
' W: [1 z+ k. f.endarea
( F6 a& X+ s3 u" ^& D0 ^  O* V! V/ z* f* E& @0 v8 |. Z
.align函数5 ]/ X1 u9 V' C3 H* h  v
格式:.align num
3 z" ^9 Z5 F& i说明:写零字节,num为零字节数量,用16进制表示。
7 ?; m7 v4 C9 L, ~: _5 |. `: y. T* i1 i$ V: b
.pool函数
. b' x8 Y$ Z1 _8 [格式:.pool
$ H: }9 c6 D3 i- U说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。; i) y8 p9 Y, M2 n) v
例子:* S  p4 W8 [% u- q/ A
ldr r0,=0x12345678;
! }- S- h1 t( Q5 T. ~..... O' \% Z' \2 ?! O; i6 N
.pool; @- x; X5 q6 r) [# ?

) o) P* n" o* J& T% c2 Z0 B( Z.fill函数
: a8 P$ h! E. K: b) J' G% u格式:
' Z5 d( O) e: @: w6 J- V.fill length[,value]
0 B* ]6 V/ H) o$ p2 @defs length[,value]
) u4 z, D) I3 d5 X  @说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
- |9 U/ R2 ?3 F& [8 u  K
( A( g% W/ z  O6 E.skip函数:
! O- T+ |. J7 b/ F; G6 s格式:.skip length3 N3 f: i$ I4 j* L: M' L9 w
说明:跳过指定长度单字节数值,length用16进制表示。! _0 @$ U9 m9 J4 S! F! Q

# ~+ G5 U) X+ B* G" C6 J写单字节:
7 b3 h( U# R% L( ~* d.byte value[,...]  Z- \# \: ^4 S1 `
.db value[,...], u2 J4 Q; c; Z) }0 c
.ascii value[,...]
! G  q6 T. B8 {1 ], B2 @5 N.asciiz value[,...]3 N8 g5 n+ D  {3 f+ O6 c5 q6 R
dcb value[,...]
; Z  G6 ^5 i* h
' z# c$ e! T+ a9 }0 N  Y) L写双字节:
9 j6 V; f5 k3 a.halfword value[,...]
% d; S. k) a7 A( Z.dh value[,...]
8 G" Z+ }0 \" D6 T( d9 ]dcw value[,...]
  F/ S- B! Y: }4 }  V
# n! N' u9 B: S2 Z( I写四字节:
3 ]" q* T. A2 N.word value[,...]/ d* w- o  L9 R* A% h
.dw value[,...]
, {: u- Y; ~1 y/ A- g1 y0 d- S5 Kdcd value[,...]
9 {( U1 E0 y! w; F/ F6 G, g  P7 V1 }8 D& X6 A) x$ G
写doublewords:
. ?5 `# I/ p$ L# q, p.doubleword value[,...]
4 N9 S  h% Q2 U  P4 @* {0 X" m.dd value[,...]
# I( T+ w/ X! V  U5 p, Udcq value[,...]/ x+ [$ ^& R& w$ R9 d

2 f3 z( c" H% Q+ x: z- h# q/ O写浮点数:
& [  t3 `4 T% Q! [.float value[,...]$ B+ E- W8 P4 ~9 B+ V% C: {
.double value[,...]! b/ s% O7 B( b. D* Y7 ?, h
7 X7 R! \- R. L6 X
ARM的ARM模式和THUMB模式定义:% x5 A) E; `8 p5 p
.arm|ARM模式
  X& `( d3 U" ]$ D0 z.thumb|thumb模式3 A( }& }: b. _( G5 }  {; }- q
: m5 o: |1 E5 l$ A+ h
设置架构:
* q/ @1 c; H+ h( [1 D.psx|PlayStation 1(MIPS R3000)
, B! T( ^4 w5 {- Y* R: F3 M.ps2|PlayStation 2(EmotionEngine)
  p, v: I0 L% ~5 m& H: N; W1 x.psp|PlayStation Portable(Allegrex)
, P' N5 ^0 M) S5 i( @' h3 [.n64|Nintendo 64(MIPS R4000)
' P* e) ?4 M( Z.rsp|Nintendo 64(RSP)
4 T6 _; n) ~0 R; @7 y+ W0 T3 E  s7 l.gba|GameBoy Advance(ARM7,默认是thumb模式)+ a% U, G  L, e6 y: s. v" n
.nds|Nintendo DS(ARM9,默认是ARM模式)
& t3 Y6 A) W2 p& l.3ds|Nintendo 3DS(ARM11,默认是ARM模式)  H, O* y5 j5 |1 T8 O
.arm.big|
0 K' h. ?, k- @+ C* c3 v) `8 M.arm.little|* w# v/ V! C2 C' t$ e/ ?$ k2 ~
0 m' p# r8 g1 f5 [
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。% \1 X/ Q, G1 z  }! e! ~! ^+ E" o* ~4 K
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-9-24 00:26 , Processed in 1.069336 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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