EMU618社区

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1950 天

[LV.Master]伴坛终老

发表于 2017-8-8 16:17:01 | 显示全部楼层 |阅读模式
. Z5 Y) r* u% f2 Y" H, o$ m, B
ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000& k0 o1 |9 L/ H& H2 i1 `+ M( V
9 a0 n, U9 W7 y, @5 X4 t7 }
ARMIPS assembler作者是Kingcom,目前发展到0.9版本
( Z* U5 d2 ^0 C0 f& K' r/ a: \  U4 [7 n; ~9 H8 l/ o3 j
Kingcom's website:http://aerie.wingdreams.net
# q# s% s3 V; u3 q
7 I3 b! x: z, [$ d. C/ p! yARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
# [5 u& p- m! u, _
2 v& X: h9 _: {' M6 M. ], }更新版本可去http://buildbot.orphis.net/armips获得
$ v) y: w' |7 S
  _+ m( o9 V/ O# w0 b+ ?: p; d6 bARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。
$ @  Z- Y. i5 P3 x0 O0 _! D9 F2 }3 G  d3 s# M8 q7 |! ~3 ?' M
ARMIPS命令行用法:. ]2 R4 f9 _& y6 s) c
9 |. J2 e3 h! O; ~# g# ~% _
Usage: armips [optional parameters] <FILE>
( {, I  `; r0 G; @' T0 L2 S& ~+ G) n
Optional parameters:5 @0 P0 F. m; j. l/ x  x9 f
-temp <TEMP>         Output temporary assembly data to <TEMP> file
/ n$ X" q, W9 U, B! m -sym  <SYM>          Output symbol data in the sym format to <SYM> file
7 w7 H8 h3 r" a( b) E -sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
' b$ a9 t4 Q2 S7 b! F9 d% t/ d5 X -root <ROOT>         Use <ROOT> as working directory during execution
0 u" V, B6 I* |/ p -equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code
' ^$ ?5 c9 f1 W" q0 S! m -strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
, U& v1 q  |6 v  {8 @ -erroronwarning      Treat all warnings like errors  j1 w+ L' e* x. `# u+ p) t

7 B# l# j+ A8 h7 E( DFile arguments:
5 F. A- n6 m8 }3 f# r- k6 p4 k <FILE>               Main assembly code file
4 v" C8 a1 L$ Z6 U* l8 D$ ~, \4 {# a4 }  {7 F9 ~( P" M
-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件
9 S, ?2 K! y8 W. V7 M-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba# Q# }# L* A6 ]2 O! {
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp" J# S% f1 u6 T
-root <ROOT>参数是指定执行期间要使用的工作目录3 Z" o. d. g  w& z. c% j4 X
-equ <NAME> <VAL>参数用法不明! H* V" ^) q  @/ H
-strequ <NAME> <VAL>参数用法不明- y4 T' |6 t. m
-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
4 R3 J6 o( t, ^1 P1 d' C3 s; S* D" S1 L" W/ Z
<FILE>是汇编代码文件,可用记事本之类编辑
4 R9 O  w5 q* |8 O, x, b! }
5 x% Z6 Y) F+ {* o) j- e注释说明:
! R7 Z" |( g/ o7 g( A8 x8 I! h. r注释可在单行指令后面“;”和“//”添加5 h' D6 y  F( `2 f
“/* */”式也接受! H% S  k! H' `
4 h3 p8 m7 O6 c6 }+ A
例子:
7 E: R1 X/ O; U5 r" _$ k, d) ].open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000
. Z) k: O2 P# K1 o0 k; ~- @9 {! Y8 I) u0 G
.close;/*关闭文件*/6 q1 W. o) \% q( h

* O$ B, i( i* p, G- C% h2 q! ~- q标签说明:* ^# R$ I: [0 N. M
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
4 V) M3 p, Y$ o* ]1 }5 {/ D! B# a8 J( L: Q3 Z
数值说明:
8 f4 w3 U, F0 n“0xA”和“0Ah”是16进制数值
7 k3 x; e/ g+ R: D  Z“0o12”和“12o”是8进制数值
8 a; }/ r- c, i) k0 v“1010b”和“0b1010”是2进制数值& @5 L* k7 B# `. e6 u& D

