EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1867 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
( L* z  g4 b% ?. [
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R40006 i: o2 y$ k, u% |* `$ H

2 d; g3 j7 k0 Y/ g8 h" EARMIPS assembler作者是Kingcom,目前发展到0.9版本
, z2 ]! L  g0 X) [0 x& V7 i! t% a
! c  N  w6 ]/ Y5 y; ?Kingcom's website:http://aerie.wingdreams.net
( ^) V1 s" \% K9 a4 c' T$ V. X
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得& X7 |3 B  K9 A1 E! q2 ^9 k# U$ p7 p

7 t' t4 N5 r1 A8 `( e  t更新版本可去http://buildbot.orphis.net/armips获得; T' k' h$ {% Q9 U7 U

8 a; v$ _) Y; \( I- R5 Y+ SARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
& s- Z1 Z* Y& r2 @  F1 D  G9 s% e& Y
ARMIPS命令行用法:- T' c, l4 o- [3 e+ x9 X% G( Q
" T+ p" k9 A9 `) t
Usage: armips [optional parameters] <FILE>2 n9 a& i( G+ J2 v. x7 D9 r. H% ?
! |( ?. a# r% a  }( X
Optional parameters:
/ Z2 M( n" D/ v4 z9 P& R -temp <TEMP>         Output temporary assembly data to <TEMP> file
# \  Z0 d4 v: w' v; O, ]* r -sym  <SYM>          Output symbol data in the sym format to <SYM> file
9 S+ O: b- h) d" v# W# U! B -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file( L( R$ Y$ y. s, E4 T5 ^1 L8 g0 {; d
-root <ROOT>         Use <ROOT> as working directory during execution& k& {- n$ z, r3 t, U4 E! {9 i  i
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
7 _# K+ ]7 r* s, T+ a5 v -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
5 r. N0 K1 O0 ^9 v# K) j -erroronwarning      Treat all warnings like errors' h% R; w9 y% B6 |) f9 G/ y

( R9 V! A2 b. W9 ?3 `  Q; kFile arguments:
3 V" ~+ a/ g9 V% w# J <FILE>               Main assembly code file9 {- [: A$ p6 V9 B) r7 E

0 ]$ l" d, ]* [' P- Y-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件  _. ?  E" s" o/ F
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba+ k& q: C5 T/ D3 F: h. b8 ^
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp
* g' `8 w  p4 M! G1 j3 [-root <ROOT>参数是指定执行期间要使用的工作目录
. N/ A  n- T) J-equ <NAME> <VAL>参数用法不明- W6 ?; m5 t  |, {. J  x
-strequ <NAME> <VAL>参数用法不明
9 h8 [- W; X$ J-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译: F% k8 q" h: M; _7 y9 c

- d6 p; R6 T% v, _, B) b<FILE>是汇编代码文件,可用记事本之类编辑( b- Q" u8 e2 \) O  {/ G5 O

7 L% v/ i; t. F7 o$ j+ f注释说明:& N6 U6 n5 J5 T; e8 E
注释可在单行指令后面“;”和“//”添加
# q1 F3 K, c& N; _- f. q“/* */”式也接受
: d+ z1 @7 K& F1 F9 e2 X
3 X. }) [, E& S+ M例子:
0 d0 S9 Q8 G4 L, Z1 F.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000( p4 t$ G! m% Q; v5 b- X

0 c7 d, F/ B0 U! n.close;/*关闭文件*/
) {1 X$ x3 w4 I+ K# C+ G5 x" O- |6 [
标签说明:3 u: f# i0 }9 O
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。, m! q3 u: N3 k/ F0 H4 R
# M. J; s6 Y+ \2 M  `( X
数值说明:
- I' R7 B2 A4 ]+ p“0xA”和“0Ah”是16进制数值% M4 c; }6 A7 i% s
“0o12”和“12o”是8进制数值
3 V$ U" a1 |8 v. S  D0 O% A“1010b”和“0b1010”是2进制数值6 }/ C7 k6 o- ~( F# @. K$ g
5 {( L* Q8 }+ K$ e
equ说明:
8 R( B: s9 I% X/ g1 @$ d) n  r# Z格式:text equ value# y! Y8 u5 ]8 w/ ?2 D: ^& ~5 z
说明:用一个text代替value
: G$ A. a2 E7 K' e8 j+ M6 J例子:
/ A( U  D. w" }, O- `. caddress1 equ 0x12345678
- p/ ]5 R8 p& K5 L4 pldr r0,=address1
# G8 [) r" S8 d5 j: k  C1 z.pool
  t( S+ u1 v1 `+ A$ o" D, z
, P1 n% Y7 v4 K5 j函数说明:
3 p+ K3 c' N, z! ?5 M% `6 w! R
* L8 H9 b* H0 J.open函数:
: I9 @) t1 j1 |5 O' X" X格式:
6 z- |* u2 o! P) b! A.open "ROM FileName",offset
' T6 }- Z+ B- X5 y7 G7 a.open "Old FileName","New FileName",offset
8 N4 Y1 n% M4 W' ]4 D0 V说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。& P9 n5 D/ v1 x( |
3 l+ [( H! f6 ]) o: z* m
例子:
  R- n7 l+ @" F! y7 H9 ].open "1234.gba",0x08000000, h3 C) [  J' l" w
+ r( U; F3 f! F6 C, A. e
.close函数和.closefile函数:9 B: v! z. B& `2 j& T% q; M
格式:  S+ d: n2 P* B+ T7 n1 E! r& F
.close
6 c* J# `3 T) G- `( W- t.closefile& o6 u+ V$ G6 N
说明:关闭文件。7 Y% R+ y+ t0 }& x' _! G
  }9 |5 \2 t' D& y; ?) [2 P$ h- j
.org函数和.orga函数:
& i  B, a( ]. E' j  G/ ?4 H格式:
0 q% Y( c4 D: N.org RamAddress
" `8 e2 u/ H8 P& M.orga FileAddress' R$ Q" C, i# L* z. Z
说明:
9 r7 m0 _% n- \前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。- L, H, Z& n2 @& c, V6 i

5 l' R) `4 e" @9 O.orga函数可指定ROM文件的输出地址。  q0 w: [3 \( f5 N8 @
, U! |' ?7 K$ {+ Y& U7 G
.create函数和.createfile函数
# m2 [- @5 \! Q+ `" \3 X* x格式:8 T8 H0 p; {8 p" h3 A( D
.create "FileName",offset
2 R, T$ l2 [5 K$ O- T+ U.createfile "FileName",offset
9 i! u1 n. K" `6 N0 b! M说明:创建一个文件,如果文件是存在,他会覆盖掉。8 a% b4 h$ z% s2 _: G) b. |: u

- B9 \- [' l+ ~5 l. e2 j% }" U.area函数
- ~! B/ h( t2 h3 m格式:7 r3 I9 F7 j" Y; J, E3 X
.area SizeEquation[,fill]. q. b  i' j- \+ _" C, U- o" B
.endarea" w3 o* r( r0 U& J: `3 ]! J% z; \
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
$ T/ h! W( \* {. g" j+ g: ~
  ]; ?. S* E, v. V' T5 C; [7 g例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据' ?3 `. `0 O' ?4 z& z: b
org 0x100
4 u+ B6 z+ r8 q% w.area 0x8( [, Y' R: [% p, H' o1 K
byte 0x5,0x6,0x7,0x8
8 H8 ?! \. I) h# v$ h6 F.endarea
8 ], l9 C2 L  e5 o; a' P% m: n+ P0 w$ F, e5 |+ t2 q2 r
.align函数) [. v+ {/ \& @! y# O  u$ S
格式:.align num
7 v+ T  Z6 j* P, ~% s# h8 p说明:写零字节,num为零字节数量,用16进制表示。, z% E7 |7 w: P# K

. N1 l" {# v0 N2 w% l.pool函数% \: h$ N+ f1 f; b5 W
格式:.pool
; {' M0 A4 k& K# b; Q说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
. Q5 i8 A" _2 R" f; ?例子:* _, ~- v4 l# A9 b/ B/ A% z% Z
ldr r0,=0x12345678;
+ i: l8 {, l2 W8 W5 W# x. M....8 I4 N" G& g4 O1 @% h. O! l
.pool
0 A0 X4 W) k% Q$ @! u) X+ B" q
( d; [- o3 o$ k* X3 I.fill函数
8 |- c) w8 r# S- x格式:& c- b% v  w4 m; l: W/ {
.fill length[,value]' A# g' l7 W' \  m# [
defs length[,value]
6 Z8 x  I# S. J. ~2 j说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。; W& Z0 v9 Q, @+ z4 a0 g  y

) H$ c9 j! I6 q/ |0 l. ~6 j.skip函数:7 F# {" O* H4 a7 G+ h9 {3 @% M
格式:.skip length) w% U; y8 _# ~9 {. |1 o6 \
说明:跳过指定长度单字节数值,length用16进制表示。
: H5 ^0 r7 E6 K% d5 r# |- @* d- u, V( H2 W- U2 R( i: M
写单字节:
- i; J  Y; E3 Q" T% U; r; p.byte value[,...]
! V7 J0 ]6 ~' X7 y& _- ~.db value[,...]
0 u/ O7 s- x0 O- b' m.ascii value[,...]
! N7 l! W3 {* p3 W.asciiz value[,...]
8 e; M) K  a. `) I$ w% |' T3 Mdcb value[,...]0 _2 c% N6 p: E# Z4 S4 I
7 \/ ^: ~# j- @2 D6 K: g3 f
写双字节:6 j' o  m: w& d4 s" O& F0 `
.halfword value[,...]
% I7 U% m; V& \7 H.dh value[,...]
4 K! A& g, ?, O8 z6 ^* I# vdcw value[,...]3 V0 p7 @( v2 ]2 J7 M+ ^

( B  s. z) E  m  r) j  `写四字节:
3 @- _" m% j9 e$ _2 E.word value[,...]& q! {! s. K* p& i) T0 K% H
.dw value[,...]
8 K5 w  W" J% w: Z, J) w# [dcd value[,...]
4 s+ T9 R, x% I6 D! K  G! P. A/ ~
& u& y* `" H+ t4 ~! }+ `写doublewords:
, L/ W1 e3 }1 t; W.doubleword value[,...]1 E+ x* \/ }+ G
.dd value[,...]" ?& ^8 ^3 K( X* x- |1 ~
dcq value[,...]9 x2 b2 m3 S; r* c1 p# @
4 q4 V9 A: L+ ?6 A9 |
写浮点数:) R+ I) G2 a7 b
.float value[,...]  }/ j3 \0 v* R  n3 s+ T
.double value[,...]
6 J+ Z5 H3 R1 F. i: m+ s* N: Z0 }
ARM的ARM模式和THUMB模式定义:
2 ?" h# N, v9 l! d; |7 k9 W" X.arm|ARM模式
' u: r4 o  B, u6 Q+ |/ |. }4 x.thumb|thumb模式
; i1 Q6 ?& T$ j$ x% E4 }: j( y) H; X  n" H
设置架构:
6 f& r- f2 |  H1 U7 T8 |8 q' Q.psx|PlayStation 1(MIPS R3000)
7 \5 u, H, B$ S  D1 D! u( }.ps2|PlayStation 2(EmotionEngine)( o& d& L3 X; n+ J* B# a( V& Y
.psp|PlayStation Portable(Allegrex)7 w0 l; P% T0 U% ~7 t  Y
.n64|Nintendo 64(MIPS R4000)
* X( R& `* T2 ?5 A; H2 j9 ?.rsp|Nintendo 64(RSP)- D, z0 n6 ^. ?
.gba|GameBoy Advance(ARM7,默认是thumb模式)! Q7 f4 \) E" w- k% o
.nds|Nintendo DS(ARM9,默认是ARM模式)  Z- v6 h4 a# a( B- k9 C
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)  [+ A: i+ q; R4 A" j# R. v7 |9 L: G
.arm.big|
, E5 m9 j- Q2 r# U+ @7 `/ O# \.arm.little|
4 J% ?' p  C* t! e. n! F, s4 n5 z; _1 W" G/ K; c9 w- j
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
8 g# R3 b# [- s) Q$ p
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-21 02:59 , Processed in 1.090820 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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