设为首页收藏本站

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1914 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
0 M  w$ ~' p2 H3 x$ y
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
/ i# x  v5 S$ ?4 C! ?- ]3 H( v# _$ _, |- T2 y* A
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
( E  s! z# X* [4 L' r  o2 h" Y: d( g; E6 p. Z( g' j! B  R2 j
Kingcom's website:http://aerie.wingdreams.net
+ N* s4 B2 Z/ P; s" _0 i& U* `, k# M. I/ n
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
0 O7 g. l% Y0 D& k" D
! N" ^5 n  c6 `- i5 P0 b7 |更新版本可去http://buildbot.orphis.net/armips获得
$ t9 u! ~; ]+ b8 Z" M3 n( m( _# A( R3 X( V
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。! b: P, _/ {/ j2 K3 J/ A, G" w* y& b2 l

. j: z4 V9 Y( e, c9 aARMIPS命令行用法:
* i- }$ L, A& q* Y; ?( p' d7 T- s8 |5 w& X, D; ?2 E
Usage: armips [optional parameters] <FILE>) _: o- R! r0 j  c
1 P$ o/ h. [; A  \
Optional parameters:2 M. U$ ]7 f* T0 @
-temp <TEMP>         Output temporary assembly data to <TEMP> file' x) U( k& J1 S) C
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
$ J7 m! L2 k1 F( o, k& w -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
( n& P& p& a8 H. y0 \0 d -root <ROOT>         Use <ROOT> as working directory during execution
! o5 x9 q' x* W! l/ \ -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code3 O% u7 @; ~/ S* D4 ]* @
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code5 D. o  V& D/ }4 }  O
-erroronwarning      Treat all warnings like errors0 i/ x$ q  g' g; n. z3 C

0 G, L& X, j# ]) iFile arguments:
# f  T: ^' c1 h3 ~9 l: {5 g/ w <FILE>               Main assembly code file
$ N9 q2 k! U; _. q( U8 c& J
9 }# p. m4 D: ~5 g  Z% P# }-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件+ J, C1 g, n- b9 d# [. H
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
+ |7 Q0 D& I9 d- V3 S-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp2 h8 Q# N2 }/ @- t* Y
-root <ROOT>参数是指定执行期间要使用的工作目录
0 ^2 }6 _8 p" P- h; t4 ?-equ <NAME> <VAL>参数用法不明
8 ~: c) ?4 w+ m( g8 |" T; F  u-strequ <NAME> <VAL>参数用法不明
  B! @  U; }: p0 V8 Z- M5 b4 P-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
