2012-08-22 46 views
0

我正試圖編寫一個可從Objective-C代碼調用的程序集中的函數。通過設置%rax並直接返回,我得到了簡單的結果,但是當我嘗試使用堆棧來存儲局部變量時,我得到了EXC_BAD_ACCESS。有人可以看看這個,告訴我發生了什麼問題嗎?我的裝配是這樣的:彙編函數中的EXC_BAD_ACCESS

.global _fn 
_fn: 
pushq %rbp 
movq %rsp, %rbp 
subq 0x8, %rsp 
addq 0x8, %rsp 
popq %rbp 
ret 

Xcode中轉儲這一點,並表明飛機墜毀在sub 0x8,%rsp當我打電話fnmain

0x0000000100020000 <+0000> push %rbp 
0x0000000100020001 <+0001> mov %rsp,%rbp 
0x0000000100020004 <+0004> sub 0x8,%rsp 
0x000000010002000c <+0012> add 0x8,%rsp 
0x0000000100020014 <+0020> pop %rbp 
0x0000000100020015 <+0021> retq 

回答

3

8從rsp僅僅減法不應該導致異常。

您很可能需要在美元符號前綴常量。如果不這樣做,(g)將這些數字視爲相應地址的內存操作數。

在x86平臺上訪問地址爲8的內存通常與在NULL指針取消引用時一樣好。

+1

這幾乎肯定是答案。如果您運行代碼,請注意,EXC_BAD_ACCESS正在抱怨的地址是0x00000008。 –

+1

+1 Mach-O加載器強制虛擬內存的底部頁面無法被用戶代碼訪問。這是用於捕獲空指針訪問的機制,但當然會在底部頁面上的所有位置上導致相同的異常 - 其中地址0x00000008爲1。 – JeremyP

+0

乾杯,就是這樣。我應該更多地關注小字。 –