CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

为什么有的子程序,VC6编译器会在他的开始加上一些。。。。

楼主my2003(恩,不错)2004-04-04 19:17:06 在 VC/MFC / 基础类 提问

为什么有的子程序  
  编译器会在他的开始加上   比如:  
  push   ebp  
  mov   ebp   ,   esp  
  push   esi  
  (不一定每次编译都加上一样的)  
  而有的就不加呢? 问题点数:20、回复次数:5Top

1 楼enoloo(在水一方)回复于 2004-04-04 19:43:39 得分 2

不是很懂。好象是_stdcall   和   _cdecl的不同调用方式。Top

2 楼uoyevoli(爱什么呢?www.FARPROC.com)回复于 2004-04-04 19:59:45 得分 2

对,和调用方式有关,其实是C++编译器替我们做了这些  
  如果我们用汇编来写,这些都是必不可少的。Top

3 楼my2003(恩,不错)回复于 2004-04-04 20:08:07 得分 0

我试验了  
  好像不是这个样子  
  如果子程序内容很少的话,就不会加上  
  push   ebp  
  mov   ebp   ,   esp  
  如果子程序稍微复杂一点(用几个变量)  
  就会加上  
  push   ebp  
  mov   ebp   ,   esp  
   
  好像跟调用方式无关  
   
  Top

4 楼hanzp(木瓜.COM)回复于 2004-04-04 22:45:00 得分 8

局部变量是放在栈里的,  
  push   ebp  
  mov   ebp   ,   esp  
  先保存原来栈地址,等退出的时候在恢复  
  不过应该还有这样的代码  
  add   ebp,   你的变量所占字节数  
  有吗  
  Top

5 楼showjancn(难得一剑)回复于 2004-04-05 11:56:18 得分 8

Push这是压栈操作,所有子程序调用都会有这个操作过程,而在在操作完之后,还必须有相应Pop弹栈操作.要是在子程序中还调用了子程序,那么还得push,pop,当然这是典的栈操作,后压先弹。最先压的最后弹。这样就确保了,我们常说的名命空间或是可视域了的问题了,即pop之后就什么都没有了,当然操作完之后还得"retf"返回程序指针。  
  一般在汇编里面是先把函数参数压栈,再压局部变最。当然压栈的时还会把当前的CPU的“SR”和“PC”寄存器中的值也压入栈中,用以保存“现场”,当弹栈后即“retf”后,CPU又会读回刚才压入的“SR”和“PC”。即又回到主程序上来。Top

相关问题

  • vc++编译器的问题
  • VC编译器的问题
  • VC++6.0编译器问题.......
  • vc编译器死机
  • VC编译器的提问
  • VC++的例子程序在哪下?
  • 求 求光流 的VC例子程序。
  • VC的编译器是哪个啊?
  • 关于VC编译器的问题~~~
  • VC编译器有问题吗?

关键词

  • 编译器
  • 子程序
  • 调用
  • 加上
  • 操作
  • push ebpmov ebp
  • esp
  • pop
  • 方式

得分解答快速导航

  • 帖主:my2003
  • enoloo
  • uoyevoli
  • hanzp
  • showjancn

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo