EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 2190 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
" U* o' a$ R6 l( Y$ y+ I
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40003 f0 v/ R. ^1 [3 R

* i$ A1 T( G0 T: ?% ~ARMIPS assembler作者是Kingcom,目前发展到0.9版本
# H3 T; ^/ r* Q% t  X4 `+ F' w( F% V2 b6 k# @8 D4 ?
Kingcom's website:http://aerie.wingdreams.net
0 U  t3 g$ v8 {( X8 {' J: p! p1 r0 D' p
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
4 f. o/ S( c: A+ W
, S' b) C/ e- G. n更新版本可去http://buildbot.orphis.net/armips获得4 y. ]5 i$ O% V5 R& L' N
% ^% |1 P0 H) c+ \0 _
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。8 q7 b+ ?/ i" j4 t

7 E! P  K' K# P. t& V. AARMIPS命令行用法:6 i! r/ r: T& |6 X6 b' O1 N" C2 W

9 i3 H+ }) v! @' B$ k' f( pUsage: armips [optional parameters] <FILE>. k, @  ?# A0 j/ I5 i7 [4 ]4 _

2 f1 L7 I# d. yOptional parameters:# q9 d4 i! M- T2 `, W# J$ t( l
-temp <TEMP>         Output temporary assembly data to <TEMP> file
- F) e+ l) H* h3 h. y1 G -sym  <SYM>          Output symbol data in the sym format to <SYM> file
' Q% t: L" D% |$ p$ H0 c  b5 f -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file* z* m4 q- ~& w6 m' G
-root <ROOT>         Use <ROOT> as working directory during execution
/ E' b3 n: s2 L; `! t; w' [ -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
. x0 G; ]0 I' l. E  O -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code, K9 P: Y. H8 e& o" E1 o7 e
-erroronwarning      Treat all warnings like errors9 H, z- {0 x( E0 k2 K3 N2 m

  M+ J4 i6 b8 vFile arguments:" {& Y0 l& D/ P% |# Y$ C1 N* E7 k
<FILE>               Main assembly code file: R) w  b) @) m2 ~, \5 _
. R3 n, O0 N6 c. c9 |+ S5 L1 c
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件0 z8 n: v& _* _3 ?2 I" P
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
- E9 C- `, S0 S# e( d9 ?' X* a-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp3 W* M5 y4 t7 i
-root <ROOT>参数是指定执行期间要使用的工作目录
. a, {% ]" E$ i: T2 O-equ <NAME> <VAL>参数用法不明# P4 i+ c) n3 M0 s. W
-strequ <NAME> <VAL>参数用法不明  B' v6 F5 I3 |
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
# }; S7 t8 [% p6 b& I
+ W: A& I7 G% s3 P+ p) c<FILE>是汇编代码文件,可用记事本之类编辑
( A! L0 K, R: Q5 C; b$ n- M6 R4 K2 P# G2 Z8 ~* t
注释说明:9 r& ?. C8 ^4 M/ |" Q
注释可在单行指令后面“;”和“//”添加
) I$ ?, @, O* I“/* */”式也接受% a( W/ T: z1 s; I5 K

5 R( e2 i8 ], k: s8 A$ P例子:
; o/ F  [$ `; N6 Q9 Q" R+ t% ?.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
6 b) v! ?7 U# D! |; S
0 L% a2 |; D; z" G- t( K& f.close;/*关闭文件*/* G: }1 o  k+ W

; G8 W: h5 f; l% `3 c标签说明:
, W  D3 c/ `1 R' L标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。6 p5 W5 V& p/ T" l4 H# S4 W
$ W2 |5 G" [4 J$ _
数值说明:
& U7 n+ P& j/ i“0xA”和“0Ah”是16进制数值
5 `3 ]& p8 @9 l1 L$ Q  ]: ~5 X“0o12”和“12o”是8进制数值
: v+ W0 D0 |4 c% _“1010b”和“0b1010”是2进制数值  _% H$ d5 i$ c0 }

% N/ }; m# X: T; xequ说明:
( z0 C' _6 j/ B8 @8 Z格式:text equ value
  b2 [0 {4 C+ O- ^; _. }说明:用一个text代替value
8 a. b9 U) T# o+ v例子:9 f1 P# p! `2 @, j5 c* z
address1 equ 0x12345678# Z7 @. [) k# e' ^6 o
ldr r0,=address1
) S9 S# H6 Z4 J& \; j: r.pool5 N9 G4 K  u* q; T+ [

