ARM硬件架构 程序员arm

ARM汇编中立即数的加载

2018-07-09  本文已影响6人  赵国开

因为A32和T32指令都只有32位。因此指令编码能表示的立即数也是有范围限制的。为了表示32位的立即数,你需要多条指令(当然可以用像LDR这样的伪指令进行转化,然后从内存中去拷贝)。

比如为了把32位的立即数加载到寄存器可以用下面几种方法:

当然如果你要加载的立即数是在数据处理类的汇编指令能够处理的范围之内,一条汇编指令就能处理完成。


下面对立即数加载到寄存器进行介绍,主要以MOV/MVN进行说明,其他的一些数据处理汇编指令可能也可以适用,具体可以参考ARM的汇编用户手册:

使用MOV/MVN能一次加载的立即数

在A32中

下表MOV/MVN的8位值有效范围

image.png

下表MOV的16位值有效范围

image.png
在T32中

T32有32位和16位的指令,先说下16位的,因为比较简单

在说下32位的MOV指令情况

上面这些情况同样适用于数据处理类的汇编指令

下表32位的T32指令能加载的立即数


image.png

那么如何加载超出MOV/MVN能加载范围的值,使用伪指令,下面介绍一下使用LDR加载的方法。

使用下面语法格式的LDR伪指令
LDR Rd,=const
可以加载任意32位的立即数

伪指令的生成过程大致如下:

LDR rn, [pc, #offset to literal pool]; rn = *(PC + offset)

备注:使用伪指令需要注意的是汇编器生成的文字池必须在LDR能够寻址的访问之内。那么什么是文字池,简单说就是一块存储常量的存储空间块,该空间块嵌在代码块中的。


参考文献

【1】DUI0801I_armasm_user_guide

上一篇 下一篇

猜你喜欢

热点阅读