ARM64e中LDP指令为何未向FP、LR加载完整8字节或仅加载6字节?
关于ARM64e中LDP指令加载FP/LR的疑问解答
先看你提供的汇编指令与调试输出:
ldp x29, x30, [sp, #0x40]
(lldb) memory read $sp+0x40 0x16b8f6680: 79 7a 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e yzABCDEFGHIJKLMN (lldb) register read $x29 fp = 0x0000444342417a79 (lldb) register read $x30 lr = 0x00004c4b4a494847
核心原因:ARM64e的指针认证(PAC)机制
这不是LDP指令没加载完整8字节,而是ARM64e硬件自动剥离了指针的认证码:
- 栈上存储的
x29/x30是带指针认证码(PAC)的完整64位指针:- 对应
x29的内存前8字节79 7a 41 42 43 44 45 46,按小端字节序组合为0x4645444342417a79,其中高16位0x4645是PAC。 - 对应
x30的内存后8字节47 48 49 4a 4b 4c 4d 4e,按小端字节序组合为0x4e4d4c4b4a494847,高16位0x4e4d是PAC。
- 对应
- 当LDP指令加载
x29/x30时,ARM64e硬件会自动执行指针认证验证,验证通过后剥离高16位的PAC,将剩余的48位有效地址存入寄存器,所以你看到的寄存器值高16位为0x0000,本质上仍是完整的64位寄存器值。
为什么不会仅加载6字节?
ARM64架构的通用寄存器都是64位(8字节),LDP指令的设计就是一次性加载两个连续的64位内存单元到两个64位寄存器,指令本身不支持操作非8字节对齐的长度,因此不可能只加载6字节。
内容的提问来源于stack exchange,提问作者n0bod1
相关产品推荐
相关产品推荐

