Board logo

标题: 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) 操作数     
完成对通用寄存器中的内容进行逻辑(或算术)的左移操作,按操作数所指定的数量向移位低位用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。
如:
   MOV    R0, R1, LSL#2 ;将R1中的内容左移两位后传送到R0中。
2、LSR逻辑右移
寻址格式:
通用寄存器,LSR 操作数      
完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向移位,左端用零来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。
如:
   MOV    R0, R1, LSR#2 ;将R1中的内容右移两位后传送到R0中,左端用零来填充
3、ASR算术右移
寻址格式:
通用寄存器,ASR 操作数     
完成对通用寄存器中的内容进行右移的操作,按操作数所指定的数量向移位,左端31位的值来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。
如:
   MOV    R0, R1, ASR#2 ;将R1中的内容右移两位后传送到R0中,左端31位的值来填充
4、ROR循环右移
寻址格式:
通用寄存器,ROR 操作数     
完成对通用寄存器中的内容进行循环右移的操作,按操作数所指定的数量向右循环移位,左端右端移出的位来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。显然,当进行32位的循环右移操作时,通用寄存器中的值不改变。
如:
   MOV    R0, R1, ROR#2 ;将R1中的内容循环右移两位后传送到R0中。
5、RRX带扩展的循环右移
寻址格式:
通用寄存器,RRX 操作数     
完成对通用寄存器中的内容进行带扩展的循环右移的操作,按操作数所指定的数量向右循环移位,左端进位标志位C来填充。其中,操作数可以是通用寄存器,也可以是立即数(031)。
如:
   MOV    R0, R1, RRX#2 ;将R1中的内容进行带扩展的循环右移两位后传送到R0中。
3.2.7  相对寻址与基址变址寻址方式相类似,相对寻址以程序计数器PC的当前值为基地址,指令中的地址标号作为偏移量,将两者相加之后得到操作数的有效地址。以下程序段完成子程序的调用和返回,跳转指令BL采用了相对寻址方式:
BL NEXT ;跳转到子程序NEXT处执行
……
NEXT
……
MOV PCLR ;从子程序返回
3.2.8  堆栈寻址堆栈是一种数据结构,按先进后出(First In Last OutFILO)的方式工作,使用一个称作堆栈指针的专用寄存器指示当前的操作位置,堆栈指针总是指向栈顶。
当堆栈指针指向最后压入堆栈的数据时,称为满堆栈(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