



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Visual C+中函数调用方式浅探我们知道在进行函数调用时,有几种调用方法,分为C式,Pascal式。在C和C+中C式调用是缺省的,除非特殊声明。二者是有区别的,下面我们用实例说明一下:1. _cdecl :C和C+缺省调用方式例子:void Input( int &m,int &n);/*相当于void _cdecl Input(int &m,int &n);*/以下是相应的汇编代码:00401068 lea eax,ebp-8 ;取ebp-8地址(ebp-8),存到eax0040106B pusheax ;然后压栈0040106C lea ecx,ebp-4 ;取ebp-4地址(ebp-4),存到ecx0040106F pushecx ;然后压栈00401070 callILT+5(Input) (0040100a);然后调用Input函数00401075 add esp,8 ;恢复栈从以上调用Input函数的过程可以看出:在调用此函数之前,首先压栈ebp-8,然后压栈ebp-4,然后调用函数Input,最后Input函数调用结束后,利用esp+8恢复栈。由此可见,在C语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复堆栈。下面看一下:地址ebp-8和ebp-4是什么?在VC的VIEW下选debug windows,然后选Registers,显示寄存器变量值,然后在选debug windows下面的Memory,输入ebp-8的值和ebp-4的值(或直接输入ebp-8和-4),看一下这两个地址实际存储的是什么值,实际上是变量 n 的地址(ebp-8),m的地址(ebp-4),由此可以看出:在主调用函数中进行实参的压栈并且顺序是从右到左。另外,由于实参是相应的变量的引用,也证明实际上引用传递的是变量的地址(类似指针)。总结:在C或C+语言调用中默认的函数修饰_cdecl,由主调用函数进行参数压栈并且恢复堆栈,实参的压栈顺序是从右到左,最后由主调函数进行堆栈恢复。由于主调用函数管理堆栈,所以可以实现变参函数。另外,命名修饰方法是在函数前加一个下划线(_).2. WINAPI (实际上就是PASCAL,CALLBACK,_stdcall)例子:void WINAPI Input( int &m,int &n);看一下相应调用的汇编代码:00401068 lea eax,ebp-80040106B pusheax0040106C lea ecx,ebp-40040106F pushecx00401070 callILT+5(Input) (0040100a) 从以上调用Input函数的过程可以看出:在调用此函数之前,首先压栈ebp-8,然后压栈ebp-4,然后调用函数Input,在调用函数Input之后,没有相应的堆栈恢复工作(为其它的函数调用,所以我没有列出) 下面再列出Input函数本身的汇编代码:(实际此函数不大,但做汇编例子还是大了些,大家可以只看前和后,中间代码与此例子无关)39: void WINAPI Input( int &m,int &n)40: 00401110 pushebp00401111 mov ebp,esp00401113 sub esp,48h00401116 pushebx00401117 pushesi00401118 pushedi00401119 lea edi,ebp-48h0040111C mov ecx,12h00401121 mov eax,0CCCCCCCCh00401126 rep stosdword ptr edi41: int s,i;42:43: while(1)00401128 mov eax,10040112D testeax,eax0040112F jeInput+0C1h (004011d1)44: 45: printf(nPlease input the first number m:);00401135 pushoffset string nPlease input the first number m. (004260b8)0040113A callprintf (00401530)0040113F add esp,446: scanf(%d,&m);00401142 mov ecx,dword ptr ebp+800401145 pushecx00401146 pushoffset string %d (004260b4)0040114B callscanf (004015f0)00401150 add esp,847:48: if ( m1 ) continue;00401153 mov edx,dword ptr ebp+800401156 cmp dword ptr edx,100401159 jge Input+4Dh (0040115d)0040115B jmp Input+18h (00401128)49: printf(nPlease input the first number n:);0040115D pushoffset string nPlease input the first number n. (0042608c)00401162 callprintf (00401530)00401167 add esp,450: scanf(%d,&n);0040116A mov eax,dword ptr ebp+0Ch0040116D pusheax0040116E pushoffset string %d (004260b4)00401173 callscanf (004015f0)00401178 add esp,851:52: if ( n1 ) continue;0040117B mov ecx,dword ptr ebp+0Ch0040117E cmp dword ptr ecx,100401181 jge Input+75h (00401185)00401183 jmp Input+18h (00401128)53:54: for(i=1,s=0;i= s )004011B3 mov eax,dword ptr ebp+8004011B6 mov ecx,dword ptr eax004011B8 cmp ecx,dword ptr ebp-4004011BB jlInput+0AFh (004011bf)57: break;004011BD jmp Input+0C1h (004011d1)58: else59: printf( m n*(n+1)/2,Please input again!n);004011BF pushoffset string m n*(n+1)/2,Please input agai. (00426060)004011C4 callprintf (00401530)004011C9 add esp,460: 004011CC jmp Input+18h (00401128)61:62: 004011D1 pop edi004011D2 pop esi004011D3 pop ebx004011D4 add esp,48h004011D7 cmp ebp,esp004011D9 call_chkesp (004015b0)004011DE mov esp,ebp004011E0 pop ebp004011E1 ret 8最后,我们看到在函数末尾部分,有ret 8,明显是恢复堆栈,由于在32位C+中,变量地址为4个字节(int也为4个字节),所以弹栈两个地址即8个字节。由此可以看出:在主调用函数中负责压栈,在被调用函数中负责恢复堆栈。因此不能实现变参函数,因为被调函数不能事先知道弹栈数量,但在主调函数中是可以做到的,因为参数数量由主调函数确定。下面再看一下,ebp-8和ebp-4这两个地址实际存储的是什么值,ebp-8地址存储的是n 的值,ebp -4存储的是m的值。说明也是从右到左压栈,进行参数传递。总结:在主调用函数中负责压栈,在被调用函数中负责弹出堆栈中的参数,并且负责恢复堆栈。因此不能实现变参函数,参数传递是从右到左。另外,命名修饰方法是在函数前加一个下划线(_),在函数名后有符号(),在后面紧跟参数列表中的参数所占字节数(10进制),如:void Input(int &m,int &n),被修饰成:_Input8对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 地铁员工考试题及答案
- 团队项目进度管理及任务分配模板
- 助人为乐的阿姨500字10篇
- 销售团队客户信息管理工具表
- 农村环保型养殖模式应用合同
- 学习中的挫折与成长事件作文11篇
- 班级才艺展示活动话题的作文13篇
- 《信息检索与利用技巧:大学信息技术教学教案》
- 特种文献检索课件模板
- 知识管理与知识共享平台模板
- 医院“十五五”发展规划(2026-2030)
- 黑龙江学位英语考试试题及答案
- AI大模型驱动的智慧供应链ISC+IT蓝图规划设计方案
- (2025)语文单招考试试题与答案
- 儿童周期性呕吐综合征治疗指南
- 道观庙宇托管协议书
- 早期阿尔茨海默病疾病修饰治疗专家共识(2025年版)解读
- PHPstorm激活码2025年5月13日亲测有效
- 总包合同补充协议范本
- 儿童编发课件
- 商密网管理制度
评论
0/150
提交评论