首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

最后从栈弹出的是啥?解决办法

2012-02-24 
最后从栈弹出的是啥?标准C++编程宝典第143页:...最后进栈的是调用者的返回地址...当被调用者准备返回时,系

最后从栈弹出的是啥?
标准C++编程宝典第143页:
...
最后进栈的是调用者的返回地址
...
当被调用者准备返回时,系统弹出栈中所有的自变量,这时栈指针移动到了被调用者刚开始执行时的位置。接着,被调用者返回,系统从栈中弹出返回地址,调用者就可以继续执行了。
...
栈是先入后出的数据结构,听上面的话好象不对啊。听上面的话,好象是返回地址是后弹出的。

[解决办法]
听说过c call和pascal call 这2种模式没有?
[解决办法]
最后进栈的是调用者的返回地址 

这里的意思估计是进入函数体前,函数调用前把参数和返回地址压入栈中,

调用函数后把寄存器内容压入栈中

调用结束后弹出返回地址和参数
[解决办法]
1、__stdcall调用约定相当于16位动态库中经常使用的PASCAL调用约定。在32位的VC++5.0中PASCAL调用约定不再被支持(实际上它已被定义为__stdcall。除了__pascal 外,__fortran和__syscall也不被支持),取而代之的是__stdcall调用约定。两者实质上是一致的,即函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,但不同的是函数名的修饰部分(关于函数名的修饰部分在后面将详细说明)。
_stdcall是Pascal程序的缺省调用方式,通常用于Win32 Api中,函数采用从右到左的 压栈方式,自己在退出时清空堆栈。VC将函数编译后会在函数名前面加上下划线前缀,在函数名后加上"@"和参数的字节数。
2、C调用约定(即用__cdecl关键字说明)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数的函数只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。
_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。是MFC缺省调用约定。

热点排行