EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2142 天

[LV.Master]伴坛终老

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

  v: T4 N9 R' I/ J% R% N9 z1 N3 f  j; QARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40007 ~" h- V( t0 `( h" `
* l. u7 B' F0 g0 s1 ~; o
ARMIPS assembler作者是Kingcom,目前发展到0.9版本/ C0 q$ c( G+ U  i' W6 d1 L$ E+ ^% f

& v0 m( i9 l8 X, }Kingcom's website:http://aerie.wingdreams.net  a$ h% R, A* @  w% N8 X* C

/ T) D$ j* e% Z  _( oARMIPS assembler源代码可去https://github.com/Kingcom/armips获得( p3 q+ }% n3 a4 h

# U% D6 u7 t3 W, d4 L1 X更新版本可去http://buildbot.orphis.net/armips获得
0 C/ h( j- K' C2 f% h
9 L# T  f8 j5 F0 Y' s. G: wARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
8 Q& y3 @; V1 ?3 X+ a; o( ^0 h. M* ]" \
. l  s, M2 R/ I5 _ARMIPS命令行用法:" H$ r( o) i; |

. i9 h) [$ C/ R! U/ |Usage: armips [optional parameters] <FILE>
& S( V& ]3 @6 }$ z6 X' w! d( ]! c8 d+ `# k
Optional parameters:
% X# H1 b& g! R9 M* [0 D -temp <TEMP>         Output temporary assembly data to <TEMP> file
; U9 r  u# _9 R! v& W -sym  <SYM>          Output symbol data in the sym format to <SYM> file
5 k0 }+ r4 V; C- o  s -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file2 G3 @; V' ]7 |$ W) t$ C- m* R
-root <ROOT>         Use <ROOT> as working directory during execution  Z. |$ V) r* b+ ^. _0 Q/ I( F
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
" ]! X. T; z# g1 [ -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
" A: Y) u: [# z9 B. m4 h& h5 W* K -erroronwarning      Treat all warnings like errors3 ]4 d- @" W) `. c2 w8 a# y( z& q. C
# V  t) ?7 M1 h
File arguments:
4 T" F  c6 K! H5 B& {, Z <FILE>               Main assembly code file8 q2 P6 f, k9 B* i# D" \

7 T$ E+ `6 G; P/ Z. t* P-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件$ M4 x' ^' b, v( Q6 N) b, y
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba" g) o2 q( L0 T$ S! p* m: M' e" {2 i
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
3 b! y+ Q2 z/ k. w, W4 R* ]-root <ROOT>参数是指定执行期间要使用的工作目录
6 a  ], k. r7 z# z! ~2 ~* Y) E-equ <NAME> <VAL>参数用法不明
5 S$ ~; F: W5 y' L$ n-strequ <NAME> <VAL>参数用法不明
3 a& H) w, S* r-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
+ p3 i- L& o3 X  y" k, U  h+ W% V% D; }
5 J+ v2 Z7 l/ p, Y& U<FILE>是汇编代码文件,可用记事本之类编辑7 B* U/ N7 Y" ~' ^' \
! S. i: M7 G' k+ t! x4 M
注释说明:
! N7 H5 C; e' ]$ i1 U* S注释可在单行指令后面“;”和“//”添加
4 F' y7 ~: Y! m& h0 {“/* */”式也接受; `$ l' P, }7 F* @5 _  r" @
7 o3 U2 |' y# P/ M
例子:
, F9 D' u$ C" \2 U7 c: x.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000008 f) _8 T* U0 Y3 h
4 X5 h7 `% b- }8 P, q& Q6 |$ [7 g
.close;/*关闭文件*/* ^( `5 h' S; S
% m4 `& h! ]. P, ?, P% v4 ?
标签说明:
* c! _; K& b; o' w标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
/ S; n# I4 g8 B+ O3 ~9 k
  W) h" h+ T. I数值说明:& o3 v1 U4 f5 n$ H) r2 p
“0xA”和“0Ah”是16进制数值: v" i9 r: V6 J8 r$ ]
“0o12”和“12o”是8进制数值, [* H; B* K! P
“1010b”和“0b1010”是2进制数值
7 P  c( Q7 J" Q( b  e+ B7 Q/ \
7 V" u) @% K5 aequ说明:1 x; f& Q- d! M/ `
格式:text equ value
7 i; m  x9 l  S9 q; y$ |5 T说明:用一个text代替value
$ N" T' U( r5 E0 `! G, q$ c/ ?例子:4 Y: N% s1 g  \8 x; ~
address1 equ 0x12345678) S, U8 |% S. n: X1 J
ldr r0,=address1( |7 e" M. w- }+ A0 o. |8 i8 e2 Q
.pool$ e* u* u$ p$ S. L8 a

( C- G5 t2 g( D1 _8 k+ [函数说明:% H- U6 q) d: v, ^# O7 K( }
, b* Q2 H* O, w& n
.open函数:* d" O; m+ z, Q# `3 `
格式:' X/ ]4 H$ K/ g) S
.open "ROM FileName",offset; M* r3 Z- p, S. |- p) Q4 e6 S
.open "Old FileName","New FileName",offset
2 C4 W5 [% L4 Z+ ?说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
0 M" b/ h+ I% n# ]4 _0 a. J/ ]$ r, e/ y8 C8 g. [
例子:
* x$ o; i3 f: s1 c) ^.open "1234.gba",0x08000000
+ @" A/ [, Y7 c- E" q3 Y: L% e$ e- p* C- J
.close函数和.closefile函数:' {& E  O2 B% [& w
格式:
$ U/ K7 X& F! L% h.close. O( o  S# P& o
.closefile
% Q0 l5 L: R- A说明:关闭文件。( u% D5 A4 w% L3 F) x
2 Z+ G0 h- R! ]% D+ X8 m, v) o
.org函数和.orga函数:
5 T1 L6 d8 T* l) m( f3 t格式:9 V7 {1 T# ?! t
.org RamAddress
% a2 \* c. @) r1 K.orga FileAddress% }: k7 K+ a* Z/ L  E) }
说明:
3 _$ u4 x2 m' J& |* w% u8 P/ Q# m前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。: x3 B$ @7 y$ Q3 u3 q5 O7 ^
. B, ~% o% ~/ q* y( R: x& Z$ W( p3 N
.orga函数可指定ROM文件的输出地址。: ]+ p5 z" g& t1 k8 T+ c

6 h) z# [, M) u.create函数和.createfile函数) a: P2 u# b1 j, G
格式:
% d- v! O+ U: z8 _* z  |' s/ K3 s.create "FileName",offset
; c6 L0 u' u& E7 a.createfile "FileName",offset
' u0 F5 V( e7 g% z( w6 Z- q说明:创建一个文件,如果文件是存在,他会覆盖掉。
& p  i; I0 k. \- C  n1 R$ Q* {9 t; ^
.area函数
7 ?4 e# C! z9 ~8 J, Q- O" L格式:& e4 e* D' ^* H+ v- Q
.area SizeEquation[,fill]* L2 D% d7 ]# V' ~7 y, N3 B/ ^& L
.endarea
( d6 |2 j' Q4 Q1 Q4 N说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败( a; {% x) m2 h. w8 W$ h3 F8 K8 k

- K# y$ t( o6 c  ]3 t" [% `1 y例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
( k) ]- F' j" m( ]" torg 0x100* P( w( N# P/ o( o( m
.area 0x8' H8 Z3 B* p4 l! L+ e; p0 w- K3 p
byte 0x5,0x6,0x7,0x8
# P( G, j: x2 `.endarea
; T1 R4 J  Z) R% X! K+ Q- @- }6 }) Y6 n
.align函数
) |) B; @6 x  Q$ |格式:.align num4 F- O( \6 d$ V7 J9 r" u1 W( D5 p
说明:写零字节,num为零字节数量,用16进制表示。: x( Y" ~& f2 q+ {
$ ?  T# |  c; g) ~1 p, ]& Q
.pool函数
( K6 |$ V7 o% x格式:.pool
( A* d: E3 A" K说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
2 f8 l% N" h( K4 E8 X, u例子:
$ r; H. i. m$ |ldr r0,=0x12345678;
$ H2 w; N' u( f....' h) t9 Q+ `9 N. S
.pool
. D! k+ \' c3 K& o3 o3 E3 Z; K* k; {3 x4 J% y
.fill函数( Z: A: U) _  o' E) t
格式:$ c4 M- E( }* _( [: S
.fill length[,value]3 |0 B7 `' E2 a' |/ k
defs length[,value]0 |# ?1 H0 a; ?. j. P
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。) s1 @3 ]& Z9 u

5 q" ]# k1 @2 @7 ?( {; k: n, `# y; x.skip函数:
: Y+ `9 {; y. }4 n) Q6 W格式:.skip length) O) s; @# L, n3 x
说明:跳过指定长度单字节数值,length用16进制表示。
" C1 m% A; c1 S: h6 U1 j  E
- a9 e% G4 [0 Z! Y( g" E' e写单字节:0 ]4 u6 e: H6 d, C
.byte value[,...]  @5 U( ^' y0 S) H4 v7 E
.db value[,...]
  q9 O% f! d3 ^; B# ^2 D2 ^4 m2 G.ascii value[,...]$ A5 x8 l7 D& {# Q
.asciiz value[,...]
. G+ X" B8 y' c0 r. F4 edcb value[,...]
0 h0 F7 u% N. ~/ r
* k$ A/ s  ~+ @4 R写双字节:5 F4 X5 i4 K6 v0 g
.halfword value[,...]$ R7 \: o; z" |7 }( |. t5 }! c
.dh value[,...]! }# e$ ?/ F) n$ R* E7 R: _
dcw value[,...]( I7 l0 }2 u1 b) S

* T0 L2 }' q; D& v) I+ G写四字节:8 g& C/ \8 V+ ]9 r
.word value[,...]
) \% z+ J1 s" W: k7 V.dw value[,...]
/ @, c/ v$ x+ s- y4 L$ sdcd value[,...]
/ D. w5 g# x+ s8 ~4 \! C8 |
9 F- m9 R* g7 O* N写doublewords:
) w) g4 ?- A. Z) h& G.doubleword value[,...]
" v! Z6 W1 f. d- [  L.dd value[,...]# |3 W9 `" u4 a' l8 |
dcq value[,...]
9 n$ |9 Y4 c$ F$ M# Q" d0 D9 n; y. Q6 J& X
写浮点数:& Z) D0 L3 c6 Y: b( z2 }
.float value[,...], g4 y# @* u+ e, x5 V
.double value[,...]
' f- i8 ~6 z7 q1 O1 r1 P& g" Q8 J
ARM的ARM模式和THUMB模式定义:
5 O7 q- V4 I! y.arm|ARM模式
, ^' i7 }) w  ~6 ?6 j8 ^.thumb|thumb模式
5 J2 `6 D3 _3 o" f4 ?
$ p! C3 K& S7 x2 J% O设置架构:1 z6 n% I& v+ m& x
.psx|PlayStation 1(MIPS R3000)" n* c7 y4 B+ a- n0 N
.ps2|PlayStation 2(EmotionEngine)
2 T0 y# V7 W/ ]/ v9 c.psp|PlayStation Portable(Allegrex)  x$ N1 o; J7 M# k' ?
.n64|Nintendo 64(MIPS R4000)' Z7 y2 d  M2 N2 I
.rsp|Nintendo 64(RSP)
9 g+ \5 H9 i4 B, r  _8 Y- S% F) m.gba|GameBoy Advance(ARM7,默认是thumb模式)
6 {9 P1 U5 x) S1 D7 l0 Q( `0 Z# K.nds|Nintendo DS(ARM9,默认是ARM模式)
/ c  P" p; T/ i' N# c& f7 j.3ds|Nintendo 3DS(ARM11,默认是ARM模式). a: u( R  F- m
.arm.big|3 C' z0 h4 B. W) _/ s
.arm.little|
& s: n% V9 H" w$ K0 r2 l
  V: n+ K7 s2 r4 S  \4 ~' x8 F5 |常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。2 J5 p9 B9 ~- P0 S0 s! V1 l
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-11-25 10:46 , Processed in 1.055664 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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