嗨,一个朋友告诉我:
调用约定是 C++ 函数说明符,用于确定调用另一个函数的函数是否应清理堆栈帧,或者这是被调用函数的工作
这是真的吗?
还有清洁部分将如何 在程序集中查找调用另一个 syscall 函数的程序集?
提前谢谢。
从历史上看,Fortran 和 Pascal 语言使用一种约定,其中调用方将其参数推送到堆栈上(堆栈中的第一个参数(,然后调用被调用方函数。被调用方中的序言代码通常会弹出返回地址和参数,然后再次推送返回地址(这部分实际上是一个实现细节(。当被调用方返回时,堆栈是干净的。
然后,C 语言具有调用具有可变参数数量的函数的能力。约定是调用方按相反顺序推送参数(堆栈中的最后一个参数首先推送(,然后调用被调用方函数。然后,被调用方访问堆栈中的参数而不弹出任何内容(第一个参数的地址刚好靠近返回地址(。当被调用方返回时,堆栈仍包含参数,调用方应清理它们。
这仍然在Windows系统中使用,其中大多数API函数使用帕斯卡约定(winapi
(,而默认情况下C或C++方法默认使用C(cdecl
(约定。