【问题标题】:why aarch64 force qword aligned even transferred size is dword?为什么 aarch64 强制 qword 对齐,即使传输的大小是 dword?
【发布时间】:2015-03-02 10:06:16
【问题描述】:

以下汇编代码将导致 iPad air2 上 Xcode6.1.1 目标上出现“exc_bad_access code=259”。

    // 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(8bytes),为什么要强制qword对齐?顺便说一句,我没有在 Android ndk r10 上测试过它,所以我不确认它对 aarch64 或 Xcode 的限制? 有什么建议吗?谢谢!

【问题讨论】:

    标签: xcode assembly gnu-assembler arm64


    【解决方案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]
    

    【讨论】:

    • 感谢您的回答。虽然 aarch64 要求“#imm 的后增量必须等于进出内存的字节数”。所以'st1 {v8.1d},[sp],#16'不能通过编译,合适的版本是'st1 {v8.2d},[sp],#16'。你能帮我分享更多关于 X64 案例的信息吗,这可能有助于区分它是否是相似/不同的案例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-01
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-24
    • 2013-03-05
    相关资源
    最近更新 更多