EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2189 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
, v$ E6 a2 W( R/ w) d- K
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
  l$ f" a* f4 U7 w. |
" G2 ~) I1 _2 LARMIPS assembler作者是Kingcom,目前发展到0.9版本
( ?0 w) h: T, Z3 n7 |/ y# F% I  H2 G5 [, }
Kingcom's website:http://aerie.wingdreams.net1 X. r& z  Q6 E% d  t% P$ E; x
4 m2 ]4 t8 R% a2 Z5 |
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
( F( d! G7 z- b4 Q0 W' u" Z# s& P6 l, _( y) B6 N
更新版本可去http://buildbot.orphis.net/armips获得) S4 D& N3 j/ M! L! O' A) t
. d' U( v" s. d0 H( R( R6 i0 F
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。! V3 l/ ^# S# [  ^, W4 N' P9 U+ U7 s
$ S  W' `5 j4 v3 p; D+ u( O
ARMIPS命令行用法:' e* I- I1 U3 l, g  f0 V2 P
" _! k) E9 p8 n; T' ?' t) d
Usage: armips [optional parameters] <FILE>
. v3 {$ ?# G  J; r+ z! o. H) P/ B( h
Optional parameters:
2 f" _2 p6 r0 t8 V+ t( C -temp <TEMP>         Output temporary assembly data to <TEMP> file
% v# c& r2 a2 i. V# d, b; [ -sym  <SYM>          Output symbol data in the sym format to <SYM> file) v! A* X9 M0 O6 g6 ]
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file8 }% }, s! m( O* l3 }
-root <ROOT>         Use <ROOT> as working directory during execution- d: i  x, z& |
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code, Q' `/ h6 ^7 X# X, j
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
" e( D5 L2 G: j6 `: @2 k -erroronwarning      Treat all warnings like errors6 K. R. Y' b) s* ]; A$ j% z% N
( J' l4 Z1 ?1 o# r
File arguments:
7 v0 U& p1 I* S4 {5 {6 [ <FILE>               Main assembly code file" @% B% T6 }+ u* k
, G& J7 i$ R$ \" S
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
- P0 n& _7 E( \+ d( N1 Z) a  r-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba' P5 G( K+ A* |4 I0 ^4 r) k
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
9 w  R7 L. E# n  F# ?3 K, ?-root <ROOT>参数是指定执行期间要使用的工作目录
+ m7 k/ S. S4 m/ s+ F- K1 n-equ <NAME> <VAL>参数用法不明
" |% K# ?. {' I& s6 |-strequ <NAME> <VAL>参数用法不明) R7 `0 Q6 U: I
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
: z( Y/ _' o9 n! ~5 z" W/ H6 [, ^' `# c+ w, {; s* Q
<FILE>是汇编代码文件,可用记事本之类编辑
$ C$ b$ L# N- m( M2 i. \6 P% S7 M  ]' N* L( q
注释说明:
/ t/ k( w' ^0 L: i9 N注释可在单行指令后面“;”和“//”添加
# w2 ?) _4 l! g3 y" |2 V“/* */”式也接受
* e$ B5 F; a/ ^6 W, Z0 k' q# h
) g. T+ {* u' W例子:
- y2 F4 u& v' _.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000002 y5 N' q8 m: j  S0 f/ M! Z

- x9 d" w8 U4 I7 N$ [.close;/*关闭文件*/5 O0 m0 q% u' B. f0 R% z
' p8 H( W0 R) @. S4 m  U
标签说明:
# D( L! z8 {. x. f, w& A标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
4 ]+ @1 t6 Z* p& t7 Q, @+ u! ^1 P3 B. `* `  e; N7 z9 ]
数值说明:+ g0 N9 \+ i1 Z9 r2 M& v0 D
“0xA”和“0Ah”是16进制数值, D# Y9 P* \- [4 M
“0o12”和“12o”是8进制数值0 d# Z" J9 c) q* Z2 c: d( C9 J
“1010b”和“0b1010”是2进制数值
7 m+ b# ?. ]: U; H  n! P% @% x8 s" _0 g' ^$ ?  Q2 D  c
equ说明:" B3 W" V# ?% j) G! K: K" a5 v- I3 S
格式:text equ value8 e" i- e6 B- _# l. q4 l. d: D2 G
说明:用一个text代替value3 z4 y2 _. @5 \9 o
例子:
: R, y  ?+ [$ O  a" ^7 kaddress1 equ 0x12345678
6 B, P+ f5 L/ P/ t  l; k5 oldr r0,=address1) P) p# L: K/ U2 @
.pool
$ N+ k4 U; }, v% C" W
% t+ @+ t# P: M# j5 s函数说明:
. D  e, J7 V2 {
" d  S. c4 J7 f9 k4 T0 Q.open函数:
' J2 i. d2 ^% S3 v格式:! P! S5 n6 {, K* o; K5 Q; Z( b$ b2 L
.open "ROM FileName",offset
$ E  y- ?( ?. p.open "Old FileName","New FileName",offset. s: u1 ^5 R% f
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
, Z; y6 A5 t: W7 ~1 s: k+ ~3 x. H2 o
例子:' @" J- x2 K+ Z: R
.open "1234.gba",0x08000000; H) g8 {6 }$ V0 r

) T0 M2 |6 E% o.close函数和.closefile函数:
7 l, H7 i$ l3 L4 ^( W+ R1 r; y格式:
7 m" F0 F9 ?# f.close7 ]( H2 ~3 k3 F( Q. g5 G  n( k
.closefile
9 h+ O0 F: `- y7 Y. Q  _, Q# J说明:关闭文件。
9 r4 l; s9 |: f" D0 C2 q+ B; ^7 |( B, w- z1 z+ ^
.org函数和.orga函数:
# |1 _% V' u9 j1 V4 D  J' Z3 c格式:7 S; Z  @# C( `# `8 S; w
.org RamAddress
; B3 \3 S* ~( f% w.orga FileAddress3 V# ~) a! [$ B/ x+ p
说明:( \3 a8 L# E5 k$ ^  U  m
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。/ C) R1 k# l$ k( O& z8 H  S

; D! ~: U( @; |0 W( t2 w9 I- ]9 C.orga函数可指定ROM文件的输出地址。+ W- V4 j, x! b/ e" Y9 z1 \
1 ?6 P3 r& P7 A6 M0 u" ]5 l' t
.create函数和.createfile函数- ?9 b8 V: W' ]5 e- I" e5 @4 X
格式:( g7 |6 g% v1 r6 a' k0 z
.create "FileName",offset
  n2 F0 `+ h8 p.createfile "FileName",offset1 K; S2 v- C4 O4 l
说明:创建一个文件,如果文件是存在,他会覆盖掉。
) x( L* O1 n1 E3 ^9 S# D) m' h& ]* Y- h3 J$ t
.area函数* O+ B( C9 D6 U2 `/ f
格式:
$ r9 v" d: U: o7 Y8 P% c# J) N- g2 p.area SizeEquation[,fill]
# M: |% f$ u* i2 o.endarea
5 _2 Y/ S: ?1 X说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
- @5 O- v( x8 t/ \8 ?" j) v& h3 [! @3 R$ q8 V2 s1 a6 }
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
. ~: _) V5 d0 \' }, F: Q9 ]org 0x1007 ]5 @2 \6 f  V) H. f) w5 P, }
.area 0x8+ i0 A7 a6 J. {) ]* \" k
byte 0x5,0x6,0x7,0x85 G0 P4 d2 {1 D$ B6 Y) L
.endarea
! X  G2 M' e. \+ l6 E/ L  Q. E2 G& x' K+ r4 l9 _
.align函数
1 }% p6 M9 O6 Q5 }' E( R格式:.align num% J5 [; z5 B" b& ], G0 K
说明:写零字节,num为零字节数量,用16进制表示。1 u" H/ @4 `! s: x
: x1 q5 m- I! ^. G' h
.pool函数
; A" E7 X8 {9 O" e- Z; a格式:.pool  E+ Q5 a9 U' e
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。3 ]- N) V* N& a* p
例子:( r, }/ B3 p/ ]/ U+ ^
ldr r0,=0x12345678;/ K$ u9 N9 [/ G* C& ~( B' D0 {- p3 M
....
% ]0 Z+ [; S  ]' f5 [5 S.pool
3 `! {) u8 Q( J# ^8 a! L; s( Q, f$ I4 T% L+ {- w. u$ ?
.fill函数
/ {1 c$ ^* S- _6 r- X格式:
6 f$ r0 c: f" {- T8 P.fill length[,value]
# P0 U; r1 c9 R  \8 P9 kdefs length[,value]
9 K* {3 K/ `% K5 @2 `# u# t说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。. E' e* n5 v" h$ X9 r5 b
* `2 G2 Q% ]# K! ]& a: e4 i
.skip函数:6 r, k- b& T& d% O/ @" D4 \
格式:.skip length# a% E+ ]- i6 C: a" D  G
说明:跳过指定长度单字节数值,length用16进制表示。
7 i) z' c6 D8 _( ^
- L# i) u! X, u# J写单字节:
+ J& y. M' j; b: R- e8 `.byte value[,...]2 ?; ^( L7 f$ p" O: o( V: E: ?
.db value[,...]2 F8 k6 j; ]/ Q( I
.ascii value[,...]
, g3 ^) `# a. V.asciiz value[,...]) O! C# D6 k4 @( a( p4 j( V
dcb value[,...]
; ]4 e4 r' N6 D- s& C9 Y% x9 i) \% \% _
写双字节:8 a) i; ~, A3 n- Z. R0 _& t
.halfword value[,...]" m( Q$ c3 H% S
.dh value[,...]
' b1 X4 u. t+ c8 l, S  Bdcw value[,...]
& M, ]) n8 t7 `7 Q* y8 C2 K
+ o2 U& ]% u( [- }% r写四字节:4 f8 N5 y/ C" H$ ^
.word value[,...]5 k8 F! ]2 A: m0 `: c
.dw value[,...]4 _/ g$ y) ~. c* d- u8 [3 \
dcd value[,...]
1 B' t; k9 h0 E9 r" O4 E. g! q. M7 v) H
写doublewords:
* K0 B9 P  P. q' j8 W7 O.doubleword value[,...]
1 X0 e" }5 I5 u+ A3 |! m.dd value[,...]
! j* _9 J( |2 J! idcq value[,...]# M& R2 L9 g/ S

% Z9 P4 @) i, Y# j1 j写浮点数:6 |+ W2 U# Z$ \5 D1 h
.float value[,...]3 ~/ Q7 ]5 Z4 X9 Z
.double value[,...]
5 r; e) n& [) Q0 B6 K
% o2 ]3 s2 B" cARM的ARM模式和THUMB模式定义:) ^; ]3 g4 Z3 g5 `0 g
.arm|ARM模式
, J0 m" |: I  n5 h.thumb|thumb模式
/ g7 s: U) K7 t0 y5 w
& i8 v1 O9 X+ A. u. q7 f) i设置架构:
6 w; D1 X! P7 `5 `. G  D.psx|PlayStation 1(MIPS R3000)
8 W4 ]$ b* {# _3 B; m7 d% j! _.ps2|PlayStation 2(EmotionEngine)1 o/ a* Z9 {- G6 J
.psp|PlayStation Portable(Allegrex)
% c: l; u+ p8 W8 l! G# Y.n64|Nintendo 64(MIPS R4000)6 n" }! [. d6 Q$ A
.rsp|Nintendo 64(RSP)
# A8 Z, o/ i) h& h9 f! `# B.gba|GameBoy Advance(ARM7,默认是thumb模式)$ i0 O$ Y2 f% b" C1 l5 T+ m% V
.nds|Nintendo DS(ARM9,默认是ARM模式)
/ i; h+ m6 o' n/ C) t.3ds|Nintendo 3DS(ARM11,默认是ARM模式)* T  o) J3 v6 H' v# @* I
.arm.big|
0 o4 P; {3 K  o+ g/ z% S! b+ t1 B.arm.little|* F6 X: o, \1 c) @! d9 o* e' S
& ]" s+ q2 }' x$ S# u/ y/ f2 K' m
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。4 Q$ X! _! |! W# ~, e0 J9 K
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-12 21:48 , Processed in 1.085938 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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