EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1865 天

[LV.Master]伴坛终老

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

% P6 ?* F; j5 R: xARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
8 h$ B+ w7 @& M4 l
% c: u( h# U% x& [* t% _ARMIPS assembler作者是Kingcom,目前发展到0.9版本
+ f. b/ R, q0 N6 A
" X6 W* Y) }* D& G: N( V; z* I% GKingcom's website:http://aerie.wingdreams.net
; `2 _9 t( c/ n/ Q& b. T
& l% d/ }" ~4 x, OARMIPS assembler源代码可去https://github.com/Kingcom/armips获得' O0 J; F3 {+ O4 t' H

! L9 `2 M6 e' s/ G& W更新版本可去http://buildbot.orphis.net/armips获得0 ^0 c8 X* n  M* M
; m0 H0 u" @, ~2 v
ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
- q$ G6 m) T$ t4 z5 {5 p& L/ g6 @0 a  b  O/ Q
ARMIPS命令行用法:: W9 \: E# \% J. y9 {* F

1 f* ?7 q; d# _1 n+ s# J; }+ H5 jUsage: armips [optional parameters] <FILE>$ |# p. E! N0 \8 K

% m) n( s% x2 \( ^Optional parameters:  W' c* i- D$ ^3 W5 C9 T/ p
-temp <TEMP>         Output temporary assembly data to <TEMP> file; b& Q! C0 E0 P0 G- @) Z: X7 n
-sym  <SYM>          Output symbol data in the sym format to <SYM> file
# @4 S4 _2 f9 z0 V -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
" u# L( A, i# N5 N -root <ROOT>         Use <ROOT> as working directory during execution* M  Y. a2 H5 g/ ^9 d
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code' Y7 |0 o6 `) F4 A! `( Y
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code" L. t$ W& H( Y; ]* t" c- y- h
-erroronwarning      Treat all warnings like errors
. ^$ N5 G! T" Z2 `
) x7 d. {3 B  Z' e! K% VFile arguments:
7 i2 ]% y  W" ^ <FILE>               Main assembly code file0 X. O. `( z0 @: s1 I
# C7 j0 P; S$ m7 p8 S$ b5 v% p
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
  z) w: `* j. H, N; ~) m-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
. A& G" M; R( I  D* c# r$ t-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp! b: x* O" O* _
-root <ROOT>参数是指定执行期间要使用的工作目录
4 f. ]' s) k- x4 V3 e8 @; {-equ <NAME> <VAL>参数用法不明8 a( c4 _) l5 p7 [, D- c$ I4 q; N( n
-strequ <NAME> <VAL>参数用法不明: c1 U) q( Z/ O
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译( y" V  @7 H: p+ z$ H4 i& U

2 g& d" w5 T1 z2 [9 x. O<FILE>是汇编代码文件,可用记事本之类编辑3 G1 C6 r$ a; C; S# O( m% Z

( K3 [7 a8 W5 K+ `4 }注释说明:- G$ [6 T9 b9 S( x: Q
注释可在单行指令后面“;”和“//”添加4 _; R1 q* w* t, d
“/* */”式也接受
- C7 }, H8 ~$ W0 S8 x2 O" _, p# r9 Y0 _! E7 y# w3 Q$ O: ]1 S& j
例子:
, @( d; r1 D5 t.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000, b0 w+ P- S5 m
# ~4 q# v( q# |7 C  n9 s* O/ Q
.close;/*关闭文件*/
* i; B2 f5 g& K5 u9 [1 P
. m4 R" ?( z( O9 Z  N: h( V标签说明:/ b( c2 m5 F  g  J0 Q9 Q3 K
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。) n3 g2 ^% \5 C* Y/ U. L1 {) k
7 b! U4 n& e1 s; k" J% _1 X5 D# d
数值说明:" m7 q1 O8 \/ o, Y5 s0 Q0 o
“0xA”和“0Ah”是16进制数值0 L6 t0 J4 Z& [: l, F( s5 v* S; A
“0o12”和“12o”是8进制数值; q# m" O& g2 ^. q4 O! g
“1010b”和“0b1010”是2进制数值. y( j% M. r) D+ |
; d5 {# M1 U- R' R! C' W  |
equ说明:
6 M: M& X# N4 O3 O0 \  B格式:text equ value
4 J( {  L6 z) X, b/ K4 v说明:用一个text代替value& {$ K0 V: D2 \& _
例子:& v* ~6 u8 `6 n
address1 equ 0x123456781 e# h5 H9 r0 ^* ~
ldr r0,=address1) u' a+ @# [; ~+ [: p- s- J
.pool' h* m$ c$ V: g8 o

4 ?; {) s/ j- [$ K; L: K6 }& F函数说明:# Z" H$ V" `' B6 \) y1 x  }9 N
8 j; }( U% K8 h
.open函数:' ]# o; B! R+ A2 F7 m. D
格式:
0 o" A' `( a- u  Q.open "ROM FileName",offset
( ~# g3 S: o, N.open "Old FileName","New FileName",offset
! ^" H" D- R1 V- T说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。. T0 M* z6 y+ \8 d0 W3 b
4 P# i3 v. K- D6 b9 ~) q% ?/ M
例子:
% n+ X/ F+ m" E2 H7 j3 a.open "1234.gba",0x08000000
% W8 F2 s/ q" L3 l3 X4 X6 B! z* _
7 T4 _% l8 E( u4 n. I.close函数和.closefile函数:. R9 r1 r) |2 k2 F2 G
格式:
+ ^6 @  q& {5 `' ^' P.close5 K/ i9 `% |4 k7 d4 t) b
.closefile' f+ j4 j$ K* d* p# K7 `! [) D
说明:关闭文件。+ E  O" j: E4 l& K3 N

0 S8 g. M+ F) X* V0 L.org函数和.orga函数:( d7 V9 r0 m" p+ J1 f
格式:
2 B$ r& F4 }' x2 y' g.org RamAddress
9 s% S+ @7 y3 [% E, R.orga FileAddress! o& t3 r) `, S# w- u
说明:
8 J% c# _+ m% u8 k6 l4 a前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。/ o( G! q9 m# G
" O9 o  C1 h- y
.orga函数可指定ROM文件的输出地址。
# `7 ]5 s+ h( Z( {+ b$ o* y1 S$ Y8 V, W" L: u
.create函数和.createfile函数0 Q, S; E/ A4 N& ?# \
格式:
% [! m! Y% m3 |1 z( J- W.create "FileName",offset
& Q; ^$ D( h! j% q: u* p.createfile "FileName",offset+ I/ F" P" q! V' W6 ~  O
说明:创建一个文件,如果文件是存在,他会覆盖掉。; w. c7 i( a. s# `, D3 G7 k
$ g" e/ O# V6 k& [2 M
.area函数" i5 j6 p/ c" t9 {3 l. p# q5 ?- z/ k
格式:
' g) ~4 [$ k8 f% N& T& K.area SizeEquation[,fill]6 }2 H" _% f: z: L8 l; X9 u
.endarea& X% e* J1 I3 d# f5 @
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败; x' Q/ M; @! [; S! s3 R

8 F8 X1 f2 M* m例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据$ F$ f/ v3 I0 p# A* `5 A; e* H) F
org 0x1009 V& t2 J  N6 y% U7 J( X
.area 0x8
* m9 R4 ~1 o1 L6 P  t, e/ @, Nbyte 0x5,0x6,0x7,0x80 |# V; f  s$ P/ f
.endarea* K/ ^, i! d. r7 N( R
! T$ @& Q2 {/ D+ L
.align函数0 {& H5 M+ C# M
格式:.align num
. u7 p  r  _6 o0 o* a/ P. C说明:写零字节,num为零字节数量,用16进制表示。7 K& P, d* r# Y6 ^5 X( e
8 b5 j+ N/ B: `* t* M' L" U( Q0 y
.pool函数0 |1 Y# n" z# O8 C
格式:.pool( k( a' G" D6 }' m* H  a4 l
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。2 f7 l, {: l7 G: I
例子:& T# s. N6 T+ C0 P# W& U
ldr r0,=0x12345678;
  q6 L; R2 n1 }- Q....  O9 H1 Q! K& G2 ~! E4 p: ~" R
.pool
* L6 k6 ^0 z6 F5 J0 |* j1 }9 L- C7 |6 G3 E: K
.fill函数2 X* `' M9 E5 }' X5 c
格式:! ?6 E( E6 Z. V
.fill length[,value]
' X# u, D3 W" @defs length[,value]' y; u$ u) {: M
说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。$ w0 ~4 j% b. C) O% ^

- e* N! V, l) Z; c& N9 \.skip函数:
3 R9 n9 S3 J7 f' ]格式:.skip length
2 P: s! l; q$ h0 |说明:跳过指定长度单字节数值,length用16进制表示。
0 y: R( e# o, q$ S& H) U' M+ U5 y: z9 B* S
写单字节:
- ]% r, |2 U% c* P: U! ].byte value[,...]$ c' V! a  r6 K7 c$ `* j# Z( I. \% K
.db value[,...]* z! ^: Y/ T, Q0 f
.ascii value[,...]. a' v9 l7 b! l/ H& \; w
.asciiz value[,...]. v4 V/ Q  @) A+ ?" Z+ T
dcb value[,...]
! u9 `5 q' g8 ]8 T) D! e
3 \& G/ f  R& P3 u; f写双字节:
' s7 c% u( R% |2 j; P.halfword value[,...]
! w% _, o8 M( T6 R* }$ h) R; i5 C( f* I.dh value[,...]
: a* l1 Y0 |6 P$ c3 ~: Sdcw value[,...]
8 u7 _$ q+ M+ {9 }9 u5 S/ v4 |. X+ \* y4 S- b. R
写四字节:
+ c1 G- ~, _; ~, ~5 Z.word value[,...]
) Y9 |6 |  o+ _.dw value[,...]1 @9 k) e. g4 U$ q
dcd value[,...]6 r3 X$ [* |4 d4 o  B* @6 Z- g
) q2 L/ G# z; y& \5 m: z# g0 g
写doublewords:
: H0 y7 e& p& k1 n8 a, H.doubleword value[,...]  `1 e5 W8 r4 w+ P/ F3 f
.dd value[,...]
- O( d" d7 X7 T8 Q, U8 x: Idcq value[,...]# b; W, W! y* V5 ^

1 x: H: K  n- F) k$ h& Q  i6 w写浮点数:
7 N$ l) t* L: I* n; v/ u.float value[,...]
4 X7 O4 r" p! Z  b* _.double value[,...]( L! Z0 @9 z+ Q& ?: ]- H% m

/ s. \0 q- n7 yARM的ARM模式和THUMB模式定义:  n' q+ x$ c! A- P! b
.arm|ARM模式
& l+ z  x3 Z% ~/ ?8 _- t# C.thumb|thumb模式6 {' Q8 r2 z% g' [& Q  r
0 z9 C7 a7 R$ c6 F6 Y# Z' N* V
设置架构:' @. g2 A4 v0 u" z+ g0 [/ l* |
.psx|PlayStation 1(MIPS R3000)
- K) u6 H; n4 k9 y- `.ps2|PlayStation 2(EmotionEngine)
9 o9 z9 j# m, Z9 Q6 m4 ].psp|PlayStation Portable(Allegrex)
( x. W! R/ A6 m: L7 s& z.n64|Nintendo 64(MIPS R4000)$ @7 S- j1 p9 _: F
.rsp|Nintendo 64(RSP)
0 h" }2 _/ i5 W2 h.gba|GameBoy Advance(ARM7,默认是thumb模式)4 ^; \+ L1 M5 j. L6 i" X, {
.nds|Nintendo DS(ARM9,默认是ARM模式)
# a8 r6 H+ d9 n- M8 m.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
5 Q. |) }- o0 X5 s* I3 W.arm.big|; y( w# J* @& S% n! t
.arm.little|, N4 ?% k( X' t) K, D
  @2 @2 _0 S, n
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
5 Q! C. F, m% g- f7 W
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-19 07:01 , Processed in 1.106446 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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