标题:
ARM指令集-ARM寻址方式(2)
[打印本页]
作者:
look_w
时间:
2017-9-24 15:32
标题:
ARM指令集-ARM寻址方式(2)
3.2.6
寄存器移位寻址
寄存器移位寻址是
ARM指令集特有的寻址方式。ARM处理器内嵌桶型移位器(Barrel Shifter),支持数据的各种移位操作。当第二操作数为寄存器时,可以加入移位操作选项对它进行各种移位操作。
移位操作包括如下
6种类型:
1、LSL(或ASL)逻辑(算术)左移
寻址格式:
通用寄存器,LSL
(或
ASL
) 操作数
完成对通用寄存器中的
内容
进行逻辑(或算术)的左移操作,按操作数所
指定的数量向
左
移位
,
低位用零来填充。
其中,操作数可以是通用寄存器,也可以是立即数(
0
~
31
)。
如:
MOV R0, R1, LSL#2
;将
R1
中的内容左移两位后传送到
R0
中。
2、LSR逻辑右移
寻址格式:
通用寄存器,LSR
操作数
完成对通用寄存器中的
内容
进行右移的操作,按操作数所
指定的数量向
右
移位
,左端用
零来填充。
其中,操作数可以是通用寄存器,也可以是立即数(
0
~
31
)。
如:
MOV R0, R1, LSR#2
;将
R1
中的内容右移两位后传送到
R0
中,左端用
零来填充
。
3、ASR算术右移
寻址格式:
通用寄存器,
ASR
操作数
完成对通用寄存器中的
内容
进行右移的操作,按操作数所
指定的数量向
右
移位
,左端
用
第
31
位的值
来填充。
其中,操作数可以是通用寄存器,也可以是立即数(
0
~
31
)。
如:
MOV R0, R1, ASR#2
;将
R1
中的内容右移两位后传送到
R0
中,左端
用
第
31
位的值
来填充
。
4、ROR循环右移
寻址格式:
通用寄存器,
ROR
操作数
完成对通用寄存器中的
内容
进行循环右移的操作,按操作数所
指定的数量向
右循环
移位
,左端
用
右端移出的位
来填充。
其中,操作数可以是通用寄存器,也可以是立即数(
0
~
31
)。显然,当进行
32
位的循环右移操作时,通用寄存器中的值不改变。
如:
MOV R0, R1, ROR#2
;将
R1
中的内容循环右移两位后传送到
R0
中。
5、RRX带扩展的循环右移
寻址格式:
通用寄存器,
RRX
操作数
完成对通用寄存器中的
内容
进行带扩展的循环右移的操作,按操作数所
指定的数量向
右循环
移位
,左端
用
进位标志位
C
来填充。
其中,操作数可以是通用寄存器,也可以是立即数(
0
~
31
)。
如:
MOV R0, R1, RRX#2
;将
R1
中的内容进行带扩展的循环右移两位后传送到
R0
中。
3.2.7
相对寻址
与基址变址寻址方式相类似,相对寻址以程序计数器
PC
的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令
BL
采用了相对寻址方式:
BL NEXT
;跳转到子程序
NEXT
处执行
……
NEXT
……
MOV PC
,
LR
;从子程序返回
3.2.8
堆栈寻址
堆栈是一种数据结构,按先进后出(
First In Last Out
,
FILO
)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(
Full Stack
),而当堆栈指针指向下一个将要放入数据的空位置时,称为空堆栈(
Empty Stack
)。
同时,根据堆栈的生成方式,又可以分为递增堆栈(
Ascending Stack
)和递减堆栈(
Decending Stack
)。当堆栈由低地址向高地址生成时,称为递增堆栈,当堆栈由高地址向低地址生成时,称为递减堆栈。这样就有四种类型的堆栈工作方式,
ARM
微处理器支持这四种类型的堆栈工作方式,即:
1
. 满递增堆栈(
FA
):堆栈指针指向最后压入的数据,且由低地址向高地址生成。
2
. 满递减堆栈(
FD
):堆栈指针指向最后压入的数据,且由高地址向低地址生成。
3
. 空递增堆栈(
EA
):堆栈指针指向下一个将要放入数据的空位置,且由低地址向高地址生成。
4
. 空递减堆栈(
ED
):堆栈指针指向下一个将要放入数据的空位置,且由高地址向低地址生成。
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0