下面通过一个简单的c函数调用分析参数的传递及返回过程。
示例代码
#include
int plus(int x,int y){
return x+y;
}
int main(){
__asm{
mov eax,eax
}
//调用函数
plus(1,2);
return 0;
}
通过在VC6中观察反汇编代码,如下
15: //调用函数
16: plus(1,2);
0041065A push 2
0041065C push 1
0041065E call @ILT+5(plus) (0040100a)
00410663 add esp,8
4: int plus(int x,int y){
00401010 push ebp
00401011 mov ebp,esp
00401013 sub esp,40h
00401016 push ebx
00401017 push esi
00401018 push edi
00401019 lea edi,[ebp-40h]
0040101C mov ecx,10h
00401021 mov eax,0CCCCCCCCh
00401026 rep stos dword ptr [edi]
5:
6: return x+y;
00401028 mov eax,dword ptr [ebp+8]
0040102B add eax,dword ptr [ebp+0Ch]
7: }
0040102E pop edi
0040102F pop esi
00401030 pop ebx
00401031 mov esp,ebp
00401033 pop ebp
00401034 ret
通过逐行分析堆栈变化画出相应堆栈图变化可以清楚的了解函数的调用过程
通过分析可知:
1)c语言函数调用参数通过堆栈进行传递,从左到右压入堆栈
2)返回值保存到了eax中(本例),最终保持了堆栈平衡
3)堆栈中的数据没有清除,变成