一个基本的c console程序 :
int Sum1(int nNum1, int nNum2)
{
int nRet = 0;
nRet = nNum1 + nNum2;
return nRet;
}
_declspec(naked) int Sum2(int a, int b)
{
__asm
{
push ebp
mov ebp, esp
sub esp, 44h
push ebx
push esi
push edi
lea edi, [ebp-44h]
mov ecx, 11h
mov eax, 0cccccccch
rep stos dword ptr es:[edi]
//局部变量赋值
mov [ebp-4], 0
//求和
mov eax, [ebp+8] //第一个参数
add eax, [ebp+0ch] //第二个参数
//局部变量(返回值) 赋值(编译器对此代码肯定会有优化、因为一般通过eax得到函数的返回值)
mov [ebp-4], eax
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret
}
}
int main(int argc, char* argv[])
{
int nRet = 0;
int nNum1 = 5;
int nNum2 = 8;
nRet = Sum1(nNum1, nNum2);
//用汇编实现上面代码 注:这里不考虑release版本、编译器所做的优化
__asm
{
//局部变量赋值
mov [ebp-4], 0
mov [ebp-8], 5
mov [ebp-0ch], 8
//压栈参数-从右向左 注:[ebp+4]=call的下一条指令
mov eax, [ebp-0ch]
push eax //在函数内部访问时=[ebp+0ch]
mov ecx, [ebp-8]
push ecx //在函数内部访问时=[ebp+8]
//调用函数
call Sum2
//平衡参数
add esp, 8
//给局部变量(返回值) 赋值
mov [ebp-4], eax
}
return 0;
}