C函數:
int add(int nNumA, int nNumB)
{
return nNumA + nNumB;
}
int _tmain(int argc, _TCHAR* argv[])
{
add(3, 4);
system("pause");
return 0;
}
彙編語言實現:
執行過程:
執行前棧狀態:
首先執行 push 0x4
push 0x3
執行後棧中內容
再執行 call 00415FD7 (調用函數,並將返回地址入棧)
執行後棧中內容
其中 00415FFA爲返回地址
再執行 push ebp (將ebp入棧,保存其內容)
執行後棧中內容
再執行 mov ebp,esp
sub esp,0xC (esp減12,開闢棧空間(大小按需))
執行後棧中內容
再執行 xor eax,eax
add eax,dword ptr ss:[ebp+0x8]
add eax,dword ptr ss:[ebp+0xC]
此時運算結束,結果7保存在eax中
再執行 mov esp,ebp (釋放掉之前開闢的空間)
執行後棧中內容
再執行 pop ebp (恢復ebp)
執行後棧中內容
再執行 retn 0x8 (按照棧中的返回地址返回,並將esp加8)
執行後棧中內容
至此,運算完成,運算結果7保存在eax中,同時EIP指向之前保存的返回地址(00415FFA)
執行後棧狀態:
並且棧、ebp、esp都已恢復到運算前的狀態,保持了棧的平衡