为什么有的子程序,VC6编译器会在他的开始加上一些。。。。
为什么有的子程序
编译器会在他的开始加上 比如:
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




