__stdcall是外平栈还是内平栈
时间: 2023-12-17 19:05:29 浏览: 39
__stdcall 不是外平栈或内平栈的概念,而是一种函数调用约定,用于指定函数如何被调用和返回结果。
在 __stdcall 约定下,函数参数从右往左依次入栈,被调用者负责清理栈空间,函数返回值放在 EAX 寄存器中。这种约定通常用于 Windows API 中的函数声明。
虽然 __stdcall 约定没有直接涉及到栈的细节,但是在实际编程中,使用 __stdcall 约定的函数通常会使用外平栈(也称为系统栈或运行时栈),将参数和返回地址等信息保存在调用者的栈空间中。在 Windows 平台下,外平栈是向下生长的,也就是说,栈指针的值随着栈的使用而减小。但是,这并不是 __stdcall 约定的必然要求,因为栈的使用方式可以根据具体的应用场景和编译器的实现而有所不同。
相关问题
__stdcall是外平栈和内平栈
__stdcall 和外平栈/内平栈是不同的概念。
__stdcall 只是一种函数调用约定,用于指定函数如何被调用和如何返回结果。它与外平栈和内平栈没有必然联系。在 __stdcall 约定下,函数参数从右往左依次入栈,被调用者负责清理栈空间,函数返回值放在 EAX 寄存器中。这种约定通常用于 Windows API 中的函数声明。
而外平栈和内平栈是关于栈的两个概念,与函数调用约定没有必然联系。外平栈是指在函数调用时,将函数参数和返回地址等保存在调用者的栈空间中的栈。在Windows平台下,外平栈是向下生长的,也就是说,栈指针的值随着栈的使用而减小。内平栈是指在函数内部使用的栈,通常是由程序员手动创建和维护的。在汇编语言中,可以使用esp寄存器来实现内平栈。内平栈通常用于保存本地变量和临时变量等信息。在Windows平台下,内平栈也是向下生长的。
因此,__stdcall 和外平栈/内平栈是不同的概念,它们之间没有必然联系。
__stdcall和__cdecl都是什么
__stdcall和__cdecl都是函数调用约定(calling convention),用于规定函数参数传递的方式和栈的清理方式。
__stdcall是一种标准的调用约定,它规定函数的参数从右向左依次入栈,由被调用函数负责清理栈。这种约定常用于Windows API中的函数,也是默认的约定。
__cdecl是另一种常见的调用约定,它规定函数的参数从右向左依次入栈,但由调用者负责清理栈。这种约定常用于C和C++语言中的普通函数。
在使用这两种调用约定时,需要保证函数的声明和定义一致,以避免参数传递或栈清理错误导致的问题。在Windows API中,通常会使用WINAPI宏来指定__stdcall调用约定。