我一直在學習IA-32彙編程序設計。所以我想在彙編中編寫一個函數,並從C++中調用它。從IA-32的程序集訪問C++中的函數參數
我正在遵循的教程實際上是爲x64程序集。但我正在研究IA-32。 在x64上,它說函數參數存儲在像RCX,RDX,R8,R9等
寄存器但在搜索一點點,我能理解在IA-32 ,參數存儲在堆棧中,不在寄存器中。
下面是我的C++代碼:
#include <iostream>
#include <conio.h>
using namespace std;
extern "C" int PassParam(int a,int b);
int main()
{
cout << "z is " << PassParam(15,13) << endl;
_getch();
return 0;
}
下面是PassParam()函數的彙編代碼(它只是增加兩個參數,這一切都只是爲了學習的目的。):
PassParam()彙編:
.model C,flat
.code
PassParam proc
mov eax,[ebp-212]
add eax,[ebp-216]
ret
PassParam endp
end
在我assembl y代碼,你可以看到我把第一個參數從[ebp-212]移到了eax。該值如下獲得:
我在C++本身編寫了PassParam()函數,並對它進行反彙編。然後檢查ebp在哪裏,第二個參數存儲在哪裏(參數從右向左存儲)。我可以看到有212的差異,所以這就是我得到這個價值的方式。然後像往常一樣,第一個參數存儲在4個字節之後。它工作正常。
問:
這是從裝配訪問參數的正確方法是什麼?我的意思是,它是否永遠[ebp-212]參數存儲在哪裏?
如果沒有,任何人都可以解釋從C++傳遞參數到彙編的正確方法嗎?
注:
我用Visual C++ 2010的工作時,Windows 7機器上。
我認爲它通常是像esp + 4這樣的東西,但我很難成爲這方面的專家,尤其是在涉及VC++時。 –
看起來你已經複製粘貼的程序集。這不是它的工作原理。 – 2013-01-07 13:42:40
@Tinctorius:未複製粘貼。這是我經過大量搜索後得出的最終工作解決方案。但我自己覺得這是錯誤的方法(好吧,ebp-212對我沒有任何意義)。 –