我寫了一個非常簡單的 ARM64 匯編函式:
像這樣:
.global asmQuickSort \
asmQuickSort: \
1 sub x2, x1, #1 \
2 mov x1, #0 \
3 sub sp, sp, #8 \
4 str w1, [sp] \
5 add sp, sp, #8 \
6 ret
和主 cpp 呼叫它:
int main(int argc ,char** argv){ \
int a[7] = {5,4,3,4,3,2,1}; \
asmQuickSort(a,7); \
for(int i=0;i< 7;i ){ \
printf("%d\n",a[i]); \
} \
return 1;\
}
但是,當我將它放入 aarch64 板并運行它時,它遇到了
第 4 行 str w1 的 sigbus 錯誤,[sp]
這個可執行檔案使用 qemu-aarch64 運行良好,但在 arm board 中它收到了 sigbus。
那么,為什么應用程式會收到 sigbus 錯誤?
我應該檢查什么?
uj5u.com熱心網友回復:
這可能是堆疊對齊。
該手冊對“加載/存盤尋址模式”(C1.3.3)有這樣的說法:
當堆疊對齊檢查由系統軟體啟用且基址暫存器為 SP 時,當前堆疊指標最初必須是四字對齊的,即對齊到 16 個位元組。未對齊會產生堆疊對齊錯誤。除非特定的加載/存盤指令需要,否則偏移量不必是 16 位元組的倍數。
聽起來您的作業系統上啟用了堆疊對齊檢查,并且您通過向堆疊指標添加 8 來錯位堆疊指標。因此,將該值更改為 16,您應該會很好。
而且我假設您知道這一點,但以防萬一:您當前的堆疊使用asmQuickSort
無論如何都沒有任何用途。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/495918.html