浅谈“函数调用”
来源:互联网 发布:开淘宝店货源哪里找 编辑:程序博客网 时间:2024/06/14 16:03
在C语言的代码编写中,程序的主体是函数,就会涉及函数调用的问题。因此这里讲讲“函数调用”的过程。 以如下求两个整数的最大值的代码为例:
#include<stdio.h>int max(int a,int b){ int max = 0; if(a>b) { max = a; } else { max = b; } return max;}int main(){ int x = 0; int y = 0; printf("输入两个整数:\n"); scanf("%d %d",&x,&y); printf("%d \n",max(x,y)); return 0;}
我们来看看程序运行的过程是怎样的,首先进行调试:
发现主函数是在__tmainCRTStartup 函数中调用的,而 __tmainCRTStartup 函数是在 mainCRTStartup 被调用的。这个过程就是函数调用的一个过程。 具体看看过程是怎样的,转到反汇编:
int max(int a,int b) { 00D014C0 push ebp 00D014C1 mov ebp,esp 00D014C3 sub esp,0CCh 00D014C9 push ebx 00D014CA push esi 00D014CB push edi 00D014CC lea edi,[ebp-0CCh] 00D014D2 mov ecx,33h 00D014D7 mov eax,0CCCCCCCCh 00D014DC rep stos dword ptr es:[edi] int max = 0; 00D014DE mov dword ptr [max],0 if(a>b) 00D014E5 mov eax,dword ptr [a] 00D014E8 cmp eax,dword ptr [b] 00D014EB jle max+35h (0D014F5h) { max = a; 00D014ED mov eax,dword ptr [a] 00D014F0 mov dword ptr [max],eax } else 00D014F3 jmp max+3Bh (0D014FBh) { max = b; 00D014F5 mov eax,dword ptr [b] 00D014F8 mov dword ptr [max],eax } return max; 00D014FB mov eax,dword ptr [max] } 00D014FE pop edi 00D014FF pop esi 00D01500 pop ebx 00D01501 mov esp,ebp 00D01503 pop ebp 00D01504 ret
来一边画图一边描述:
从main函数的地方开始,要对main函数调用就要先对main函数创建栈桢,调用max函数就要先对max函数创建栈桢。 在主函数运行中,遇到max函数时,调用max函数,首先对其创建栈桢,具体过程如图:
在调用max函数时,变量max的返回值出栈带回主函数的堆栈中,将出栈的内容作为地址返回,将程序执行跳转到该地址处。如下图所示:
这样,就完成了整个函数调用的过程,但注意,ebp始终存放的是栈底的地址,esp始终存放栈顶的地址!
4 0
- 浅谈“函数调用”
- 浅谈函数调用(一)
- 浅谈函数调用(二)
- 浅谈c程序函数调用过程
- 浅谈析构函数的调用顺序
- 浅谈函数调用过程(栈帧)
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数与析构函数的调用顺序
- 浅谈构造函数和析构函数的调用顺序
- 浅谈Self-Invoking Anonymous Functions(自调用匿名函数)
- 浅谈android系统java调用C++函数传参过程
- 浅谈C++指针直接调用类成员函数
- 浅谈C++中函数调用的底层机制
- 文章标题
- mysql如何开启远程连接
- ECHARTS基本用法
- spring面试问答
- poj 1836
- 浅谈“函数调用”
- 程序员面试金典——空格替换
- Bootstrap 在F12控制台 出现“$(...).carousel is not a function”错误的解决办法
- DEAD LOCK AND LOCK
- JAVA isAssignableFrom 判断父子关系
- cqoi2017,bzoj4813小Q的棋盘(树形dp或瞎搞)
- get请求乱码问题....
- Intent/Bundle传递Bitmap的时候失败甚至崩溃
- jQuery之字体大小的设置