' h# g4 N( l7 h1 Y" j. `6 F2 A% r9 ]1 l; u
<FILE>是汇编代码文件,可用记事本之类编辑
, W2 V: x$ i5 ~' E' d9 p4 y) F1 W! g/ V/ H
注释说明:8 W; |8 ~! v5 r' [& c" h
注释可在单行指令后面“;”和“//”添加
& i& ]9 l% d: L' a, {“/* */”式也接受
) w6 _) t" k& w5 o3 U# s
' t& Y5 v8 N0 W9 r例子:
' g& m. L/ R2 Q4 y' |.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000006 D, Z" d, Y+ i; o. B/ u, b) n+ S
% z( n' ]) R# l; M4 s/ s6 Q$ Y: h/ E
.close;/*关闭文件*/3 J' Z7 z# k  M& F

3 ]; z0 V. K& G" C- F" f! P1 z标签说明:2 E6 l, ?4 z- Z( `
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
! b) y, g, f' D# _" w, v
! ]2 I; z' [- U8 j4 I1 h+ L数值说明:: X) w+ i$ D  {
“0xA”和“0Ah”是16进制数值
  x; t( t% o8 G; c9 o“0o12”和“12o”是8进制数值
' }4 S4 D0 `7 B“1010b”和“0b1010”是2进制数值6 Z5 X# h# @4 p* n2 A

" G" E9 z6 l' Q# F3 q0 pequ说明:' P$ z8 Q0 N9 H$ @" b7 J
格式:text equ value3 l# {0 P% C: Q% Q
说明:用一个text代替value
0 g6 C2 T- @0 D例子:- L( l% u, Z# F- B3 c
address1 equ 0x12345678. `( E9 \% Q) f! F/ t
ldr r0,=address1
. F6 V9 {9 m. K.pool% l) n0 h# p0 t# L. `8 ^! \+ ~! X1 S

9 x) @) j  ?9 r; u/ f4 \6 n3 s  |函数说明:
2 o$ S4 E* E, S) \3 m) e0 \- E4 U
( f; d- G+ z) }: R. [% I, S  p- f" \.open函数:* L6 M" j4 [1 J
格式:
1 w7 }; {  N3 j  n! W) J( X' ?/ Y.open "ROM FileName",offset5 t/ r- n& ^8 s+ t
.open "Old FileName","New FileName",offset' l$ B* _5 X; w/ Q" f% n, }
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
, N& ^" K9 W9 K' W  k+ T
6 Y7 ?" s. @; e: i% |例子:8 w; L/ b5 i# x$ U: z
.open "1234.gba",0x08000000, _6 B. Z; Z' v" Q$ w8 g

4 R- {, z* o8 @  o.close函数和.closefile函数:' X! g& L5 \1 E5 b# J# r3 I
格式:
+ h# l$ W3 g. z$ D6 P.close
" Y. A' r% O) ~8 c4 J.closefile" e3 Y1 z# V# a, r; {
说明:关闭文件。
/ X3 T7 u& _( D2 B4 q6 V4 S% _: O3 F1 g2 G+ F
.org函数和.orga函数:
$ K) H( e9 B' O* e- Q0 e( z1 Y. e% V- T格式:
; W: G# a/ \8 o$ g  u* E7 h.org RamAddress
$ }$ d, _. W: D/ a0 |. d! e3 R$ P.orga FileAddress$ w: T0 x5 w, {; t) K; G
说明:
" x- Z3 \* B# I6 i前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。0 d& O# P# g! K

7 L, @+ p9 `1 g9 {.orga函数可指定ROM文件的输出地址。
& u0 S6 j  Q" Z8 r/ R7 S; Y) r2 M, _" {% z7 E- J6 x3 I
.create函数和.createfile函数& e7 }6 N6 O" S. L; p
格式:
  Q+ J, h) k6 j.create "FileName",offset! L0 \4 ^6 k* e6 p; G/ c0 X( c+ p" ^
.createfile "FileName",offset+ G) z3 W( ^# I3 g0 L3 p
说明:创建一个文件,如果文件是存在,他会覆盖掉。) P  X8 v# Y8 z* l+ Q% G

% B; W9 o, E5 Z.area函数1 T1 t  L8 ^+ Z6 D$ H2 p+ J8 p
格式:. r# D* O  A2 L
.area SizeEquation[,fill]
' _) \! L0 o8 A. ~4 T( B1 Z.endarea
/ c: u  g/ E9 W+ e: v) W. e说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败& q) g0 O8 f% S: |& l$ E

, }2 U- V- i" m$ @例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据/ ]. }0 B) e+ ?/ I6 H# ^. J
org 0x100% o& g& C2 {: A* b' ~6 q3 d
.area 0x8/ Z8 q! ~% L( e4 @  A5 ]7 ~
byte 0x5,0x6,0x7,0x8
' J' W; ~. [! e% o5 o- v, ]7 F) J3 w! T.endarea
9 `- [* F4 p9 V$ @1 @% K3 O
9 f/ b% `6 Y2 V; ?' b.align函数
  u" u9 T% b4 u; f格式:.align num
. \  e+ A9 i) T) }' T说明:写零字节,num为零字节数量,用16进制表示。" D1 R' z; p3 e$ A

& f5 S$ U) V* ?' f7 X.pool函数! ^1 g9 F. x2 N0 W; S7 z
格式:.pool2 x. W( b2 Y5 q( @& Z0 O
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。! m7 h3 S- [. Q' p1 f
例子:7 y$ i! U  _  f( D% l
ldr r0,=0x12345678;
5 a4 f9 k/ i& m0 o5 U( V: @....! j7 B2 t. H/ H. X0 c7 C
.pool3 F4 Y9 C1 ?6 p+ {- o* W

* Q$ a5 C% j' N.fill函数
3 C: Q: n1 U! `- I) q格式:
$ n" W  N5 C: y; P# F.fill length[,value]
( ]! F% Y, g- ]3 K  Vdefs length[,value]. O8 i9 P' L$ f. b; y* a% U) U" u4 E
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
  w& O. T1 d$ J- v3 u9 H2 m" S" L4 r& z+ ^2 e  V
.skip函数:7 M: N: J/ p# {2 E
格式:.skip length
1 `, }' I" l* R2 A3 M' A' F说明:跳过指定长度单字节数值,length用16进制表示。% F$ P6 @6 V/ t

$ {" S4 i4 f* E; n8 A( X. s写单字节:! v" Q# u0 ~5 I* I" N
.byte value[,...]8 m/ D  _8 P+ B- q8 |& \" T- W/ q: ]( P
.db value[,...]
. a( ~( S* ?; o$ q7 M.ascii value[,...]3 P4 M: P) F% I7 u; W' ^# _4 U
.asciiz value[,...]" w0 j8 j: @' ], A% \9 @. b
dcb value[,...]  Y9 t, c0 x4 U6 y: f

! W+ \8 Z. T: R2 K. ~, h3 ]& t写双字节:
: T% i0 U  s+ n1 |- A9 D.halfword value[,...]$ m% E) T& R2 [5 b! G) r' ~
.dh value[,...]
) s  o0 a8 d! w2 i2 t( tdcw value[,...]
" q* G: l7 h/ s/ J
9 o& @( T- B, z写四字节:/ V6 X/ |* W  c4 p. h# T3 ~' L* i/ {
.word value[,...]
! ~6 p1 }# F2 \! c4 i) o.dw value[,...]9 y$ x; O; T! N
dcd value[,...]
, {2 _6 |7 ^  m5 H- E, l& y4 h3 ^# ]- {
写doublewords:
( B3 l7 ^& c9 B" J* V* F& W.doubleword value[,...]
) A. P2 g2 z+ s* g+ g% H.dd value[,...]6 ], `4 Z6 o. p& }: |
dcq value[,...]
: V8 m0 y! Q% U: |: [2 W' o% W" q1 W% U, V* P2 q
写浮点数:/ M* {, F* z/ ]3 p6 P
.float value[,...]
/ C* d0 I0 ]0 B9 w.double value[,...]" G- }) d9 B+ M  c% g6 X: `) o
7 Y, Y) B' ~( i, r9 e
ARM的ARM模式和THUMB模式定义:
! r4 ]/ }, k8 u: J1 Q.arm|ARM模式
6 g, v) r9 Q5 T1 M( _6 a" k+ D.thumb|thumb模式7 A5 S' C% s* B% U1 a( j1 q' L

( G0 {: o! B- A  `+ ^7 i$ \4 p设置架构:
! e3 c- @3 [8 o- u.psx|PlayStation 1(MIPS R3000)
! B/ L; ?$ ~! C.ps2|PlayStation 2(EmotionEngine)
7 m( i+ r- q) X, W' `.psp|PlayStation Portable(Allegrex)" }5 S& J; X# ~
.n64|Nintendo 64(MIPS R4000): V8 t1 F2 N" \- o4 N
.rsp|Nintendo 64(RSP)
# K7 \& ~/ b. m+ N2 i# R# Z5 z% `.gba|GameBoy Advance(ARM7,默认是thumb模式)8 R" S& ?! j' e
.nds|Nintendo DS(ARM9,默认是ARM模式)
+ H3 z) @5 b6 D5 p.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
4 K( q# q0 g. r7 [; G& M.arm.big|! |* Z- L8 a0 S8 I! g, K
.arm.little|
1 H5 s3 K$ J9 S% z) |- A3 u9 |  Q
8 y! X$ [; ?0 r* r1 u3 N2 `  L常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。; l8 g) K9 R8 p# t! ^
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-4-6 19:54

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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