设为首页收藏本站

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

[分享] ARMIPS assembler使用说明

[复制链接]

签到天数: 1973 天

[LV.Master]伴坛终老

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

- i4 f1 k, i) v0 p& K0 _ARMIPS assembler是一款ARM/MIPS汇编工具,他是命令行工具,支持ARM7/ARM9/MIPS R3000/MIPS R4000
& `4 v! o6 D1 P8 k5 i  m+ @% t6 B' Q' r. T# {% e; R+ x
ARMIPS assembler作者是Kingcom,目前发展到0.9版本% N$ o; e6 {! `  ?

# v& o$ [+ [+ u* Q. BKingcom's website:http://aerie.wingdreams.net
  I# R8 _7 k- t
* x8 @1 L* Y) x/ j7 b& DARMIPS assembler源代码可去https://github.com/Kingcom/armips获得
& a) }1 T1 V) c7 b. d3 @
/ O7 h# F) s' P2 s更新版本可去http://buildbot.orphis.net/armips获得5 k1 \& |) o; h# n+ n

: V/ G- n9 @3 D4 uARMIPS assembler特点支持加载ROM并自动编译代码到ROM,省了使用16进制编辑器复制代码进ROM,进行ROM HACK更方便了。) g* B/ n4 Z* I" Z; j