8 E& Y0 f$ Y4 g4 q函数说明:# t% l. N3 e5 j& J: I" X' T$ @

5 g: v9 `# `$ H.open函数:/ T- f0 {) J, j' M7 W3 N. g
格式:
+ [' h4 _) d; j' t# s.open "ROM FileName",offset; D; N4 ?$ J% M  E1 l1 l
.open "Old FileName","New FileName",offset8 e2 y6 |/ h( X6 n) _5 n2 b
说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。: c& V1 j* u0 {0 N2 P: N8 V4 D
: M6 f! F/ f8 ^5 d2 i) T* K* {
例子:) S1 L; Q1 a/ _4 V
.open "1234.gba",0x08000000
' J( `" h1 K, \7 D$ [7 g+ H3 i2 w$ m4 E; _& J
.close函数和.closefile函数:
/ O0 `+ I) D( a% i0 U格式:6 L  k. M9 c. p& J7 V  v0 q8 ]
.close+ i8 y/ J1 {# a% T1 u" M
.closefile' f1 R! }* b) I; E
说明:关闭文件。
9 \6 g% C9 D4 T7 p3 y7 [" c8 y% o. ?2 t3 P
.org函数和.orga函数:8 z! N4 o! J2 S8 H6 Z- T9 }
格式:
  ~- R% L: `5 F, B/ d8 y$ H( q8 b.org RamAddress2 H' _4 }  p7 V% ^; D
.orga FileAddress
/ V! v$ o$ j/ r4 s5 ~  t说明:
( J" s. m3 m% ?: i7 ?5 |前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。: L' C- A/ }; W; F

  y5 ^4 C/ M/ |; G3 @.orga函数可指定ROM文件的输出地址。2 I+ f+ O. @) X( D; h5 S

0 w" j) M% @, ?; \5 o.create函数和.createfile函数
/ G& S" I- H" b! a7 D; n% [4 {. H2 }) z格式:
: ^  @; z' f2 q7 P) n& q.create "FileName",offset8 v% o& `/ e. |" ~  \* I' U% D
.createfile "FileName",offset
3 V! l# K- {' {# C5 y" }" p说明:创建一个文件,如果文件是存在,他会覆盖掉。
3 s4 `7 d( o. w( H3 R+ R2 G& P
: n6 F6 x3 o1 W* V.area函数
8 i# z4 s+ e, s# ?% L格式:3 o0 k0 r. ~, l' [9 \$ V- c
.area SizeEquation[,fill]8 v, J5 t! o' f3 ]3 O% `
.endarea
5 s0 h6 K0 U; A) t说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
8 w' C' g. s+ D3 r/ m5 X# i5 x; X4 {
# p- }# D) [2 }" v& K0 A例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据) X! B, Y5 y3 ?' P% Y/ U2 R( c
org 0x100  t5 E# I4 e* N7 T( S- t* @: `/ }
.area 0x8/ Z# a: O- h1 f7 a4 |4 H6 }. Y, n
byte 0x5,0x6,0x7,0x8
8 K9 e5 J! {, S+ j8 f9 W+ I9 c.endarea6 Z' Z8 M5 A8 Z

" u4 `0 b# w) a8 x0 b; z& y7 \.align函数
3 _; V7 Z) y# j. e* @2 D9 S格式:.align num
/ f+ E/ q3 z' H- m  a说明:写零字节,num为零字节数量,用16进制表示。
* }( z; E5 M9 D4 f+ k$ H
: |+ d5 j) J" ]2 y.pool函数/ I' B; y1 d; d& S4 z8 b
格式:.pool- `: |, ?6 e# |6 s
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。* K6 K" f+ `( q2 E
例子:7 _) w1 d$ z! m) {6 S  S
ldr r0,=0x12345678;3 P9 F& a( W# C4 K- e
....
( j! `7 G: P' Z& o.pool6 u6 H4 \0 w7 P( \0 |" y- W6 ?

3 O$ y: m. D/ h5 P4 t.fill函数
& e7 D3 U# T3 _- ?% E+ z4 A( P格式:9 L) F  T' i2 q# {' s& g( n# f0 a
.fill length[,value]
+ x% Y9 G1 S; S0 P+ L; Udefs length[,value]
$ ~5 T) V; [5 k6 C! P说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。2 l. e+ b1 g! A$ i" H

' L0 S6 ^' u$ S; k.skip函数:  l. l2 p1 {' r1 q& [$ T
格式:.skip length
! m) a4 Q. e, b2 m3 `说明:跳过指定长度单字节数值,length用16进制表示。4 L2 I, f; g( D# u; A
" k3 N+ v2 d2 q0 S
写单字节:! f0 D5 b4 v9 X3 b% D5 \7 y' n  ~
.byte value[,...]
- K/ S2 w! o. R- ^8 f! d5 W9 Q.db value[,...]& [0 c# x% ?; `& E
.ascii value[,...]
/ ~( n3 z. y7 e; M.asciiz value[,...]
& a$ Y$ s( X4 h4 j" Y1 I9 Qdcb value[,...]: n  l0 o! _3 F6 R6 `. W

) j. r. J3 K8 Q/ [: r9 I写双字节:
: Y  d( ~/ o, a' d+ _% r.halfword value[,...]
% A& Z& v+ b4 p7 [; @.dh value[,...]
% W. I9 O8 @: Q# G* r7 j# K+ Rdcw value[,...]9 R8 @0 H+ |. Z% |5 r# D; g
6 j1 l/ q  m1 [2 N) V  C6 K3 }
写四字节:
2 q3 @' d, e5 A9 o.word value[,...]2 \7 l( P8 J  e: \
.dw value[,...]
. k5 s6 g8 k# cdcd value[,...]
5 e8 }! P! s  ?: E0 S( ~' Q0 |
% m; f2 V6 m7 R& y" {写doublewords:# v2 j& S- E8 e, V8 O8 S
.doubleword value[,...]
' R: L' }. `' b5 k3 I) k' f.dd value[,...]
2 A# U; u/ k$ R* I% \$ |dcq value[,...]3 r( |  U2 s$ L( a
1 Z$ ]' D- N+ _7 t
写浮点数:$ r, R; S& o4 T* {3 v2 b* _; g: ?
.float value[,...]
* A3 k1 x5 V. M5 }0 x  D1 A( b.double value[,...]
2 g8 y: P: T4 q' d5 \9 L! A0 ^; M) r9 ?; [$ {' g/ v
ARM的ARM模式和THUMB模式定义:, ~& T- B% D! o/ C" Y/ F& C
.arm|ARM模式
: `* c1 T0 h7 Z.thumb|thumb模式
5 c- h, f# C4 b/ k5 u. k( I* k4 j; k3 W/ Y
设置架构:
( R2 R9 m. m. G  _5 {& }.psx|PlayStation 1(MIPS R3000)
4 @3 [2 Q9 y3 D.ps2|PlayStation 2(EmotionEngine)
) e4 B, [. ~: I8 n9 M6 |.psp|PlayStation Portable(Allegrex)  v9 ~) n" e8 G. D: \" S
.n64|Nintendo 64(MIPS R4000). i0 j! U1 a' j2 ]+ y
.rsp|Nintendo 64(RSP)
5 j, r; z/ C# L3 u0 q, d8 b.gba|GameBoy Advance(ARM7,默认是thumb模式)
( R& A$ c6 O9 {- o/ D0 W.nds|Nintendo DS(ARM9,默认是ARM模式)# ?8 l' {% P! u7 @( j
.3ds|Nintendo 3DS(ARM11,默认是ARM模式). h& r: O& t& C
.arm.big|
, \' p5 x/ S5 d. a! H( q.arm.little|# X& p! m- _9 U1 P9 O3 t

; F( X1 s0 a- {' U. o8 @常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。$ s- T% w/ [% r: `7 t* ~. }# v
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-13 07:35 , Processed in 1.161133 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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