新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ARM指令寻址方式之: 数据处理指令的寻址方式

ARM指令寻址方式之: 数据处理指令的寻址方式

作者:时间:2013-09-13来源:网络收藏

本文引用地址:http://www.amcfsurvey.com/article/257084.htm

2.寄存器方式

寄存器的值可以被直接用于数据操作指令,如:

MOV r2,r0 ;r0的值送r2

ADD r4,r3,r2 ;r2加r3,结果送r4

CMP r7,r8 ;比较r7和r8的值

3.寄存器移位方式

寄存器的值在被送到ALU之前,可以事先经过桶形移位寄存器的处理。预处理和移位发生在同一周期内,所以有效的使用移位寄存器,可以增加代码的执行效率。

具体的移位(或者循环移位)方式有下面几种。

· ASR:算术右移。

· LSL:逻辑左移。

· LSR:逻辑右移。

· ROR:循环右移。

· RRX:扩展的循环右移。

以上5种移位方式,移位值均可以由立即数或寄存器指定。下面是一些在指令中使用了移位操作的例子。

ADD r2,r0,r1,LSR #5

MOV r1,r0,LSL #2

RSB r9,r5,r5,LSL #1

SUB r1,r2,r0,LSR #4

MOV r2,r4,ROR r0

4.1.4 寻址方式分类详解

的寻址方式根据shifter_operand>的不同,相应的分为11种。详见表4.1。下面对各类寻址方式进行详细说明。

1.#immediate>

(1)编码格式

指令的编码格式如图4.2所示。

图4.2 ——立即数寻址编码格式

立即数寻址为提供了一个可直接操作的立即数。立即数的生成方法见前面章节介绍。如果移位值为0,则移位进位值为程序状态寄存器CPSR的C标志位;否则,为32-bit立即数的bit[31]。

(2)操作伪代码

Shifter_operand = immed_8 Rotate_Right (rotate_imm*2)

if rotate_imm == 0 then

shifter_carry_out = C flag

else /* rotate_imm != 0*/

shifter_carry_out = shifter_operand[31]

(3)说明

① 并不是所有的32-bit立即数都是可以使用的合法立即数。只有那些通过将一个8-bit的立即数循环右移偶数位可以得到的立即数才可以在指令中使用。

② 有些立即数可以通过不止一种方法得到。由于立即数的构造方法中移位包含了循环操作,而循环移位操作会影响CPSR的条件标志位C。因此,同一个合法的立即数由于采用了不同的编码方式,将使这些指令的执行产生不同的结果,这是不能允许的。汇编器按照下面的规则来生成立即数的编码。

· 当立即数数值在0和0xFF范围时,令immed_8=immediate>,immed_4=0。

· 其他情况下,汇编编译器选择使用immed_4数值最小的编码方式。

③ 为了更精确地控制立即数的生成,可以使用下面的语法格式控制立即数的生成。

#immed_8>,rotate_amout>

其中,rotate_amout> = 2*rotate_imm

(4)举例

SUBS r0,r0,#1 ;寄存器r0中的数值减1,结果保存到r0

MOV r0,#0xff00 ; 0xff00 → r0 ;将立即数0xff00放入r0保存



评论


相关推荐

技术专区

关闭