EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2173 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
" V! m. R9 A0 S
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
+ Y; f, b3 V' i0 \4 Q5 @" r1 Y
' O8 `  B. {# x( A" S- FARMIPS assembler作者是Kingcom,目前发展到0.9版本. M* x" ]  C% O& w: ], f

0 f, G4 H1 r, F9 r  pKingcom's website:http://aerie.wingdreams.net6 J3 p9 q; S, M
3 P  {* m' y# y/ B3 N8 m8 V
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得" C: @4 k  v2 C
$ O! V: W1 W6 R6 T" @  s" H
更新版本可去http://buildbot.orphis.net/armips获得
! ?2 t& a' r/ ~* \% {6 z7 Y' ]2 O( }$ o8 [& ~7 H
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。1 ~0 ^# e# Y" H, O$ [$ q

. ~& f' @7 h) b8 z' N9 s" t, {/ aARMIPS命令行用法:* O& \5 X/ j  g: @5 D9 J( R
* N2 S  i# G, ]0 l6 _
Usage: armips [optional parameters] <FILE>
7 M5 a- g1 `- r1 W9 G
- u2 Q. u4 s7 A' V6 i+ v# h  l7 YOptional parameters:
6 L& {9 i! z5 T6 \. M -temp <TEMP>         Output temporary assembly data to <TEMP> file
* p& b; e4 g; A+ U& v -sym  <SYM>          Output symbol data in the sym format to <SYM> file; l" ]3 [' I" ~7 X4 Q- @* M
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file1 M' m2 V6 M( J* o* l
-root <ROOT>         Use <ROOT> as working directory during execution
- X- y7 G' Y$ a  G7 q2 `( }" s) ~  a -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code+ ]9 z& m8 M. h& u
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
% f6 `& o1 ~/ [, Z" |) Y% \ -erroronwarning      Treat all warnings like errors
; T* x- z6 }# l2 r* H1 ~, g; {0 ~; h  M0 S
File arguments:
% C5 `; W- ]) A <FILE>               Main assembly code file% A/ c' s4 I1 Q, s
: q7 l0 Z$ ^+ y. M8 ~. Q
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
( `; r' w$ S$ K5 ~-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba) _8 H: [5 P# t4 ?
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp) j" x: }2 M# @3 W$ t* n
-root <ROOT>参数是指定执行期间要使用的工作目录
9 @+ i5 P0 Z# s+ Y7 S: l-equ <NAME> <VAL>参数用法不明
' W# o& p' z% C-strequ <NAME> <VAL>参数用法不明
6 a9 f; I& m9 _+ U1 e$ }1 B-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译& W8 Y! k$ `  z; S6 `* ]
3 `4 U# S# h- ?/ T6 X8 ?
<FILE>是汇编代码文件,可用记事本之类编辑
& m' U: Y! A8 e
9 T2 H' E4 V9 Y+ `3 f; `注释说明:. ]  E. R) S7 D: X& U% m* \) N
注释可在单行指令后面“;”和“//”添加
% @. r$ @# ~( I; Z4 a& T* o“/* */”式也接受. i! E: T4 O+ u, I1 _  n
+ I5 e& h) [; C4 ]/ [
例子:% y$ \8 s+ h; q+ Z1 z
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000005 w% N* F( Z& m! N8 m
* Y! O) I" i( M3 V: X
.close;/*关闭文件*/
0 I; f1 r' o5 S" O' h; T/ v# J# k; U4 D- u& k$ r1 p. j
标签说明:
7 `  [3 r3 S; w& n4 Y, x5 X3 v$ w- _标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。, f9 v7 J% [! N6 {
0 V$ b8 z8 L+ K( W
数值说明:
8 N1 G8 F: Z5 H: _+ H“0xA”和“0Ah”是16进制数值
! ]( h9 s4 u; |' \) K5 d0 \7 h" s“0o12”和“12o”是8进制数值, ?* P/ z9 P6 U- w" \. a5 G
“1010b”和“0b1010”是2进制数值
" F' \+ U; \8 {
9 e, w% h/ O* xequ说明:- S% q7 s8 L' d$ A; C6 T& G6 b
格式:text equ value8 d3 [7 }  O+ g) w
说明:用一个text代替value4 F; R& R" S# j4 {
例子:; ^$ H* E2 t6 u5 R+ g
address1 equ 0x12345678
, i5 O1 |7 M4 d* z8 Pldr r0,=address1
: K" p0 e6 u# N& z. q; {.pool
# I+ [+ r0 V6 @7 w( V) m; v8 L( D4 w1 l6 ]
函数说明:1 d0 @/ z! v, ~

( D  e# b7 s; G$ t.open函数:
" d$ E0 @- [8 C, l8 y: C. O3 l' N格式:
% U' W! ^- ~" U; I* z.open "ROM FileName",offset- D7 V/ |8 a4 F6 |. s6 o, G
.open "Old FileName","New FileName",offset; q2 M- {1 p3 i! j
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。: L$ p: t- }) p% ~

; ^1 I; |/ s/ N, t8 F例子:
$ J5 g  D& p1 z% I: o7 ^+ R2 Z.open "1234.gba",0x08000000* v8 y! }) p& ~- b5 J
6 i7 x+ V% u6 S8 q" ]5 r- H8 j
.close函数和.closefile函数:9 C4 d* U7 K; q, ^, d
格式:
+ L+ o* _! g; d- I.close2 W" z. r6 [3 F' E2 |: {; I' l
.closefile
9 J6 v0 V- h0 N- u7 {& d5 v( J说明:关闭文件。
. \" \8 [+ i+ c5 g) U2 p* H* g$ i$ n
.org函数和.orga函数:
, U3 i* b  L5 @/ G* Q0 }' O格式:9 \- n) ?9 M% v  c. Z
.org RamAddress( l9 h% Z4 U4 B; Y9 N
.orga FileAddress
! l, Z( B9 S$ q* s2 C1 l说明:
2 P$ s% |' K+ r前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
: d. e4 S, u& V* J3 Z( @# ?/ n+ s7 V, L" T- Z
.orga函数可指定ROM文件的输出地址。
  i% ~+ u) U: d& @
6 b2 g% h& J' w.create函数和.createfile函数( T5 j2 E3 M+ U( z9 ?
格式:0 x+ h, x- h: {. T0 E
.create "FileName",offset
) ~& B! _0 F, K( o1 @6 q.createfile "FileName",offset+ Z" ]# Z7 P; d4 L0 G
说明:创建一个文件,如果文件是存在,他会覆盖掉。& E. L8 L% v( q

7 O. V7 R$ a; N# _* R# O.area函数
5 H, S( m; T$ a7 X: \, n! R格式:5 C- L4 T, J! I( u, h, _2 e
.area SizeEquation[,fill]
) G2 s- f7 U2 W% |4 i& P.endarea
( `  \2 i! B* A/ k' c% z. h% F说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
6 f5 ]; e$ v# `$ s- r3 R0 N" A
& w$ D7 W; t$ X' O# m8 E2 \* G例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
2 Y8 s- ?0 g5 [0 d, Y4 G6 Uorg 0x100
5 r: p( e! l/ e.area 0x8
5 j7 W( a9 z! c2 Z' c) Ibyte 0x5,0x6,0x7,0x8, c+ o7 \3 a% B9 O3 M4 j; w
.endarea" ^) X. H: I$ W" T
0 U* a* c: c  F5 D/ R
.align函数
( e0 W4 E( W7 P# l* M7 `: ^$ z, k格式:.align num( h3 D% m4 @+ d! {: c7 Q
说明:写零字节,num为零字节数量,用16进制表示。
5 w+ D2 Q1 @. a/ Y, \5 e0 W+ c8 Y- s% l7 h, z& o
.pool函数
5 E7 E+ p8 T! Q格式:.pool
* T+ \) R! H( [, D) _说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。. M5 k) a5 ]1 B4 [( k  x- l
例子:
4 ?% z5 J. \  X& j; f& xldr r0,=0x12345678;1 i. B( M# e: E! n$ A; B2 L# J/ K
....
9 m1 G) N* _; w3 r+ U  t# v( D.pool) j$ R6 j2 C# }, k  R

% X  a2 B$ F/ Q2 [.fill函数+ F* h3 K) ~# ^* ?0 P5 A
格式:
; w1 {- I5 l! M4 P; j1 w; d.fill length[,value]/ m1 m8 O4 {, t) L9 G5 ]
defs length[,value]
, g! d) Z. ]& G1 k% F0 ?说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。4 N6 ~! h; G* N" f( H7 {

6 ?* O( g" o2 ^1 q! X.skip函数:+ `; D; o! z& J2 r
格式:.skip length) V2 C3 b7 w6 K5 l, x1 a
说明:跳过指定长度单字节数值,length用16进制表示。
% G* i2 @) K& }4 D* o' d' w) V% d  {0 D, @3 Z( J
写单字节:
7 P; q. R' l, O. A5 a  B% `! \5 C$ T.byte value[,...]
0 S( S5 J* f, ?$ h( B/ q2 E; N.db value[,...]2 s- N8 w4 Z9 f" `  W' u
.ascii value[,...]1 ^  f' c) u3 K# K4 h' t4 \& P/ Q
.asciiz value[,...]( `5 X. [/ E+ u# `
dcb value[,...]
6 g2 S. S+ E0 i$ q3 c4 ?% [
& x7 r! X4 j# D0 L) w+ s7 K8 n写双字节:: }* G  y% q  y! g- N& m8 G& ^1 [
.halfword value[,...]
  h; N/ D3 A' c" A; t: ]$ z.dh value[,...]
" j6 @0 {/ o4 z- u& [8 Cdcw value[,...]; A0 k! E& d8 K$ G* u6 W! k' ^8 g
( i/ h' [# W0 C7 N! V% l
写四字节:
/ o: I8 o" w' h  c, Q/ v" H/ I2 O+ y.word value[,...]
# S- C% T& o, E+ A.dw value[,...]
+ m& E( {1 l/ ]/ e, U' m+ M3 xdcd value[,...]
' i- K' h7 J9 W' [3 T9 ]2 E2 L+ s( P/ Q. R
写doublewords:
7 ?( L2 Y. I2 Q5 ?" X.doubleword value[,...]
0 A6 b4 }: ?; |$ T# p- H8 ~.dd value[,...]3 M2 Z& t9 y: ^# m8 ?' _& C
dcq value[,...]2 f  _) X$ L4 K4 F
0 h, S+ `4 [% f; D5 t/ F
写浮点数:
8 r8 H& X. E( Q8 P! T5 V.float value[,...]
2 `* r3 `; A7 ^; J.double value[,...]% q* R) @& K8 m! v! \% I1 U
$ V, b- ?  e6 m% H) L$ G8 [
ARM的ARM模式和THUMB模式定义:
0 d4 R# s, c3 i+ z- d.arm|ARM模式
1 e0 C; E9 `. E( t+ z.thumb|thumb模式
) V0 Z! [3 E4 ]8 G" v! K8 \1 T# q; s4 R! L. b- J2 S. @5 T
设置架构:
  n" L% C: @8 k# z$ B0 v8 ~.psx|PlayStation 1(MIPS R3000)1 L. ~' S) Z' c9 V$ G! d; T
.ps2|PlayStation 2(EmotionEngine)
- E1 O6 V! ]" Z! J5 r.psp|PlayStation Portable(Allegrex)
" m; P7 d6 R% i) m* f( s2 Z.n64|Nintendo 64(MIPS R4000)
' @  e3 t! K3 A( u0 v.rsp|Nintendo 64(RSP)
3 Y$ o3 _: M, \.gba|GameBoy Advance(ARM7,默认是thumb模式)+ o6 l& Y0 ]4 v  S
.nds|Nintendo DS(ARM9,默认是ARM模式)
0 Y7 Z8 j  H1 U* {% L6 ~# L4 O.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
6 N, Q0 `/ L& c5 S4 A2 j.arm.big|4 X& y+ @7 x6 e: |' O- e
.arm.little|% N5 ^* l+ K, z; m/ n# I5 k
- ]9 J- k: p% y! a% H2 |
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。5 q/ N/ N( Z2 N, j( ^
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-27 06:03 , Processed in 1.099610 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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