窗口调用约定



嗨,一个朋友告诉我:

调用约定是 C++ 函数说明符,用于确定调用另一个函数的函数是否应清理堆栈帧,或者这是被调用函数的工作

这是真的吗?

还有清洁部分将如何 在程序集中查找调用另一个 syscall 函数的程序集?

提前谢谢。

从历史上看,Fortran 和 Pascal 语言使用一种约定,其中调用方将其参数推送到堆栈上(堆栈中的第一个参数(,然后调用被调用方函数。被调用方中的序言代码通常会弹出返回地址和参数,然后再次推送返回地址(这部分实际上是一个实现细节(。当被调用方返回时,堆栈是干净的。

然后,C 语言具有调用具有可变参数数量的函数的能力。约定是调用方按相反顺序推送参数(堆栈中的最后一个参数首先推送(,然后调用被调用方函数。然后,被调用方访问堆栈中的参数而不弹出任何内容(第一个参数的地址刚好靠近返回地址(。当被调用方返回时,堆栈仍包含参数,调用方应清理它们。

这仍然在Windows系统中使用,其中大多数API函数使用帕斯卡约定(winapi(,而默认情况下C或C++方法默认使用C(cdecl(约定。

最新更新