EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1826 天

[LV.Master]伴坛终老

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

$ F; `! U* L& ?: ^ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40007 A  p0 Z, a$ [" ]. x1 M
: {1 `0 e# }. d& H! O
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
9 D9 M. a) b2 W- r2 }+ P& |: R3 }9 V( M* }& C
Kingcom's website:http://aerie.wingdreams.net* t' M5 c5 ^+ n& s& b

! d; k! c. W) f1 ^+ r$ d/ L- n4 NARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
! S& e7 P/ `* g1 R+ |( G# `* ^
8 G( x# \) q0 b0 r4 O& M# }+ z更新版本可去http://buildbot.orphis.net/armips获得  x: A) c+ ?& q( v, z& D" l3 ^
% v1 J# |% F$ F0 f+ v
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。: `* e) S9 ^6 X. a+ K# E

: ]! K- ^1 ]7 D4 M* KARMIPS命令行用法:
7 H$ ]* e' h1 Y9 U. c4 o- ?8 \( h+ a
4 b# R0 O3 l4 A$ O: v% {Usage: armips [optional parameters] <FILE>- Q; ]7 u8 i7 B

* p1 B& n$ P' W, x' qOptional parameters:
- A) o  v6 y4 s: i -temp <TEMP>         Output temporary assembly data to <TEMP> file
+ T( e3 G7 M# J% }: z3 u -sym  <SYM>          Output symbol data in the sym format to <SYM> file
$ _9 c8 G- ?4 C1 F$ B+ A' L -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
- I- W9 O9 G6 |4 p! P* G- s -root <ROOT>         Use <ROOT> as working directory during execution
* [) a- C: `0 K* ]' _: L) G -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code% c# c. d' K; ^, {9 i
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
$ k5 s. n. Y0 T% w' y6 O8 c8 V -erroronwarning      Treat all warnings like errors
  {" L/ T" [2 F: e4 \7 K" e' y
File arguments:
* S" r, ], ?6 [. c <FILE>               Main assembly code file$ h* |8 |' E1 S) c( _7 s

/ I. L( v/ J; V-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件* m- B* K& `: L9 F
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
1 j( Z- q* t/ [" Z6 d-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp3 V9 B: d/ Z7 m  n, Z
-root <ROOT>参数是指定执行期间要使用的工作目录+ N- M/ h+ d* I; [6 V
-equ <NAME> <VAL>参数用法不明
! F  f7 v+ V3 v3 C3 S-strequ <NAME> <VAL>参数用法不明
5 Y, b7 A: l( R' e7 T) K2 O-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
2 c- r3 g4 H7 ], y5 k0 Q: G$ I3 u  R4 U. l9 ^" J  [
<FILE>是汇编代码文件,可用记事本之类编辑# F3 Z; s. k# l4 }2 S

7 I# p, S& Z3 S0 N3 M注释说明:- {& k6 Q% i8 ^4 k1 y! W4 @
注释可在单行指令后面“;”和“//”添加
- v9 F5 [# k, ~! A  M; m“/* */”式也接受
7 l" t+ K3 g( i$ j" B0 H9 t: p+ X- e  `0 D
例子:
$ i4 v' }5 P4 r& M5 _, D9 ^2 A7 H.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
! G8 a4 X; T* w; \/ \
9 y. e6 t  W- `.close;/*关闭文件*/
# t' @- ]) J3 p9 }0 q. H# I' t$ y! D, ^7 Y/ p0 b) Y
标签说明:
, Z  s( T6 m6 C' u标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
' a- p/ _- V/ \, ~# c: ]: O2 S; K& n$ b' m
数值说明:
3 X$ g+ h( A; V! X6 n) U7 p9 [+ j“0xA”和“0Ah”是16进制数值
/ \) Z0 V& M1 s/ m- P* l/ ?. Q“0o12”和“12o”是8进制数值: t5 B, L( D: i# f+ _* x
“1010b”和“0b1010”是2进制数值
! N2 y- ^2 S' }& i" v$ j, x* [9 I( {+ I6 Q
equ说明:
6 h# M$ W- }- @6 C格式:text equ value5 u; ~6 Q/ w2 L7 t* \/ O7 Y9 y
说明:用一个text代替value
: v8 u3 q  U4 W4 |例子:
+ z6 H8 S1 H( `. v# x' ^- Zaddress1 equ 0x12345678
& C* s1 \2 I$ @# \; d! L, Vldr r0,=address1
! |  Y5 r+ Z# @3 ].pool  ]- X3 F5 G" K6 D/ o

) y/ }3 X" k) @函数说明:
: D9 X7 e# X  [7 ^
2 X% U  B0 q3 E  |.open函数:
6 ]4 R; D' T4 _格式:
4 Z! d7 ^( N2 A5 ?+ L1 B4 l; g.open "ROM FileName",offset6 r  P% C! z. T$ Z: C+ m
.open "Old FileName","New FileName",offset- t* C" ?: V& c& s. k
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。+ v. z0 }7 s! a" E6 k0 c" d

$ S6 y; r; l3 T+ [* o$ `& i4 E& G例子:
; ]: a( S- g9 F6 {$ \1 M' q, B1 C.open "1234.gba",0x08000000
6 ?8 M) Y; L! F5 V
0 V6 E% T' \8 I.close函数和.closefile函数:4 W) x6 c" I. n/ v2 ?& x
格式:0 N" c- q5 Q5 P' W: w' B
.close
4 r+ ^- u3 g+ B4 L+ b.closefile  @6 F4 b. Z5 Z! l( f( A; v
说明:关闭文件。4 f) q1 P! j- M; s" V5 o" a. J
5 k( ^4 M6 R! X# t! q& O; E2 i
.org函数和.orga函数:! g6 ~) c+ x4 ]4 y9 z
格式:5 X0 |, z! I: z. c
.org RamAddress
8 v2 g1 k% r; A0 r.orga FileAddress
7 V: a4 x% E9 ?5 ]( U6 N说明:
+ I0 [7 H. g# F; h- c3 L前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。3 z4 H& @, L& N. }. j! G/ J5 N# U) c

* p; K3 `6 t/ [.orga函数可指定ROM文件的输出地址。
1 |  }1 z/ X" _2 X- `* L9 [8 H0 X* ~( I2 U3 g- m
.create函数和.createfile函数
( {* H1 d# p- ?- F; q格式:
9 p; K3 P" o! A1 n/ o.create "FileName",offset
4 q4 n" y# A' g$ }* }* `' o) S.createfile "FileName",offset% B5 I  N4 @7 A* f$ j
说明:创建一个文件,如果文件是存在,他会覆盖掉。
! I9 l6 k- S- E' T; d1 |% l: m2 s& \4 s; Q/ g2 s% ?( n# i
.area函数
* {+ L; u9 k! l& B  t格式:- c, ?- L: n3 H$ L1 \1 R
.area SizeEquation[,fill]) M' w% ]+ I8 ^9 q1 m
.endarea4 c2 S, H% e$ f2 B/ q3 O
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
- n/ d. k( h+ W- d  w9 Z; k. t# s) X$ c- S9 c- o( X
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
6 p8 Y8 V3 O6 o' s+ g! ~, @1 k. k' xorg 0x100
" L! b. S( V0 S/ [) u9 N.area 0x82 n+ r- I; _% ^3 u6 ?" Q5 G% q& X
byte 0x5,0x6,0x7,0x8( m# s( D0 t! l0 {! T. M) G) G" ^
.endarea
5 S7 ]0 u( b: ~" h" W6 ^7 ~  i6 j( J" d+ B0 s
.align函数
+ s0 C. P. {: }0 v- K, ?- T* V/ G; l格式:.align num
0 u3 r4 f4 C. N: M. ?  d说明:写零字节,num为零字节数量,用16进制表示。
* Z8 z: ]# Z& Z  J, ]1 y% a2 A6 ?7 P0 G  ?( Q0 i8 m
.pool函数% q, Z  |  c; O3 ?) K
格式:.pool
+ a  ?$ e7 o5 m6 [1 S. }说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。) E$ F  G7 ^3 ?8 P8 ^
例子:
1 f0 Q/ i( |( w! gldr r0,=0x12345678;
. I$ G1 f6 Z' f. P....
1 p0 A( e4 e- M1 Y+ Q.pool
: i- v, J5 \6 Y( M  }; m) h/ C: T( G- g& |, [% O9 g3 e
.fill函数6 F- x* R* ^% \$ P, ]3 e$ h- d
格式:; x  L0 @& G6 e$ l, S4 p( o
.fill length[,value]+ P8 a/ u* H4 c- ^4 Y
defs length[,value]& t# Q& R- P0 g' l2 C, y6 k* L
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
: W) e& q7 A8 z6 c: D+ `- l& h
7 K+ H) V- H9 d.skip函数:
: c; r' F  g% O2 [* _" q格式:.skip length! D. ?! u$ b4 |: r+ Y9 {$ Y
说明:跳过指定长度单字节数值,length用16进制表示。% u& v: o8 o% B
0 |  f& Z8 X9 m
写单字节:  q- g8 Z, {6 V5 o
.byte value[,...]2 N( s! \/ y: f$ Z
.db value[,...]/ Y4 J# t  t! Q3 F# v0 M
.ascii value[,...]
. K. J( [8 v8 l.asciiz value[,...]/ M, Q+ B% ^- a+ G1 L
dcb value[,...]
3 P: e2 s+ s9 ^5 y- C9 Q/ T
- K/ ?- N  M$ F写双字节:
( ]. F; S7 n2 k, F8 X6 w.halfword value[,...]
6 S% Y$ f( g% t1 v0 _( X1 i.dh value[,...]
( a2 O, Y; }0 Cdcw value[,...]
3 k0 q# x2 l2 O! v7 x  g
- T: ^7 c5 m  R+ s% p写四字节:
: @1 R. j8 H# V7 N5 c$ C* X- I! C.word value[,...]
: P& S6 U8 _9 I/ I. H.dw value[,...]3 c5 A- f  H6 k* n0 h2 e* T% L
dcd value[,...]* t+ L2 P# V2 l/ o8 C- g; e
$ L# Z& z4 g; U
写doublewords:" D' V7 f- R# _
.doubleword value[,...]
$ a8 q6 s# U+ h: J6 d.dd value[,...]8 L2 A  d7 _& L# a; m' N$ \, L& {
dcq value[,...]
# |9 V7 r& E0 r% X% \
9 G8 ^' L& x% Q9 B9 E) L写浮点数:) A6 j6 d% d- T0 [, h. @. @  D
.float value[,...]+ K- j; f( |/ M" ^  K. t
.double value[,...]  d. F% `0 W+ M' a; x  f  G

" R, J$ E9 ^% E3 YARM的ARM模式和THUMB模式定义:! |$ H6 _( \& @" V+ C
.arm|ARM模式. E) ?5 v; X+ c6 o" u+ r
.thumb|thumb模式
2 A8 N4 @. M  X  L. q5 h& U) K. \4 Q- k2 x% C6 j# F6 c( ]6 ^; j" F+ O
设置架构:2 _3 x& ]3 Q+ e1 A; @
.psx|PlayStation 1(MIPS R3000)2 C# P" Z$ Q- \# f6 _# a
.ps2|PlayStation 2(EmotionEngine)/ Y6 p# N6 m  E- j( P9 W
.psp|PlayStation Portable(Allegrex), _. {0 M$ N4 @, P
.n64|Nintendo 64(MIPS R4000)* B0 b8 Z1 `, i; ^  l- j6 M, ]
.rsp|Nintendo 64(RSP)
' v1 Z$ n; P! F6 h1 Q.gba|GameBoy Advance(ARM7,默认是thumb模式), @) g6 Q( G1 F8 M
.nds|Nintendo DS(ARM9,默认是ARM模式)
8 q# l6 R0 z3 N/ h1 K.3ds|Nintendo 3DS(ARM11,默认是ARM模式), L( z+ {4 ?' E) c+ e; L
.arm.big|
( ]  R7 N0 t' A( i5 d.arm.little|
5 ]  X! G/ U8 O( Z3 W1 h4 n' V- k: q3 T, Q, [) s6 W+ O
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
" T- T6 K; D! Z" K
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-1-11 02:00 , Processed in 1.091797 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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