Car*_*ard 1 assembly abi memory-alignment stack-memory arm64
由于 ARM64 中缺少 PUSH 和 POP 指令,我在理解 SP 在 ARM64 中的工作方式时遇到了问题。
如果我要 PUSH/POP,SP 是否会减少/增加 4、8 或 16 个字节?
我正在阅读文档说堆栈帧必须按 16 字节对齐,但是当我调试时,情况似乎并非如此。
堆栈是向上还是向下增长完全取决于您正在查看的系统的 ABI。也就是说,我处理的所有 arm64 代码都有向下增长的堆栈。
有了这个,一个常见的推送看起来像这样:
stp x29, x30, [sp, -0x10]!
Run Code Online (Sandbox Code Playgroud)
还有这样的常见流行音乐:
ldp x29, x30, [sp], 0x10
Run Code Online (Sandbox Code Playgroud)
这显然一次压入/弹出两个寄存器,从而一次修改堆栈指针 16 个字节,这将我们带到下一部分:
堆栈对齐检查。堆栈指针是否必须与 16 字节边界对齐也取决于您使用的 ABI,但它是可以配置的实际硬件功能。请参阅ARMv8 参考手册,SCTLR_EL[123]
包括为每个异常级别打开或关闭此功能的位。引用自SCTLR_EL1
,例如:
SA0,位 [4] EL0 的 SP 对齐检查使能。当设置为 1 时,如果加载或存储指令 在 EL0 处执行使用 SP 作为基地址,并且 SP 未对齐到 16 字节边界,则产生 SP 对齐错误异常。更多 信息,请参阅第 D1-2333_ 页上的 _SP 对齐检查。 ARMv8.1-VHE实现时,HCR_EL2.{E2H, TGE}的值为{1, 1}, 该位对 EL0 处的执行没有影响。 在 PE 重置为 EL1 的系统中,该字段重置为架构上的 未知值。 SA,位 [3] SP 对齐检查启用。设置为 1 时,如果执行加载或存储指令 在 EL1 使用 SP 作为基地址并且 SP 没有对齐到 16 字节 边界,则产生 SP 对齐错误异常。想要查询更多的信息, 请参阅第 D1-2333 页上的 _SP 对齐检查_。 ARMv8.1-VHE实现时,HCR_EL2.{E2H, TGE}的值为{1, 1}, 该位对 PE 没有影响。 在 PE 重置为 EL1 的系统中,该字段重置为架构上的 未知值。
归档时间: |
|
查看次数: |
620 次 |
最近记录: |