. k* t- g# Y) e3 C* h" q! k" s! G) @; ^equ说明:6 o5 v# J% X6 r9 h1 C4 ]' R
格式:text equ value  N1 x; Y( I. B( h0 X2 K- [8 x1 f
说明:用一个text代替value1 m9 w# P& n  s" I3 k4 B7 f& y  V
例子:
7 E: g1 v. ^7 J' H& u; |: daddress1 equ 0x12345678
( y  R( f- R; ~# h! z. Fldr r0,=address1
+ G6 [) s7 T0 a.pool
$ s; L4 @$ x; S9 l6 g
9 F. ^. `$ u* `, Q3 Q函数说明:0 S+ c) k) J1 j
/ C8 H% V% Q3 `8 z
.open函数:$ h2 d8 z1 R/ y% V
格式:$ u: G8 R: b, K6 @# J( s% z
.open "ROM FileName",offset/ }, u& O! {6 }4 J& A2 c' j( m9 p5 I
.open "Old FileName","New FileName",offset
! }  v. r6 {8 f0 p7 Y+ p说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。3 M/ W0 G( g  f) w3 B, C- C
# D3 x+ U5 Z$ T
例子:
, k9 A  L, U) Y7 E- J* a2 \.open "1234.gba",0x08000000
- S- V& }8 B! A6 _6 o6 c
) X3 P2 a& s& n$ ^.close函数和.closefile函数:
$ K, ~  p8 r# I* B" ]% s4 \格式:
0 _) p  X  N, v) t0 p" O.close
0 _- t. H0 Z  W- S, \. s.closefile4 ~! F9 n# [. I3 q( A! z! f
说明:关闭文件。. p1 m' i" u+ _1 z* A

* J" q' ?5 ]' Z8 i2 P.org函数和.orga函数:7 F; l" W  X+ I; I6 v5 h; q+ b
格式:
& o3 b7 \5 ?: n3 U/ g0 @.org RamAddress, d0 d& t: z# ]# V; l- [
.orga FileAddress
3 U$ s4 M& z8 j说明:
$ {+ t' x  u* |( R6 m# N; q6 |前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
  t4 w; P+ [6 Z
+ h2 l# N. V" M5 W.orga函数可指定ROM文件的输出地址。
3 x. Z5 ~7 x$ z; m' k' j/ V, |
6 ?1 f/ m* b0 T; T4 X; L1 d# g.create函数和.createfile函数
4 \# P6 V6 C3 c0 W3 l6 G格式:8 B! A4 [3 |1 C: w6 H& E! o
.create "FileName",offset
" x0 v/ }) c: O! V0 b.createfile "FileName",offset8 x( H) p  ?' x: M* n9 z# S
说明:创建一个文件,如果文件是存在,他会覆盖掉。
! x: p4 `1 ~% u8 m/ r6 r! D0 _2 b2 _  L2 n
.area函数% ?) C! v& a" d- e) L
格式:
( b( R0 j8 V& L9 L1 f( Z9 n.area SizeEquation[,fill]
) t2 J( p% ^" t9 e; c! P.endarea
1 ]) U: c5 A; l/ C( f说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败
8 m9 }/ k1 S3 T
7 h% H; [5 j$ m( z% t例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据
0 T2 j3 [: Q$ J: `  Lorg 0x100' x: u8 {/ e% q6 Q5 W
.area 0x84 b0 L' \! [) N8 N) s- @% u
byte 0x5,0x6,0x7,0x8
# N* F2 c) T0 Y# y1 E.endarea
! i" W% s% v! f+ K1 z0 P# U/ F& Q# K6 H5 K( i7 M
.align函数
4 x: W- U" V$ M2 K1 y格式:.align num
) _* K7 _: m! {2 i说明:写零字节,num为零字节数量,用16进制表示。9 }2 }* E' `$ j; h
% n7 e8 d; I3 l/ M8 R  D6 f
.pool函数
# |6 q1 n( ?! Z# g  P' }! ~格式:.pool( F  E3 o6 k( ]5 h  l. |' c
说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
3 D. C" Z7 V$ u2 h" v例子:2 j5 V( }  Z, ^* u1 C: l; |
ldr r0,=0x12345678;
) u$ u2 c# Z* c1 U, _, a....
7 G7 N' e2 G- w5 Z7 O; D2 Q- |.pool
1 Z% p7 C3 y# r& S% K$ v% y
# `6 ]' k3 b8 y4 A$ [* M.fill函数$ q$ k. Q# v  J3 Q$ o
格式:  W! e" s/ o6 ]) O& z+ u
.fill length[,value]2 o( n. ~) s: L0 X* Y
defs length[,value]
  J3 ~4 R. x8 x! |2 N) F5 `说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
/ s% p; I  z. N+ }* z, D6 U+ G% Y. v; W# e
.skip函数:
3 r8 X6 W% R% A6 S格式:.skip length
. U* \* z$ w2 e& I4 r说明:跳过指定长度单字节数值,length用16进制表示。% R; G' L( w' {. j" O7 p
, s0 M  q0 y; D2 k
写单字节:3 x) z. n# h- M7 Q( R: w3 R( n3 v
.byte value[,...]
$ I4 h2 Y6 z3 T( z. T+ I* d6 p.db value[,...]# B$ l+ ^* R! r' g" m
.ascii value[,...]
6 W' R& P' _" ]+ S0 I.asciiz value[,...]
, O# z6 h* n5 A* ?: N0 p( Gdcb value[,...]
! u9 Z/ W  m" U- i
& Q9 T4 ?- e1 h写双字节:4 S# a+ F  l+ l! v6 n
.halfword value[,...]
' @, S# t; E# q3 i. r.dh value[,...]7 e0 {5 P2 B' q. i
dcw value[,...]* t+ e; \- u, m7 e" z1 r

7 h2 b/ v0 @7 D0 P8 B+ u. T  P写四字节:, N4 J1 `6 V& |
.word value[,...]
: I' c) u5 `4 Y7 C.dw value[,...]
9 A( S, ]+ W7 R  ?/ _  Xdcd value[,...]
" y. ^2 H3 e5 o% O9 m; e% V, c1 r' p, {3 s) X* e
写doublewords:
, R& n9 |6 n4 H7 C0 h( Y.doubleword value[,...]' ]( L+ q, O' E9 W9 W4 L- S9 }
.dd value[,...]
- i% m+ G( ~: `5 gdcq value[,...]
/ r9 B* A2 B7 d$ `/ z
4 H2 U* ?9 q8 ?写浮点数:. y1 M# I3 d/ v2 L' B
.float value[,...]6 x& ]7 M* T+ P# ?0 ~, z0 m1 L
.double value[,...]" n; X" O  |* w, a2 \9 T
" L% i, e9 z. Z; I) F
ARM的ARM模式和THUMB模式定义:* Q8 ?. r  K$ u+ w" Y% M
.arm|ARM模式
7 S( U7 `8 [" x! I.thumb|thumb模式$ U4 f9 C$ L$ J
, v7 n8 m3 @6 ]9 c# |, ?5 M
设置架构:0 {' }: [& ?2 E3 i- n" G9 w
.psx|PlayStation 1(MIPS R3000)( \( }5 e  i7 e4 t
.ps2|PlayStation 2(EmotionEngine)
) H: `4 @+ x' y1 ]  T.psp|PlayStation Portable(Allegrex)& H# l' L! D# P- [& E: l
.n64|Nintendo 64(MIPS R4000)
, q; w, v8 b) [# ^  C* M; k.rsp|Nintendo 64(RSP)" {( K& b" c- {( r' u* }% g3 \) F
.gba|GameBoy Advance(ARM7,默认是thumb模式)
- v  V$ }1 {) W, F- `6 l/ e% [% y.nds|Nintendo DS(ARM9,默认是ARM模式)
2 k' R. t: @+ N( g6 H.3ds|Nintendo 3DS(ARM11,默认是ARM模式)
; T  ?# t2 \0 W( \! \' r4 Z8 z.arm.big|
! i) x8 V; Q1 b! u* U.arm.little|
3 S, l* U0 j( j  c0 T
/ h$ g1 S  T7 @* }! N& _常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
$ T. i7 o" _) Z3 G- g# P, ?
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-5-15 15:45 , Processed in 1.109375 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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