我在用Nasm编写程序时发现,虽然winapi函数完成后会从堆栈中弹出CreateProcessA
或GetModuleFileNameA
弹出参数,但并printf
没有这样做。
有什么理由吗?而且更重要的是:还有其他不从堆栈弹出元素的winapi函数吗?因为我的程序行为异常,所以我想确保所有程序都不是由未弹出的值引起的。
99%的导出的Windows函数使用stdcall调用约定。在32位x86上,这会创建更小的更有效的代码,因为被调用者将还原堆栈。
带有可变数量参数的函数不能使用stdcall,因为只有调用者才能知道有多少个参数,因此调用者必须还原堆栈。
printf
不是Windows函数,它是C库函数,大多数C库使用cdecl调用约定,在该约定中,调用方将恢复堆栈。Windows提供的打印功能,例如wsprintf
cdecl。您可以假定任何...
以final 结尾的API函数都使用cdecl。