EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1865 天

[LV.Master]伴坛终老

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

5 y6 U; ]5 s" c2 O4 ]% ]% b" I! iARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000. G4 X' A9 o7 K9 }& I8 k5 _

) K$ H! h" `+ T( qARMIPS assembler作者是Kingcom,目前发展到0.9版本
" g! j: R6 A) _! z( ~% d9 V2 Y- b. }7 @
Kingcom's website:http://aerie.wingdreams.net
2 X+ D3 z7 N$ x0 Q( {; Q4 V7 v7 u5 Z( H; s" S/ L
ARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
- M( u. e+ j4 e- R' ?
7 M8 t) p6 M" c- k: [更新版本可去http://buildbot.orphis.net/armips获得6 Z2 e4 d& k& [* ]

: x" h) W+ ?# m! Q9 X* [ARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。' N( h. j) P# G5 _8 i) E
0 m, o- ^6 c- F' K4 ]5 y
ARMIPS命令行用法:
6 U, B$ ]$ r( X8 c. m8 @  l
7 n5 R0 j* \* I% ~( |5 W1 {% JUsage: armips [optional parameters] <FILE>
9 |! X; ]4 J( ?5 u( |  u0 K  a* B& C8 Z! h7 a% N4 w. ^
Optional parameters:
) I! E7 ?$ \" W -temp <TEMP>         Output temporary assembly data to <TEMP> file
% F: N- N8 K) A -sym  <SYM>          Output symbol data in the sym format to <SYM> file
7 a! |5 `. P" \. n+ j -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
3 j& |8 Z/ X8 C# t( ~0 K4 z' p3 ] -root <ROOT>         Use <ROOT> as working directory during execution
( q$ \2 S4 N. |7 G* W -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
: w" Q& d4 L0 a% W4 z% u -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
: N- q; s' W+ k" G+ v- n! `) S: ` -erroronwarning      Treat all warnings like errors) V  F* n! U" |" e; x! i
, H, N0 l7 {# D. P
File arguments:0 o3 A7 C, l3 l6 z
<FILE>               Main assembly code file' q) r' g; m) J$ S" ?3 C  o

% e  p+ j0 Q0 q9 G-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件4 X+ ?8 \( d+ g$ {$ j
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba
: `) \5 `" k$ j: O+ [% g-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp( f4 t: Y. k& J5 m' h
-root <ROOT>参数是指定执行期间要使用的工作目录
- N7 R  n' v- B6 {9 m( O-equ <NAME> <VAL>参数用法不明
. X* O( `: t# K-strequ <NAME> <VAL>参数用法不明
" r: a& M" _- w' {- z0 F-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
0 Q4 ^: u' Q) P0 o- |
2 v* V& l! a( k2 T<FILE>是汇编代码文件,可用记事本之类编辑) P+ |/ s4 U! R) }% `2 c

, x" k4 v( W, ?( r! s, o: w* H注释说明:
% a% E. q# _& M2 e% @  z注释可在单行指令后面“;”和“//”添加& G) [7 U  J2 i7 l
“/* */”式也接受9 g" X/ S9 g  B0 l6 V% b

' M+ s, |0 X, B, q$ f例子:
' O9 a' n9 D( a.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000( L  Z( `1 V9 G1 {/ q7 Z

  g1 o& w* s9 q.close;/*关闭文件*/
9 C5 O% P1 Z# g1 N
  c& b( J5 _- L5 K: T  z标签说明:
5 }% }4 Z- z. v- t. A% J/ S标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
; k1 v, C$ N0 ]' q
4 Q; x1 m3 {. b# v# G9 C数值说明:' r) I8 ^9 R2 g7 u! J/ \8 T* n
“0xA”和“0Ah”是16进制数值
; {6 G) X2 y# V: s% D6 \“0o12”和“12o”是8进制数值
- Q& ]% c' C4 p  l3 l5 y“1010b”和“0b1010”是2进制数值' ]0 ~5 @5 G' H
# B$ ^# ^3 o6 g/ {# z  e
equ说明:4 d2 S* c/ v; |' _( Z8 c! p+ K
格式:text equ value& O( K/ j4 Y! N: l
说明:用一个text代替value8 N2 |( s4 c  E
例子:
3 O# p; H* D' n& n; D: \& o! V/ uaddress1 equ 0x12345678
- e( h# Z! G" h& @  O0 Fldr r0,=address1  J' N; X. v3 T% ^/ ~' {/ H
.pool
  Y  k2 I% G7 ?
2 h* B8 k1 `/ W6 I# X, [2 z函数说明:$ `# D" o, ~+ {( t

5 N  C% e/ e2 \  J6 G( D0 K' F: L.open函数:
' i' j/ }! [6 v格式:
3 }+ E% h4 k6 @, I1 b.open "ROM FileName",offset& `- I$ R/ l. ~7 ^4 h5 [! Z
.open "Old FileName","New FileName",offset
2 g+ f2 }9 |3 t& @: w1 ^说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
/ D/ l4 m% q9 g, w1 Y! W
( {% W; A$ p6 Z( u6 w$ j  F例子:
. k1 j3 u5 {9 F# [" I1 S.open "1234.gba",0x08000000/ f% J1 I! l0 G+ F; d  {, J
8 c; a. d( x2 X. p
.close函数和.closefile函数:5 m3 t/ V) T6 _( Z2 d
格式:
8 k, O7 x! Y; R% t6 n4 g* W.close2 Z3 V7 j* j/ u
.closefile
5 R/ w& z& K+ F( P8 {1 W0 y) C3 t说明:关闭文件。; Y1 U9 x7 m( a5 A/ b
6 I6 P! ]$ K" f4 N
.org函数和.orga函数:
; k: }2 K; e( x: d, `格式:
& u( p& `  [3 x- b7 }7 Q2 R.org RamAddress) n2 Y3 o+ E# w# m
.orga FileAddress
# T9 m7 m2 b' O; }说明:. E! v* Z7 F' f/ J5 ~5 ]$ d' m
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
: g! b+ N6 }  {, P( `# {% P+ o! `% b: S9 M7 \  \. Y  N" ^
.orga函数可指定ROM文件的输出地址。* C& @" T( f- ?
7 b& V7 c7 e# v+ D# v. M1 c
.create函数和.createfile函数+ a6 `7 `2 A  h' z1 M4 k1 \# y: l* Q
格式:, T2 @, c& }% ]$ V
.create "FileName",offset( \2 U, D# A& \6 k4 Q& F
.createfile "FileName",offset1 C+ a: ?5 O: O; ~8 o( {
说明:创建一个文件,如果文件是存在,他会覆盖掉。( e: t# h! k, K$ E/ y
5 d- b; _4 [. O$ Z* G& ~
.area函数
( U# P- G& x! A格式:! r. }6 s* V( E# E+ ^. @; G# |) z3 v
.area SizeEquation[,fill]
" U" ~2 i9 ]* d; k4 n+ A' E, L) L.endarea) j# m1 T- @3 x0 q- c; F4 a
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败% f: l2 D2 K7 v8 z& ]. i2 H

( h' D6 [5 a, k4 N% R# ^- }4 q例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据3 _  \9 Y+ |* t# ?  @, y
org 0x100' |3 J" M5 X& L  s2 }- k5 U
.area 0x8; ?! b4 k; u- f, c
byte 0x5,0x6,0x7,0x8) k1 W( d) B! B9 Z$ @  C
.endarea
* u8 d0 W2 l3 `1 c2 b9 `  m" P1 k( N' s, ~/ v" l# ~% w
.align函数. p4 L# j1 u* A2 ~; P, s2 Y" r6 E
格式:.align num
" ^" W' H. F1 ~+ D8 p2 C说明:写零字节,num为零字节数量,用16进制表示。& @( F! z  m+ h7 Z2 Y

! h+ Z0 l' ^" n9 G  I( P.pool函数6 C. f; q) |6 x* I3 h: |
格式:.pool3 v& {9 }. ]9 S" {! B9 \
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
' U4 V+ ^( S3 ]5 P, ?: |* G例子:
( h/ q8 A4 z* g5 Q3 sldr r0,=0x12345678;
3 x  `8 i0 }: |& }....# {0 A1 O5 _  f8 U3 i
.pool3 k+ Y1 W& I+ ?3 _- Y8 ?' Y
5 E! ~. E0 K4 q* o$ f5 p
.fill函数+ h; `7 F$ V% t/ Z
格式:
+ g5 [. ^  h: i; s* A6 {6 @  b.fill length[,value]3 W. D( r. x! Z+ D! N$ K6 S4 S
defs length[,value]
% T1 C9 r+ l" u- d( Y说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。% e2 z% V3 o+ H' }' z
9 Q& X8 C$ y9 P2 Y- d- Z; G! O
.skip函数:) c, n8 ^: O1 M( v8 ]
格式:.skip length! c0 i& @0 @. f) @6 m
说明:跳过指定长度单字节数值,length用16进制表示。. E* e# _" ^& R" g

! k. Z7 j3 K) O  J3 p, E/ f4 B写单字节:$ R: l3 Q* y; O. v( z
.byte value[,...]
( G/ i! o( X* S2 N0 `+ K5 q.db value[,...]
% q* x" |$ e' ?4 U3 U: R.ascii value[,...]
8 S2 o0 g7 K7 t7 d1 {.asciiz value[,...]
* S  s6 v2 A1 y& idcb value[,...]
* f1 h! Q& J5 J8 ^0 n, \) r1 i; O  C3 m* G, U
写双字节:/ ~  ^8 W% R. P( ]' _3 K3 ?
.halfword value[,...]
  h, R0 `8 j% w3 x8 o.dh value[,...]1 ~: ?( G) y. j- u3 w
dcw value[,...]9 n: ~  {; q& S: a: a

0 q& ~3 e+ i( |4 D0 p5 Q& k写四字节:3 |9 T4 B+ V1 M3 ]8 K  l$ I
.word value[,...]( L1 D4 k# u3 p. T- j! r
.dw value[,...]5 O- [2 {. Z, F3 V
dcd value[,...]# n, c" w$ r$ |; _2 y9 Q' T
; w' H& ]: B+ u, X$ {" S  S
写doublewords:
) t$ U. M( o' P0 g# F% m5 `$ g8 q* k. y.doubleword value[,...]- @( L8 t$ y* K! S, _
.dd value[,...]4 W5 r! f* B) I0 l$ ~7 D
dcq value[,...]
# x% \1 O6 v) }1 w
! L) U! }3 z5 i! X8 \0 N: I写浮点数:
# C1 s1 j: E8 Z) c; F4 u.float value[,...]
( j3 n+ S( \3 z5 Z4 |9 v2 q.double value[,...]
( t2 z/ ?; P& K, X0 e) p, h. v" T& ^8 H9 A
ARM的ARM模式和THUMB模式定义:: ^5 N: @; D4 E9 }! l" O) }
.arm|ARM模式9 }9 p+ H" k& ?! o
.thumb|thumb模式, A* {$ ~, Z& i
' A: H- O7 v* ]. F' v2 R4 c5 t
设置架构:
8 \! o2 r5 S6 x( |- U& a8 O.psx|PlayStation 1(MIPS R3000)
1 c8 H! G  R" Q0 W0 E% k. w# n.ps2|PlayStation 2(EmotionEngine), E5 T2 \: F  b4 M
.psp|PlayStation Portable(Allegrex); ~2 }8 p4 p7 i8 f$ d9 `2 i9 u
.n64|Nintendo 64(MIPS R4000)
' p2 A# G+ T8 ^; z) B* `+ {( v4 \.rsp|Nintendo 64(RSP). g- K% [7 S! x# u8 z9 }
.gba|GameBoy Advance(ARM7,默认是thumb模式)5 C' H- K" c' m( `
.nds|Nintendo DS(ARM9,默认是ARM模式)' L# Y$ `4 C( G3 S% [: w7 Z, Z0 |1 W
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)0 R/ Q0 Q# j/ @7 x' E5 H! u% D
.arm.big|
, ~- ~/ e# Y* }+ n! k. h( ^+ A.arm.little|
! |2 v$ D$ Q; q. E! i  ]) E6 G) t- I$ [
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。2 u1 j* m, k" m
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-2-19 05:58 , Processed in 1.080078 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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