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

my2003 2004-04-04 07:17:06
为什么有的子程序
编译器会在他的开始加上 比如:
push ebp
mov ebp , esp
push esi
(不一定每次编译都加上一样的)
而有的就不加呢?
...全文
37 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
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的不同调用方式。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

试试用AI创作助手写篇文章吧