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都已恢复到运算前的状态,保持了栈的平衡