|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ARM 处理器是基于精简指令集计算机(RISC)原理设计的,指令集和相关译码机制较为简单,ARM7TDMI(-S)具有 32 位 ARM 指令集和 16 位 Thumb 指令集,ARM 指令集效率高,但是代码密度低,而 Thumb 指令集具有更好的代码密度,却仍然保持 ARM 的大多数性能上的优势,它是 ARM 指令集的子集。所有 ARM 指令都是可以有条件执行的,而 Thumb指令仅有一条指令具备条件执行功能。ARM 程序和 Thumb 程序可相互调用,相互之间的状态切换开销几乎为零。
; h8 {" {( w+ _( x' A
! I0 e/ X5 i3 C; zARM 处理器寻址方式- h L% R& Q" a) j. X
寻址方式是根据指令中给出的地址码字段来实现寻找真实操作数地址的方式,ARM处理器有 9 种基本寻址方式。
* ~* O1 g% N9 s+ k/ |9 a3 I/ L, s% ~- \, L7 m1 c" v
寄存器寻址
S1 T M n$ G; M% `8 w; Z( u操作数的值在寄存器中,指令中的地址码字段指出的是寄存器编号,指令执行时直接取出寄存器值操作。
2 N1 t* x6 x. @4 d9 p寄存器寻址指令举例如下: 7 O7 _( `/ x$ Z/ c5 z- q
MOV R1,R2 ;R2 -> R1 0 a# J) L' E4 |% Y
SUB R0,R1,R2 ;R1 - R2 -> R0 - W9 E5 ~; k1 c! g+ j
A, b' e- Z9 j; L立即寻址; C" j+ N g+ _$ L& W
立即寻址指令中的操作码字段后面的地址码部分就是操作数本身,也就是说,数据就包含在指令当中,取出指令也就取出了可以立即使用的操作数(立即数)。
# x' Q" {( t' T立即寻址指令举例如下: & _4 U a% t- D
SUBS R0,R0,#1 ;R0 – 1 -> R0 1 N$ @$ G* P0 X# o: r1 Z" s: b$ L
MOV R0,#0xff00 ;0xff00 -> R0
( M( }$ T) J6 R+ `立即数要以“#”为前缀,表示 16 进制数值时以“0x”表示。! ]4 L( r) N3 d, T2 J0 S6 h1 y
) ~! e& p* F5 b# _) K7 v0 [
寄存器偏移寻址+ L; |9 R& ~. f8 Q' p* m' l5 K+ _
寄存器偏移寻址是ARM指令集特有的寻址方式,当第2操作数是寄存器偏移方式时,第 2 个寄存器操作数在与第 1 个操作数结合之前,选择进行移位操作。 ( ]& t7 P/ V( C4 ^5 e- m% U
寄存器偏移寻址方式指令举例如下:
0 A9 c' q* y! F, \; EMOV R0,R2,LSL #3 ;R2 的值左移 3 位,结果放入 R0,即 R0 = R2 * 8 % C% r9 Y% P% {
ANDS R1,R1,R2,LSL R3 ;R2 的值左移 R3 位,然后和 R1 相与操作,结果放入 R1 可采用的移位操作如下:
+ `. ~. s" [, C$ J( ILSL:逻辑左移(Logical Shift Left),寄存器中字的低端空出的位补 0
. n! T) r) _* b z" T! ILSR:逻辑右移(Logical Shift Right),寄存器中字的高端空出的位补 0 2 P: A, K- L' q
ASR:算术右移(Arithmetic Shift Right),移位过程中保持符号位不变,即如果源操作数为正数,则字的高端空出的位补 0,否则补 1
1 `) p1 T- H; G/ H' o9 I! V' o# cROR:循环右移(Rotate Right),由字的低端移出的位填入字的高端空出的位
. U8 i" F4 s. @RRX:带扩展的循环右移(Rotate Right eXtended by 1place),操作数右移一位,高端空出的位用原 C 标志值填充。
- }9 l: y' K' _/ a. l' S- A* C1 o M, v3 e5 g8 ? ~4 y+ a) z
各移位操作如下图所示。$ O. V1 R H' c- j, s
, O5 }( ]. o; m- Z
! N1 H t* i% y! o$ L! ^寄存器间接寻址
, ^- d& k" e% R# u) ]寄存器间接寻址指令中的地址码给出的是一个通用寄存器编号,所需要的操作数保存在寄存器指定地址的存储单元中,即寄存器为操作数的地址指针。
4 \7 ~1 P% k1 W' [寄存器间接寻址指令举例如下:
3 s4 p+ h% ?: m! m8 R+ CLDR R1,[R2] ;将 R2 中的数值作为地址,取出此地址中的数据保存在 R1 中
0 c5 T' v( V; @0 ?SWP R1,R1,[R2];将如中的数值作为地址,取出此地址中的数值与 R1 中的值交换
' ~) y, u B8 h5 F( Y2 a9 V8 G' }: H& x$ X
基址寻址
) P2 L& d0 X2 W5 W7 w4 v基址寻址是将基址寄存器的内容与指令中给出的偏移量相加,形成操作数的有效地址,基址寻址用于访问基址附近的存储单元,常用于查表,数组操作,功能部件寄存器. _6 }4 p7 p7 z5 O" y6 F
访问等。 6 F s+ u4 n: F6 V# `
基址寻址指令举例如下: . I/ P# i) Z' W1 n$ K
LDR R2,[R3,#0x0F] ;将 R3 中的数值加 0x0F 作为地址,取出此地址的数值保存在 R2 中 STR R1,[R0,#-2] ;将 R0 中的数值减 2 作为地址,把 R1 中的内容保存到此地址位置
. o! y! \% C5 x, r( |+ Y/ X8 s3 I- p* u( @
|
|