EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2174 天

[LV.Master]伴坛终老

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

* o) O8 C( ]* v/ Y  s/ i# J5 P% ZARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
0 H; t1 j( P- k0 k  G9 ~  n5 S$ g% f6 R3 N
ARMIPS assembler作者是Kingcom,目前发展到0.9版本1 g2 ?2 C4 |0 q1 w+ h7 d$ a* D
3 j. K: \$ n% d& Q: s# `( l
Kingcom's website:http://aerie.wingdreams.net) M( Y1 V: V4 k+ P$ o
% K3 n# e: z- M, k
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得, h# h; A2 v* C; E" U  V8 i

% w$ u5 y; g* t6 h更新版本可去http://buildbot.orphis.net/armips获得
6 t, I0 V5 A0 R) r) N: }( n2 A' i* w+ p" I9 x
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。, h0 Z: g0 E( `4 a9 k% ^: }% n
$ {3 M% S1 M  Q# u0 m5 Q5 `, k
ARMIPS命令行用法:
* x" G  G2 Z, D3 y$ f* D9 x
/ o: @5 m$ t  B# u, XUsage: armips [optional parameters] <FILE>( @: W' L% v: L

! m$ x9 r4 b2 ~Optional parameters:1 M7 j7 [) S" ]0 [0 ]
-temp <TEMP>         Output temporary assembly data to <TEMP> file' b8 z( |- a# N( Z' C
-sym  <SYM>          Output symbol data in the sym format to <SYM> file( ]4 F6 j  {& |( _$ J
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
* ~% d: ]+ B; P) B  |: P -root <ROOT>         Use <ROOT> as working directory during execution. j7 v; \$ X5 t9 L1 ]
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code. @( e5 d0 n; o- {7 ]8 p7 G
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
% o9 Q! O  ]- w' {; Q3 ^0 ~  t -erroronwarning      Treat all warnings like errors
# I' ~! J$ g& Z
/ k: z3 N7 J2 P9 `7 m5 TFile arguments:
1 H1 P; j& y3 t; ` <FILE>               Main assembly code file( d. L" b" C+ ]% ~( V  O+ ?* b% o

7 _$ l; g* ]) f8 d3 `9 ~: @-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件# m' z8 ?+ I& a# H: l" C  N* `
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba/ P: d- ^3 I' h* Y+ H
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp+ Q% l3 R# d( r& }/ O+ \4 L
-root <ROOT>参数是指定执行期间要使用的工作目录
4 z6 O! ]! m' a  A3 E0 Y-equ <NAME> <VAL>参数用法不明( D: I0 N- r2 [4 o3 G& d
-strequ <NAME> <VAL>参数用法不明
/ O6 ~; E4 G. g7 B$ [1 p; C( F6 }-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
$ V; v1 o9 E; C3 A5 O! G  s7 \7 K; T; @& L- u' A% w0 p4 S
<FILE>是汇编代码文件,可用记事本之类编辑
. ^1 M0 }3 H4 ?; j! u9 `. _" v8 _6 E9 V$ _. x8 S, Y
注释说明:# X( k: J( N) m6 T/ S# {
注释可在单行指令后面“;”和“//”添加
, o5 Z" ^$ P9 ~' g! k- X! Z“/* */”式也接受
( B* M$ W6 B3 {& R7 l1 a: k1 }, K
例子:
8 M/ }7 [9 P3 f' r0 J8 C.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
0 N" e3 D* T; C$ |0 p7 n0 V$ c
5 y& F/ A7 X/ K.close;/*关闭文件*/7 I# {& ]( a6 l# M" U* V. B# _
2 f% R/ `, [" X% k, @/ l
标签说明:2 k! B! X  ^5 |: R% W. s0 ^
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
/ l6 D6 c, N) A9 m- d+ p! I% J4 s1 S, v1 k, Y
数值说明:8 q; E8 A( e9 ]$ \8 j
“0xA”和“0Ah”是16进制数值
, l3 D3 V7 f3 ?, a“0o12”和“12o”是8进制数值9 U" V8 s4 G: _& O. _
“1010b”和“0b1010”是2进制数值
5 S. w+ K* y+ y# u5 `# G+ \( _/ \( ~+ b0 b' ~
equ说明:
/ z& ]- g) q" S+ U  _格式:text equ value
, m0 Q" Q2 I  I; X, `说明:用一个text代替value- H% t, L/ G" ]3 M/ L  S& V2 }/ J; Y) L
例子:
1 z( ~) M% k0 u9 G, naddress1 equ 0x12345678. [" \2 U1 v& \/ h/ n* h4 P
ldr r0,=address1. o$ f2 o' x* ^4 k  w
.pool3 Y8 _- {5 x3 L* u' j% G

* M$ }( E% |9 c# ^函数说明:  w- ]4 f6 q( c2 q$ v
$ @5 G3 K1 ~2 o% s" t  o# l
.open函数:
- J1 w. R5 m( m" o/ y7 S9 a" p格式:& B5 |) r0 \9 L% Z2 Q
.open "ROM FileName",offset
* x. b0 f& }3 e.open "Old FileName","New FileName",offset3 S% Z( g/ D3 ]& A
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。! B: Z% t3 Q7 x" ?0 Y5 a4 x; y
, \# ^* k7 [. \
例子:& Z+ x* h7 M7 c' B2 A7 F
.open "1234.gba",0x080000007 u' R2 S7 M/ \- U' c
7 k( r, ~, T5 U
.close函数和.closefile函数:
. E+ h6 v6 n& V7 D/ e, u格式:
; m" F" @( [! M1 @3 G.close  E7 W- ?. g! n! b' j) Z; E2 B
.closefile
9 Z6 H; f; h4 {0 B说明:关闭文件。
, @3 a8 y. `; T* ~
( V3 I7 }( Y. @.org函数和.orga函数:2 ?) D  N( l9 V6 |; p) C
格式:
' B' ~: ?8 R# n+ \.org RamAddress
2 h8 o# v& o6 R4 d) S.orga FileAddress
& i! K! b8 G( s2 s5 t. D) F说明:
7 E, [7 Q0 G& V4 z; n' j! d前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。6 x! y) V* _6 U. ?5 j  C

8 J( E* |& d7 z5 F; q) ].orga函数可指定ROM文件的输出地址。8 @* c: d  t( `/ |. R
! S7 D/ H) D  W6 K" N& m
.create函数和.createfile函数+ H! A" c! D& o0 h2 `$ z2 a' W$ ^
格式:6 x! a5 v$ ]1 V8 b; @
.create "FileName",offset
2 P. ~8 p* _6 `3 y* {.createfile "FileName",offset: H" p' B: M  ], [8 F4 i
说明:创建一个文件,如果文件是存在,他会覆盖掉。
9 c( K2 A: }' K" b7 X3 ~0 ?! {- A( O6 z% Z+ h# @
.area函数
# T& N6 o2 K7 I3 H, D格式:
! m+ T* {- Z' `0 @) k* A1 D% X.area SizeEquation[,fill]
3 o! d: x+ m6 P4 w.endarea
* X: ?1 b9 n% [说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
5 V3 g) M" B0 j$ Q5 E) `4 l3 T: s
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据! q' T! h/ p. h  l0 C; d1 r
org 0x100
% O! {2 m; i) C.area 0x87 k+ C$ Q4 H3 l/ T
byte 0x5,0x6,0x7,0x8" K. y; d! e0 L6 I+ n: [
.endarea
$ m# _2 O8 \0 E$ B* S9 I, |  p& }& Y/ E5 D( L1 G+ N6 B: E+ G! r
.align函数
: g$ b$ ]4 ?( z! M7 n格式:.align num
0 y0 I* X6 D! y% @说明:写零字节,num为零字节数量,用16进制表示。# E: V  f- l9 f3 w! C; h& `
8 P2 e) L. ~# x3 {+ E
.pool函数
0 \6 c7 }  `, R5 ?格式:.pool
* ~% H( M5 t0 U8 L* c; E) Q说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
9 c- S5 V& ~1 c2 y例子:
5 ]* V, i: w! s/ `# Y; Oldr r0,=0x12345678;
% f4 X/ X+ q4 A, P% ?" ~5 c4 ~$ T8 k....4 S' `- B; U- L9 o, j# G9 u
.pool
0 X" m  E, c/ C0 Q: r( \+ I- z$ s* c6 J, @4 I0 M
.fill函数
& Q7 J- Q$ [; E4 q$ g格式:
1 ^! R+ n8 G; c1 A5 W.fill length[,value]4 G1 I/ E1 a2 w& M# P
defs length[,value]/ M6 ?! [5 c. B9 ?
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。5 s( Q9 w% G& \! D) R. C9 @+ c
, _- A% G8 J9 {3 l! R; J* x
.skip函数:5 |" C7 d; M9 a, c' m. s" Q6 G
格式:.skip length, c+ h- H& ~7 W/ T6 f3 D& `
说明:跳过指定长度单字节数值,length用16进制表示。
1 T: c/ n; ?7 G5 H9 s% c/ J
! z+ |8 [  U  O& j3 a/ Y写单字节:
3 l* G$ y$ M6 g) ].byte value[,...]+ ~9 \7 V3 T8 D+ O0 q
.db value[,...]" q( [( V- a1 g3 g9 i, u
.ascii value[,...]
5 h6 X/ o& |; |: }.asciiz value[,...]. x- O) t+ l- Y) f  m
dcb value[,...]
6 I  a8 @! K2 M" i6 E  g$ l- v" x! h- g0 o5 n# t5 K
写双字节:" d+ x6 n6 z+ Y) q4 T& g, w
.halfword value[,...]
3 H4 \* [  i* a5 ], D8 G+ ^+ [.dh value[,...]
) K( |* ~  e0 V& p# x) [dcw value[,...]
8 F5 ~" e$ b, ~/ Z  a) }2 g# ]% @6 B. H0 @3 k) j8 |) o! p
写四字节:
* r" I% v$ z5 s! }, ]$ p) R$ W, z% n.word value[,...]; U& Q7 B( u6 t$ [! n
.dw value[,...]
( P' }1 @, ^3 cdcd value[,...]/ M$ ~) g) h; R9 Y

: u9 |4 U! w- l写doublewords:
. x: _6 t% L( g; i2 `/ G* Y.doubleword value[,...]5 p3 U$ n" e( G3 H
.dd value[,...]
0 W! u2 i8 L" a" s4 I: c+ qdcq value[,...]" K' G9 g: G4 O% p  D7 m

, n( |2 U8 u' v% |写浮点数:
6 q( x1 L* X0 W' o" ^' k.float value[,...]
: Q, s, Z: N1 O9 V$ D. o9 L+ t.double value[,...]
0 @4 z6 C. k% ~4 f6 y3 n& e- o4 i; S# B/ O
ARM的ARM模式和THUMB模式定义:4 ?, d( o. }1 |
.arm|ARM模式
; Z& F, j2 z+ b* G) a.thumb|thumb模式
+ v( y- ]( r$ S; j( V' H0 Y% e$ u; P! e
设置架构:
7 H+ P+ \' J8 n$ U. z$ W.psx|PlayStation 1(MIPS R3000)
; W0 g7 t( s+ W4 O.ps2|PlayStation 2(EmotionEngine)
' |  o9 j% O. L4 L+ Q- G.psp|PlayStation Portable(Allegrex)2 A- a! z# s; F  [; q! Y4 [
.n64|Nintendo 64(MIPS R4000)
" c1 p' O8 t% D' Q! v" T8 A- g.rsp|Nintendo 64(RSP)
7 r* P& E/ u& ~- S4 h0 _) _.gba|GameBoy Advance(ARM7,默认是thumb模式). t; q+ _' D( W7 G, A& a+ l
.nds|Nintendo DS(ARM9,默认是ARM模式)
/ H% e& S+ g" Q$ ?.3ds|Nintendo 3DS(ARM11,默认是ARM模式)6 g9 G' c. o  [# c
.arm.big|
: m4 x6 P- E1 M$ B, F& o.arm.little|! `! S$ J) \0 r3 g& \6 P6 a$ G

( v2 A: H+ ^. }( v. [! Z7 ]' K常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
& P" k$ h- z4 g5 c4 {9 n. D5 u
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-28 13:55 , Processed in 1.055664 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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