EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2168 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
. m' E5 h( B/ l
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
' S) I4 [  _/ o' p
$ r) V9 P/ Y' B  o1 {ARMIPS assembler作者是Kingcom,目前发展到0.9版本
1 K2 B; y; _  H( p3 B0 G  i  Z9 h: S) Y! B, |! }8 ^
Kingcom's website:http://aerie.wingdreams.net$ |! r. |: S) S

$ H& O# Q0 y  F  ~7 t5 v6 D+ kARMIPS assembler源代码可去https://github.com/Kingcom/armips获得7 G0 E# U$ C- G( {( x% t
. X% g' E! s) s7 V. r/ i! t
更新版本可去http://buildbot.orphis.net/armips获得; W( ]9 V+ t: {" ~* ]' E+ A- }

/ T% S  `" Y3 W& C) ~0 {1 E" rARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
$ ]/ c# Y% S! \' Y& ^7 w2 o  J3 l* C- c" {, ?. \0 |! @( p
ARMIPS命令行用法:' ~( R; |! W" _5 `- e. L; m
8 _* [/ Y2 H4 K4 o
Usage: armips [optional parameters] <FILE>
; u. z) C1 Y( U- S+ d: K% }: f. G; I5 F# s
Optional parameters:' H% N- I: f" A0 E
-temp <TEMP>         Output temporary assembly data to <TEMP> file# f& O4 s  O( r% E4 \$ i; Z
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
# P) ]& m8 U' p- B( d) b -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
& N( i" ?, ^% l! w -root <ROOT>         Use <ROOT> as working directory during execution6 n9 o" C" C- W  i8 I# D1 `
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
$ Z+ V1 I0 z8 m: s% N/ A -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
7 ?6 A1 V5 [. f$ i' m" f -erroronwarning      Treat all warnings like errors1 T7 Z& D& a- S6 `# _
" Q" g% G3 d# `* h# l
File arguments:
' E7 i; f. q# c5 G) c  s <FILE>               Main assembly code file0 Y; a  K6 A, I% B* A# F) i& H( O

& p- v" J+ Z5 ~% c. v/ `$ ~-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
8 q  {& i3 q! L6 J-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
8 A; B0 b4 f! z6 r# k-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
" @& l, {9 G( b* F8 R2 D+ {8 u-root <ROOT>参数是指定执行期间要使用的工作目录* {# O% ?8 J  `* I  w/ X7 D' }+ T" _3 Y! d
-equ <NAME> <VAL>参数用法不明! `/ |0 u% N- V5 j0 R/ g, A
-strequ <NAME> <VAL>参数用法不明
0 D. z/ Q' I; V  T- M4 \( }0 C; g-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
. y, \  S4 \, l+ K
0 U. n2 a. t, m<FILE>是汇编代码文件,可用记事本之类编辑
- F4 ]# E7 U1 A' I" f: z1 a4 c( T: w
注释说明:
! g* e* ?/ d2 M" v5 g注释可在单行指令后面“;”和“//”添加# r& Y; x0 O5 B
“/* */”式也接受
+ d$ @0 _6 P! d3 o2 r" f$ A- S0 Y8 ~- ^# k3 y
例子:. @) g5 ]; S, v6 S1 \
.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x080000005 @- M8 O/ ~/ D0 [

1 p/ }% n7 |) L9 e* m! ^.close;/*关闭文件*/
% e" k. |% k- f) [/ d" ?, H% s3 N! I" A# o" A
标签说明:
  X+ i+ _& d: ~3 y  H" a标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。& {, P% @" M% L1 q

/ u$ A- n& F& U+ d数值说明:
  `# g! w9 ^' N6 W  W8 B“0xA”和“0Ah”是16进制数值$ U! @) h* Z% x" n
“0o12”和“12o”是8进制数值7 i( O& h7 w: ]+ I$ w4 D5 E
“1010b”和“0b1010”是2进制数值% ~9 n$ _- H3 D% m1 ]
9 |. t; T8 v6 B0 k6 I( T
equ说明:
5 ~6 F1 `  T' j/ s$ A格式:text equ value8 t9 r7 h: ?5 p5 f5 x; ^: @
说明:用一个text代替value: ?% Y$ l5 x  P, F1 s! _3 q
例子:0 f! k0 W6 w# B" C6 d' M7 v
address1 equ 0x12345678
+ u! o! E$ ?! |1 R$ L# w3 N5 Vldr r0,=address10 u" j7 q8 L1 ]4 P9 i, N5 [7 `
.pool
9 Y$ f) g9 p" b2 a$ J; K7 t- M0 e1 U+ H7 @; ]" Y
函数说明:5 s+ V# n- N/ T; K) }
- Q# ^3 d4 }7 y8 M& S
.open函数:
3 w' X! f' U( Z! }  d8 p格式:3 K  {3 P# Z  q3 f. R/ z7 Q
.open "ROM FileName",offset0 y* X8 k3 O- a/ z/ h- H
.open "Old FileName","New FileName",offset2 [1 Y$ k$ Y% p4 @% ~
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
) m9 \  @+ P9 f1 v  R5 d3 m" ~6 W* P0 {4 w; ^6 U9 ]" W5 W
例子:
2 N) ?1 K- h' v; d.open "1234.gba",0x08000000' F: l1 r4 u9 n" C
' c- v/ E1 V  L5 [4 l5 l
.close函数和.closefile函数:
1 x" n. j: E, \格式:
; [) ?9 o* k" r# v5 k% R5 j.close
$ d3 H3 O, w3 H/ `.closefile
/ f3 v5 H( O; q( f说明:关闭文件。; e; ^7 ]7 R% m  S7 Y' F" n
* k" w; t6 T8 M* o8 c
.org函数和.orga函数:' W* d1 c9 i- P' ~4 q/ o
格式:
: d/ ?, w  x; z' ^) }4 c; a.org RamAddress
9 q8 G% u9 P$ D.orga FileAddress
3 O! ?5 S$ x6 F0 u, L说明:" T1 F" e0 [/ v) @
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
6 U" ?- f! G; L( f
6 d  t- i# D/ @0 U1 D; @( D$ a.orga函数可指定ROM文件的输出地址。
  P; K6 s* M2 U% r: e& s& }: D& A* X) U$ D* [* |
.create函数和.createfile函数6 V& p; U3 B. q; G1 X( w
格式:: E4 `# _( z% Y8 o
.create "FileName",offset! d3 P8 \( }0 M$ o6 L# o5 y9 d, B2 U$ t
.createfile "FileName",offset
  E! m" ?+ G; k7 C) z说明:创建一个文件,如果文件是存在,他会覆盖掉。. ?/ k7 @# G  c, H2 `

5 _! q5 g; H! D* a0 c: @6 z.area函数
& U* Q2 H, L+ N/ P格式:
) j8 u$ b% g0 O" r" o0 k.area SizeEquation[,fill]) G6 ~7 I$ L2 a: X7 [, q5 h. t
.endarea
3 }5 k) N( k  Y* J6 ^4 ]8 m3 l说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败5 `/ d6 Z, ?8 Y, Q2 X1 w7 l$ y( @/ a
& p, D0 R0 N/ T2 w  ^$ i
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据  H! e7 C1 i$ Z( X
org 0x100
) S+ y+ ^$ Q0 M  w5 L: ].area 0x8
/ c7 M- j3 w' u' V2 cbyte 0x5,0x6,0x7,0x8( O! h; B6 J+ E! S& A& ]
.endarea
' c, l9 C% C  L8 ?+ D& t5 l2 E4 [( C
.align函数; e7 X9 E- @1 K* E6 |( B0 Q
格式:.align num  g$ ^7 c" \" e" N/ o! B
说明:写零字节,num为零字节数量,用16进制表示。
5 C, c8 a' C+ h) S* O2 q% e9 y2 b2 G4 g9 _; H% j7 P6 ?% d
.pool函数
, X  c7 p$ R/ t  S格式:.pool; {) |4 l% Q+ F; g$ D
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
! Q3 ?0 l  E  `  o例子:0 q) M. K4 b3 L( p% u
ldr r0,=0x12345678;, y" _# f3 L1 b$ K" y+ w9 A
....
5 r( }: |9 t  F( @- K$ W& Z.pool! ?$ L8 R1 v2 X2 z

( I& O' Z7 L6 R  _. T.fill函数) L" U# R5 o+ I2 B
格式:1 H4 f7 Z3 @; Z* B! C1 r, f
.fill length[,value]9 o* R  r( p* o# h: m
defs length[,value]2 W: v) L% ?3 a) I0 U
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
& g* b0 n/ ^5 V" z. ]! `. n* ^2 r/ `; A$ d, F7 e
.skip函数:
1 p0 p/ H. Y2 E: P8 v2 H1 T格式:.skip length4 s3 o! a% }% I
说明:跳过指定长度单字节数值,length用16进制表示。
5 ^8 l! }5 K9 `$ {, M1 v* @8 S' J. c! R1 ]( W( D
写单字节:
0 W3 y' E5 V/ p9 s# M; n. J6 H.byte value[,...]3 U6 g3 \. N  T9 u  r8 @9 d6 w
.db value[,...]# J" j" h- `  p! ?( L/ L& r2 J7 R6 i2 s
.ascii value[,...]
4 ~, C/ v5 |) g! X( e.asciiz value[,...]
% n2 K0 a! P  u1 gdcb value[,...]- o' b$ w) z  f5 G& {' m9 y

/ y$ N" V8 r# ]  m写双字节:& A8 O0 S" @& g3 I
.halfword value[,...]- ^$ t: m, J$ X1 S' s1 j7 d% O" h
.dh value[,...]; r  C/ Z4 `7 Y( H
dcw value[,...]
( v$ V5 G  K* p, [" o* l+ s) t- g, B3 l& P
写四字节:
  a" k: W- |6 e& W1 p; X  y# [.word value[,...]
3 d. d; Y- |- I% H1 r+ n.dw value[,...]
% b2 |5 p. o& C3 w  kdcd value[,...]
; m: n) L2 f( o+ @' y9 r* X2 ]8 |" @) I! \9 k* }
写doublewords:
) ]; J( ^" h" }1 _.doubleword value[,...]/ {* v3 I5 \( N' _8 L
.dd value[,...]" {3 G! Z1 M4 j. _; |
dcq value[,...]
8 ~8 J3 g0 B2 D6 s: Q- D- s8 p0 Y& }) C9 L6 T1 u1 D
写浮点数:
$ D! E$ K* R, j! m.float value[,...]9 P7 @# f( d, ], u/ c! n
.double value[,...]
5 u# j# _2 ~' Q+ T* }8 c+ g* D, @  b0 B6 L  E0 {
ARM的ARM模式和THUMB模式定义:% M5 D8 \1 c  P4 G+ [9 y$ m
.arm|ARM模式4 Q$ t" w) v* A  K4 l4 T
.thumb|thumb模式% C" N- Q8 X0 j5 V8 ?3 H2 Y

# k" W4 j* p# w( m设置架构:% n0 o4 G- x+ _& P8 ]' C3 s* u9 C
.psx|PlayStation 1(MIPS R3000)
4 V5 V/ }! }4 H' Q) @2 E; o2 x3 C.ps2|PlayStation 2(EmotionEngine)
$ C- b. n0 C1 q* C# e! ~3 T& R8 L.psp|PlayStation Portable(Allegrex)
! D0 t& r% @6 f0 M  {$ C.n64|Nintendo 64(MIPS R4000)1 e) ^; ^0 Z( ~. A7 e' W+ L5 N
.rsp|Nintendo 64(RSP)
. Y. W: k- _7 R" y2 u.gba|GameBoy Advance(ARM7,默认是thumb模式)4 t! Y% B. ^* \- {4 d$ ?9 O
.nds|Nintendo DS(ARM9,默认是ARM模式)3 p/ `) y. i6 V! y
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
" p' Q+ c6 {" v. K3 A.arm.big|
: e* F/ z7 }$ Y2 g! h% F3 {' X' k.arm.little|
6 A6 d6 u* S- O4 U% {- u$ T  r( e
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
; _2 y1 v. d+ X) r5 h
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-22 01:15 , Processed in 1.066406 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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