2015-03-02 20 views
0

下面的彙編代碼會在iPad air2上的Xcode6.1.1 target上產生「exc_bad_access code = 259」。爲什麼aarch64強制qword對齊連轉移大小是dword?

// 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

你確定它是導致崩潰的「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] 
+0

謝謝您的回答。雖然aarch64要求「通過#imm進行後增加必須等於內存中的字節數」。所以'st1 {v8.1d},[sp],#16'無法通過編譯,適當的版本是'st1 {v8.2d},[sp],#16'。你能幫我分享一些關於X64的案例嗎?這可能有助於區分它是否是類似/不同的案例。 – charlie 2015-03-02 14:22:31

相關問題