這是我在VC++項目中插入的一個簡單的asm代碼。 return_addr是堆棧幀的返回地址。我有一個StackWalk函數(不是我寫的codeproject.com/KB/threads/StackWalker.aspx),它使用StackWalk64()來提取幀。這個細節不相關。使用返回地址,我從當前正在檢查的堆棧中的函數代碼中提取一個字節。在彙編代碼中讀取訪問衝突
__asm{
push eax
push ecx
mov eax, return_addr
mov cl, BYTE PTR [eax - 5] //Problem Statement
mov ret_5, cl
pop ecx
pop eax
}
我運行我的代碼以及其他應用程序,如gtalk,vlc等。應用程序總是崩潰時,我包括問題陳述。當我刪除這些聲明一切正常。我運行了一個調試器,並在顯示訪問衝突讀取位置0xzzzzzz錯誤的問題陳述處中斷。我想應用程序試圖讀取某些受限制的dll或代碼段的代碼,並引發錯誤。我用了一個try catch塊,但沒有幫助。對我能做什麼有任何建議?
你能澄清一下「堆棧幀的返回地址」是什麼意思?似乎這可能是您所遇到的核心問題。 – 2011-01-05 16:02:53
0xzzzzzz?如何發佈實際地址? – 2011-01-06 07:27:22
@Jonathan:每個堆棧幀都有一個返回地址,一旦函數終止,控制權就會被轉移。它在呼叫者功能中。 – Bruce 2011-01-07 03:56:30