EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1717 天

[LV.Master]伴坛终老

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

5 ?! L4 j# \" a8 z& d( rARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
- ]$ U6 Z+ a2 |1 }: Q0 m% S. U8 J1 l
ARMIPS assembler作者是Kingcom,目前发展到0.9版本( Y2 L( M1 N1 ^7 N1 Q. |( X
3 r- X) [, {1 T7 M* J  ^' E
Kingcom's website:http://aerie.wingdreams.net
3 e9 Z+ A3 n9 v5 Q; e0 r/ p9 w5 L& [  `. e4 `' T
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
, A) Y& N% J' S( |0 s) i2 d
- f' N6 [: p$ y1 @/ {更新版本可去http://buildbot.orphis.net/armips获得
' O+ _4 ^1 f5 e" D! e& s
" c8 C) F) e+ [1 J) }ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。: ?$ Y- }$ h5 t( \* R/ i4 o0 \

+ P7 |! j# r6 [9 L) }' KARMIPS命令行用法:) ?* N5 i1 f* K& k9 \* q* V. D+ s

6 l- K7 u1 N# E5 lUsage: armips [optional parameters] <FILE>+ ]" L9 p- |! ]$ p

7 Z' W9 Y! [/ [$ N4 s+ m, kOptional parameters:& \3 g4 _/ A& P
-temp <TEMP>         Output temporary assembly data to <TEMP> file
& W$ n: \% E+ {7 `: J3 |# k1 O4 ~ -sym  <SYM>          Output symbol data in the sym format to <SYM> file
, |) Y# `2 _/ Y( N8 q -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
9 u' F8 m2 V& @; ^6 X- R2 B -root <ROOT>         Use <ROOT> as working directory during execution
1 H. U/ l3 g2 l2 v+ \9 x! P4 ~/ e* d -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code* C. V! e0 T: W' p6 R
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code1 X  N. m8 c4 s
-erroronwarning      Treat all warnings like errors1 N5 P0 t# e1 H7 a. Y, L
1 i* K" v- F* g2 U* S0 e# H
File arguments:
) D7 W2 j  X6 R) U <FILE>               Main assembly code file
) l4 q$ K8 N( O: H3 v$ A
; }6 x2 Z9 i# M: z-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
: h8 S" q. B. i8 j- Q-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba3 v' b) f5 k# i4 x! R2 B
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp  v  F5 ]4 b9 J& K" B/ o
-root <ROOT>参数是指定执行期间要使用的工作目录$ ^  Y& h& M) N! [& ?  u
-equ <NAME> <VAL>参数用法不明2 d  E" N+ a3 k  _" U& ?
-strequ <NAME> <VAL>参数用法不明
. B1 h2 N# j2 c; J* J-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译8 H$ A+ C% a6 j/ |6 @0 }5 r% v
0 B  n2 x4 A$ |! b& |
<FILE>是汇编代码文件,可用记事本之类编辑, w8 W- Z5 }1 ~# z
, M: S6 q- X  d7 G! q$ E
注释说明:& k5 d+ N( u# d7 |3 @
注释可在单行指令后面“;”和“//”添加
  a7 _1 w( E$ t, r5 q: R“/* */”式也接受( `, M: q) r& _$ l

3 a( T* b2 g. x! |+ t例子:2 _: c5 J3 `. F/ w4 V- t
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
/ Q, z# d) t4 E+ X1 I" m. i2 _* d
) k% h/ M" S: N.close;/*关闭文件*/
5 P2 H/ [, ]( ^- q
% q* m3 W7 Z# \! q; U" R) ]标签说明:6 V5 v( h9 ?! @+ ~" S
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。& Q: p8 Y3 N, ], t, U, t; K& ?

0 G. `3 I8 I  [数值说明:
+ L, e5 Q7 k( f- |“0xA”和“0Ah”是16进制数值+ L6 ^' N4 u4 D, H
“0o12”和“12o”是8进制数值
5 g, M3 x1 v" N6 q, v“1010b”和“0b1010”是2进制数值
" Q! O% x/ S' F: m8 e( c/ I2 O6 W& C$ ?$ ?. {6 A& N
equ说明:9 t8 g. u5 k4 G$ k% Y0 Z9 E. g
格式:text equ value$ Z1 J3 K$ v$ g5 [( A8 ]; R% _- O
说明:用一个text代替value" u2 x) t9 {( I8 Z6 R- Y
例子:7 Z* p- T0 K7 g. n; n3 k
address1 equ 0x123456781 R! I. T5 k: q' h3 O) m
ldr r0,=address1
) o) t, m& Q* F.pool1 \% W6 @4 `) b4 c% U0 Q: ]& U
  S" d. E; O% y( W0 K) c1 o
函数说明:
8 K" [" Z9 q7 `  x4 j/ q7 K3 \& x" c( X' U( @* B
.open函数:- k4 f  r2 H- Y! I$ w8 Y9 V
格式:
3 w( d" P3 n$ f% r- B* m5 K2 G6 W! S.open "ROM FileName",offset
! C6 x3 K* |6 e, z.open "Old FileName","New FileName",offset8 j4 I+ S* ~3 f) {" ~4 V0 z
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
# \8 |9 O: i9 e( Y
3 `3 g: _4 r# C例子:7 ]3 E) c3 x8 D" Z) j
.open "1234.gba",0x08000000
1 q5 W. `: V0 R. c4 @5 `$ o; z
.close函数和.closefile函数:
2 k+ s- y: k/ w格式:3 C* d3 b2 Z( w2 [* j* ~5 R0 |
.close
. t$ q% g( J7 h/ j! I.closefile
/ Q; _% X) c+ C+ e+ f. l说明:关闭文件。2 C0 t. A9 n) V+ f9 v9 q
0 Y4 D6 ^) a2 Z. a1 H8 a
.org函数和.orga函数:
( ~+ Y: C; e7 W+ s1 A# }6 F格式:
5 h" S3 c# P7 n6 z6 H0 p7 e.org RamAddress
8 d6 b# S3 P* z.orga FileAddress
% v* q- e% e( O% s! m) J7 p+ d$ E说明:' r7 L+ z2 n/ |# K3 @2 ^
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。' U9 @# ^/ X  R
# [! g9 i/ Z7 k+ c$ O/ }3 O" k0 R
.orga函数可指定ROM文件的输出地址。! W& J7 t0 l& F' V
* ]( a6 l; X+ o1 x/ L
.create函数和.createfile函数1 |( E6 s, x2 \. S% S1 d
格式:' l7 d$ N2 e& z# \/ z( N) J+ z
.create "FileName",offset, v* c" j! ~; Y" @3 G
.createfile "FileName",offset' p; i2 b: B$ F' i, S* ~
说明:创建一个文件,如果文件是存在,他会覆盖掉。& ^6 Q  d0 j' B1 d! V5 I2 r6 e

3 m5 ]; m1 |& F% h- B* C; U1 w! I3 @.area函数0 V/ l! j# K0 m/ Z- m% O
格式:" Z  \" O" x+ e9 x  N3 y
.area SizeEquation[,fill]
- Z4 W! \8 p. N% d# h) k.endarea5 X8 n" i% u# Q1 W) _/ e
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败. [* ~: [' I# u8 J$ a: `
, @2 m$ u" D5 }. |
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
; d' Y- r( }$ y+ norg 0x100
* ?' O) p( B1 {, l# H.area 0x8
5 U! a+ U5 Q/ I4 qbyte 0x5,0x6,0x7,0x81 x; F8 ^+ m/ q8 B; ^7 W& s
.endarea
" A1 d( T# |) a6 Q
* P, U1 `: w1 ~! \# i.align函数
2 H3 V* S+ Z; c) W格式:.align num
6 Z6 t/ Q/ n9 ~. x6 O$ [! i1 ?7 O) l说明:写零字节,num为零字节数量,用16进制表示。+ H) |# ]" t6 k
' Z, s# J( }5 H. Y+ a0 j) u
.pool函数# D  m! d$ O$ S2 d9 k3 b6 c) _$ e
格式:.pool- Z% o& i- s$ i1 ~- I  G: v
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
# F8 ]: o8 O- z7 O6 W) M, s例子:: @5 m+ R; t4 ~) m- _0 v/ S
ldr r0,=0x12345678;! w- V$ r9 A  X3 N7 w
....
5 @5 X+ j3 F0 p( ].pool
, E+ f1 W; O+ D3 B: m# h4 n) Q' J! O$ `
.fill函数
/ K# l% a3 ~0 l格式:
& c8 _5 X; s% K$ U& ?* p.fill length[,value]! H7 j5 V- r1 V% Y+ d, m
defs length[,value]
8 e9 T6 X6 K  B- C  {! H$ l说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。* y6 r! P1 g1 G7 |) g& S2 A

" O. L4 k  K# o; |1 U' y.skip函数:
4 Z' j) [) d3 @; z格式:.skip length$ i( r$ k% ?6 Q. |& A1 a
说明:跳过指定长度单字节数值,length用16进制表示。9 j0 J, L5 M5 u: c

1 e" V9 k, S8 Q; A$ T4 {写单字节:
. n. w' R/ E+ E8 R& r. z.byte value[,...]8 \- T/ c% S2 Y" o, [# |
.db value[,...]
9 I+ y/ _! G2 j8 D0 V- v.ascii value[,...]
* Y2 r5 f  E' P3 e.asciiz value[,...]5 H9 m# m' r% w" R
dcb value[,...]
; {. T; w. j: Q" ~7 Z9 K+ z6 q4 u( F( N& Q; h$ b+ N% a
写双字节:( w1 v% r* ~9 A* {
.halfword value[,...]/ h4 _4 z" D8 V0 t6 a
.dh value[,...]
: ~" l0 p% u; A; K& pdcw value[,...]/ y+ x; h1 ^' Z' M

" O& O5 o" B0 _+ |  m3 ~& v写四字节:# O& L2 A6 O2 _; Y9 [9 v/ H4 Y
.word value[,...]* e- y1 g. F$ b5 D& ^
.dw value[,...]
( r( j% K$ S. y" ]! w* U4 w) ^) h9 `dcd value[,...]
  v/ f5 E8 ]" q0 s& D: M8 ~7 H8 X9 p+ {, o- e- i& b# f9 ]: G2 M
写doublewords:( X9 \5 |6 o: L
.doubleword value[,...]) u0 L6 a6 ^9 x
.dd value[,...]
5 u: s0 d! L& y( r6 {7 |" M5 z3 _dcq value[,...]& m8 b6 Z+ f' b
) b# E, \9 \; `
写浮点数:
2 n" K' e% o) A.float value[,...]! O* B1 t$ T0 D
.double value[,...]
1 z& m/ h) M5 ?+ g% s& G7 s% ]3 i( f% L( }
ARM的ARM模式和THUMB模式定义:
0 i3 W8 M" t& Z* s+ j) T.arm|ARM模式: F) @. _' P  g4 F) k
.thumb|thumb模式7 i  R# K5 W3 ]

! @! c6 T  P" M% [; d, l设置架构:6 j' n5 |6 \9 N
.psx|PlayStation 1(MIPS R3000)
% r: ^& B% Q; ?! a! s" f.ps2|PlayStation 2(EmotionEngine)
- {, n9 {6 {" e" U7 h4 u8 v.psp|PlayStation Portable(Allegrex)
) z  g1 M' k; w8 n; @; R, ~5 T.n64|Nintendo 64(MIPS R4000)
4 I+ r" L5 p& D' ]$ y  d.rsp|Nintendo 64(RSP)# ~% a: r& e0 u% A
.gba|GameBoy Advance(ARM7,默认是thumb模式)4 Q; P) E( D" W) D- o" N& e
.nds|Nintendo DS(ARM9,默认是ARM模式)* F- h. D7 \5 O4 t/ ^+ Y# c4 y
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)  a8 Q1 p7 \$ k  N: a- y
.arm.big|
( M# |6 f" |& y7 M.arm.little|" V$ B6 r: _: U9 P3 _0 n
: M7 ]( I' d0 w: i- a
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。" o) a( z9 \# J8 C/ w
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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