为什么aarch64强制qword对齐甚至调整大小是dword?

时间:2015-03-02 10:06:16

标签: xcode assembly gas arm64

汇编程序代码将导致" exc_bad_access code = 259"在iPad air2上的Xcode6.1.1目标。

    // SP default 16 aligned on function entry,
    sub sp,sp,#8
    st1 {v8.1d},[sp],#8

虽然新版本不会

    sub sp,sp,#16
    st1 {v8.1d},[sp],#8

我发现ARMv8_ISA文件提及"对齐"上

章节$ 3:大多数加载和存储允许使用未对齐的地址,包括...... SIMD寄存器 章节$ 5.8.24.1:......后增量立即偏移量(如果存在)必须为8/16/24/32/48/64,具体取决于转移的元素数量。

以上代码传输大小为dword(8字节),为什么强制qword对齐?顺便说一下,我没有在Android ndk r10上测试它,所以我不确认它是对aarch64还是Xcode的限制? 有什么建议吗?谢谢!

1 个答案:

答案 0 :(得分:1)

你确定导致崩溃的是“st1”指令吗?

您可以使用以下代码进行检查:

sub sp,sp,#16
st1 {v8.1d},[sp],#16

我在x64上遇到了类似的问题;那是另一条指令需要一个正确对齐的堆栈并导致崩溃。

---编辑---

对不起。我混淆了“[sp,#16]”和“[sp],#16”。

如果“[sp],#16”为后递增,则测试应如下所示:

sub sp,sp,#16
st1 {v8.1d},[sp,#8]
add sp,sp,#8

或者:

sub sp,sp,#8
st1 {v8.1d},[sp]