- t/ ^& n3 e- TARMIPS命令行用法:
5 r+ N; R; z7 c4 N8 c6 c2 S- j1 s3 E0 l1 E* I$ d
Usage: armips [optional parameters] <FILE>$ W! [! g, M/ E% m* Z
" m2 h5 d5 J. w% D+ H: u: Y
Optional parameters:
% A4 _7 ~1 A, x* J& \' W/ J: f8 i -temp <TEMP>         Output temporary assembly data to <TEMP> file; V2 T1 l- b$ A6 E
-sym  <SYM>          Output symbol data in the sym format to <SYM> file$ D& _) b& }( V" M  J8 e0 ^# a% r: G
-sym2 <SYM2>         Output symbol data in the sym2 format to <SYM2> file
3 d" p4 Q* ~, a" i' r, n -root <ROOT>         Use <ROOT> as working directory during execution0 W9 Y6 d" G, r: n
-equ  <NAME> <VAL>   Equivalent to '<NAME> equ <VAL>' in code+ y: T1 b3 o+ N" ?" _3 {* T4 \: I7 H
-strequ <NAME> <VAL> Equivalent to '<NAME> equ "<VAL>"' in code
% T( I6 Q/ K8 f3 Q6 y: k -erroronwarning      Treat all warnings like errors' c6 c% B% i  G) [0 U

3 [9 l) q, y2 R9 p" ^File arguments:
; S+ G1 Z4 Q% K0 w  b0 ~ <FILE>               Main assembly code file
  t* T: f, p& C7 c6 Z- B3 O5 q
) x* C; P' Y8 I-temp <TEMP>参数是将临时汇编数据输出到<TEMP>文件' o, V) ^$ u+ }
-sym <SYM>参数是将sym格式符号输出到<SYM>文件,这格式支持no$psx和no$gba% f. S$ z3 O9 R5 {) t/ b7 R" C0 T: t
-sym2 <SYM2>参数是将sym2格式符号输出到<SYM2>文件,这格式支持pcsx2和ppsspp1 L8 ~. S0 Q9 {! k2 j
-root <ROOT>参数是指定执行期间要使用的工作目录  `$ v8 V1 `+ h0 e
-equ <NAME> <VAL>参数用法不明; t( m' y  S, h; J* y
-strequ <NAME> <VAL>参数用法不明
( T9 A6 o8 q0 ^  U6 W! z-erroronwarning参数是当出现任何警告时被视为错误,防止继续编译
( w* F5 j; m! L* ^
4 H% C6 r1 n% W( [) z! F! l% T<FILE>是汇编代码文件,可用记事本之类编辑
5 A$ o2 Y7 f0 d8 z8 }1 D0 X* C: l  c$ u5 v8 Z+ k3 n; `" `
注释说明:
; T4 g8 a) g$ U$ W4 ~: e. O1 d注释可在单行指令后面“;”和“//”添加# j: [7 L3 ^- s! V3 B5 _7 |# @
“/* */”式也接受
. K) }- I; u) w3 J9 N, G2 X% ?3 s- p; f" |* i
例子:
3 h4 d6 c1 [: p# o+ W7 K) z% \.open"1234.gba",0x08000000;//打开1234.gba文件,并将起始地址定义为0x08000000. y3 f9 U1 C9 j. x: A- M* O6 \7 {
; J: S2 Z& P3 q
.close;/*关闭文件*/
6 h& f6 ~) X) e. s. j- d  f; X& `5 v. k( i# b/ l) d
标签说明:1 z6 b5 }# {  G# Y: M
标签名可以包含A~Z字母和数字、下划线。但是它不能以数字开头,所有标签名称不区分大小写。
! C" ^, D4 U9 ^% d% @9 }: v- M) c) I" j. A0 a- _6 o1 X4 }
数值说明:
# H+ j* T4 M2 o6 k: j+ q5 j“0xA”和“0Ah”是16进制数值
+ K2 s1 s+ i) d- [9 S# K“0o12”和“12o”是8进制数值
  ]( t: S$ V9 ?% G4 s“1010b”和“0b1010”是2进制数值
. c, J# g7 g6 E  ~. J# ?  [, ^/ p! ^. }- V' T+ P
equ说明:
& u2 s& p2 b/ K' m9 L格式:text equ value( T, @# Y1 y/ Y' Q
说明:用一个text代替value
! M- Z. D7 N" q* B9 T例子:
, W) q4 ?$ _5 u) Daddress1 equ 0x12345678$ C& z- ]) R+ Z
ldr r0,=address1
) M5 ^# v0 m4 M) j.pool' ~. H' |) h0 V3 |) \, U

( {6 v  q; J2 K( R' k函数说明:
8 X1 l( H  v' b/ B+ }* Z) v7 ?: e8 y" O
.open函数:
; i8 ?9 s0 p3 t格式:8 C0 x2 T8 r% Q
.open "ROM FileName",offset
1 z1 s8 L) ?- l# l$ ]4 I.open "Old FileName","New FileName",offset
% e4 o; b; i; s6 M: h2 U说明:.open函数打开ROM文件,并将ROM文件起始地址设置为offset地址。但结果指定了2个文件,汇编器会将文件复制到第二个路径。
3 Z% }: q& y& v
! T: D5 d2 P; ~4 ^- {例子:) c; r0 f7 F" t. M- K; b
.open "1234.gba",0x08000000
! z$ w6 P: ~4 ?& f% q. J" B' S7 R$ V& F9 l4 w
.close函数和.closefile函数:& B9 R. Q2 v6 i7 X2 I) X" `; Y( @
格式:
# ?% z) I' I# C' v* U, p.close
% \' P/ d- @  }: t" y# S2 |.closefile
' b: S3 l; e+ w2 d( l8 g说明:关闭文件。: E4 U7 v4 o, s8 d7 f  W* A, V: Z! H

1 P- v% K7 F# s.org函数和.orga函数:1 p3 z7 Q7 H. O8 t- T
格式:4 H, D- m5 S3 Y# h, ~. t+ J
.org RamAddress2 L0 Q+ G8 }' b
.orga FileAddress+ o/ t, ^1 L& @% g1 ?& e# G, @
说明:! c8 n' a' [$ _$ Y" D$ F: `
前面用.open函数设置过offset地址的话,那么可以用.org函数设置offset输出地址。
! T# K7 {6 T  \7 x: ^% d* @$ |& b  v$ |6 l# x
.orga函数可指定ROM文件的输出地址。
5 M. ~( C$ g( U1 P' l* ?" _; j  \% ]: ^' n4 H
.create函数和.createfile函数
* O: R2 {' n; F3 b8 Z格式:: g: N$ c$ g- k+ O5 S, `
.create "FileName",offset
  @9 K3 J  ~+ r" f& v.createfile "FileName",offset
8 a# y( K' }. [3 A说明:创建一个文件,如果文件是存在,他会覆盖掉。  a2 u, G% \! b, n& ^

+ X* P2 ]0 V! v- X+ d! B/ j7 k.area函数
2 B3 |$ D7 W6 ?7 G, _2 n格式:, c% I: N2 u1 E& e5 Y  r
.area SizeEquation[,fill]* ?; P& Q0 v" O/ F9 N4 ?4 p! B
.endarea5 }$ m" p2 ~% G0 Q: h+ L1 `
说明:如果你要向某地址写入一定字节数值,就用.area函数,SizeEquation是能写入最大字节数,超过就编译失败, J7 t* ]3 K3 G: R8 K" F6 F
3 {% m+ E; B: P" K- j" p( G* @8 M
例子:向0x100地址写入0x5,0x6,0x7,0x8单字节数据" l: @2 X0 ]# o$ S/ B0 H5 K
org 0x100
' ~+ V$ f8 L: m' B# v.area 0x86 s& d3 u, \4 I( U% _
byte 0x5,0x6,0x7,0x84 z1 m7 b' h7 A" t% c6 c  z. z
.endarea$ x4 ]# P: H8 a" P$ `2 t2 s
3 B. R+ p9 Y4 o( k1 S. ?/ d8 ?0 j
.align函数5 E; I1 \& H& q" }" d
格式:.align num
" }. R0 y# J! l9 L6 j) c, R. I+ B说明:写零字节,num为零字节数量,用16进制表示。$ u, N: S' m% v

; S  w/ H# E( x3 Y% A2 Q/ C& g.pool函数  F. c! ]+ T' \- ]" X
格式:.pool
5 ]" n: n1 y6 ?! z/ e+ K说明:如果代码中有“ldr rx,=value”,就要用.pool对齐。
1 f) s: M/ E$ v2 C4 G. l  r例子:1 y0 }+ r/ I9 H6 _
ldr r0,=0x12345678;7 p& l' G) |0 y( x/ R* s$ f8 B
....
8 a! I% v0 k6 }# @" U  H.pool
% I- O" ?# F6 F# I0 F& j& P0 z0 _" `
.fill函数
+ y  X+ w0 a! r2 n格式:* u8 f. ?9 Y# |# I% M
.fill length[,value]
  w2 f) R5 R$ L. s+ d: Bdefs length[,value]
( g7 H% B( }  H* S; H9 T4 C说明:填充一定长度单字节数值,如果未指定value,而填充零字节数值;length和value用16进制表示。
4 i1 t$ o: C  h2 g" [/ J. h/ E3 `) ~( f4 o8 V. \5 H$ T- [
.skip函数:; {/ H: ^" X* J7 Z& r
格式:.skip length% w/ ]- j) M1 k0 p0 M  V8 }6 J" k
说明:跳过指定长度单字节数值,length用16进制表示。
+ s. d6 N8 ?" `5 P4 R. J) x1 ?# E0 Q4 l- \$ |% g$ m5 }. {' @4 R
写单字节:
# R  r: V, S7 ?9 w! r% Z) e' V3 x.byte value[,...]
% b; D2 z) g9 I3 ^; C.db value[,...]
2 a8 E- V7 z7 A0 M3 |1 |.ascii value[,...]
! @6 f: w7 N7 ?' p' i$ u+ B; D.asciiz value[,...]
( K, i6 E. a/ ~/ j7 \7 jdcb value[,...]
, ]) \# G+ w1 d( t" p9 f! H7 B$ F6 a0 g* l9 e
写双字节:
0 _, z6 t( O+ ?$ C.halfword value[,...]% a4 m, l) ^6 f2 |; P0 x1 h
.dh value[,...]
% ~$ Z2 t/ m9 W! ~4 kdcw value[,...]
8 J/ `$ m& {( ]% k! V
( d: v7 _! Q- |+ u" \0 Z; \$ O写四字节:
5 b  N  H5 I8 @2 B5 x3 n( N.word value[,...]
! K1 B- {+ u! o" {2 s! P( I0 n5 L.dw value[,...]
7 a9 J8 n3 d. Q& ~: S' k6 ydcd value[,...]
  k' W3 ?& ~) g* h
. F/ }5 C- o# O2 a* m8 o写doublewords:( B* \$ M, _/ T# l* N
.doubleword value[,...]
( O: V6 `  R' f.dd value[,...]5 J7 Y3 S1 J) l- [0 x
dcq value[,...]4 n  D7 f3 Z! u8 c
# i: w$ Q: G8 @
写浮点数:; b' v' \* O) s- r7 ^
.float value[,...]$ N2 k* @7 Q. |7 A% B
.double value[,...]* v0 f' r) Q6 g+ [+ @+ ~
; n0 \- Q$ R4 P8 w4 F
ARM的ARM模式和THUMB模式定义:
: N  Q: [3 A5 {3 \( ^. S2 N' g.arm|ARM模式. e% @( y# ]7 e5 E5 N. C$ X
.thumb|thumb模式
# ?8 C3 E- M; f1 z8 L) w3 z6 ^* x& F+ M
设置架构:
) m2 t) e9 Y! ^7 F.psx|PlayStation 1(MIPS R3000)
# q9 c3 S1 u: Z, F.ps2|PlayStation 2(EmotionEngine)2 n$ I% C& r* {. A& ]) V& z- @) s8 p
.psp|PlayStation Portable(Allegrex)5 Y& p6 r: r8 _2 Q. M& y# _
.n64|Nintendo 64(MIPS R4000)5 G, l# g# R3 e1 m
.rsp|Nintendo 64(RSP)
  U" k; g9 ~, `. w4 o# ~6 f.gba|GameBoy Advance(ARM7,默认是thumb模式)
" I, j6 h( e  J& j; k.nds|Nintendo DS(ARM9,默认是ARM模式)+ c$ ~/ C7 l+ _2 L, N" Y' x' {
.3ds|Nintendo 3DS(ARM11,默认是ARM模式)7 Z, N) s( S, x* }( y: ^
.arm.big|
, T( y+ N. k% W7 m# l# G( U.arm.little|. c' O/ |2 `7 M9 w
( E3 j  F. M  d3 P2 ^! x
常用函数就写这些了,还有大量函数说明没写,更多说明看readme.md吧。
$ ?; a; E/ m. B2 {* Z6 G
[发帖际遇]: 一个袋子砸在了 疾风之狼 头上,疾风之狼 赚了 2 个 柠檬. 幸运榜 / 衰神榜
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-6-6 05:17

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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