导航
  • 主页
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

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

my2003 2004-04-04 07:17:06
为什么有的子程序
编译器会在他的开始加上 比如:
push ebp
mov ebp , esp
push esi
(不一定每次编译都加上一样的)
而有的就不加呢?
...全文
4 点赞 收藏 5
写回复
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
showjancn 2004-04-05
Push这是压栈操作,所有子程序调用都会有这个操作过程,而在在操作完之后,还必须有相应Pop弹栈操作.要是在子程序中还调用了子程序,那么还得push,pop,当然这是典的栈操作,后压先弹。最先压的最后弹。这样就确保了,我们常说的名命空间或是可视域了的问题了,即pop之后就什么都没有了,当然操作完之后还得"retf"返回程序指针。
一般在汇编里面是先把函数参数压栈,再压局部变最。当然压栈的时还会把当前的CPU的“SR”和“PC”寄存器中的值也压入栈中,用以保存“现场”,当弹栈后即“retf”后,CPU又会读回刚才压入的“SR”和“PC”。即又回到主程序上来。
回复
hanzp 2004-04-04
局部变量是放在栈里的,
push ebp
mov ebp , esp
先保存原来栈地址,等退出的时候在恢复
不过应该还有这样的代码
add ebp, 你的变量所占字节数
有吗
回复
my2003 2004-04-04
我试验了
好像不是这个样子
如果子程序内容很少的话,就不会加上
push ebp
mov ebp , esp
如果子程序稍微复杂一点(用几个变量)
就会加上
push ebp
mov ebp , esp

好像跟调用方式无关

回复
uoyevoli 2004-04-04
对,和调用方式有关,其实是C++编译器替我们做了这些
如果我们用汇编来写,这些都是必不可少的。
回复
enoloo 2004-04-04
不是很懂。好象是_stdcall 和 _cdecl的不同调用方式。
回复
发动态
发帖子
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……