安全之安全(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