如何将48位立即数加载到ARM通用寄存器中?

安全之安全(security²)博客目录导读


问题:如何将48位立即数加载到ARM通用寄存器中? 

        AArch64执行状态中支持的指令集称为A64。所有A64指令的宽度都是32位。Move(宽立即数)被限制为16位立即数。

        如果使用以下指令将一个48位的值赋给一个通用寄存器,会得到一条错误消息:

mov x0, #0x830082008100
Error: immediate cannot be moved by a single instruction

        如何将48位立即数加载到X通用寄存器中呢?

答案

1、要将一个48位的值加载到X通用寄存器中,必须使用额外的MOV指令,如下例所示:

MOV      x0,#0x8100
MOVK     x0,#0x8200,LSL #16
MOVK     x0,#8300,LSL #32

2、移动48位值的另一种方法是将数据存储到文字( literal )池中,并使用与pc相关的加载指令将数据加载到X寄存器中。下面的例子展示了GCC的用法:

ldr x0, data
data:
.quad  0x830082008100

参考:Documentation – Arm Developer

你可能感兴趣的:(ARM安全架构,ARM,通用寄存器,48bit,mov,立即数)