Nasm-不弹出参数的Winapi函数

Nasm-不弹出参数的Winapi函数,winapi,assembly,x86,calling-convention,msvcrt,Winapi,Assembly,X86,Calling Convention,Msvcrt,我正在用Nasm编写一个程序,我发现像CreateProcessA或GetModuleFileNameA这样的winapi函数在完成后会从堆栈中弹出参数,printf并没有这样做 这有什么原因吗?更重要的是:是否有其他winapi函数不从堆栈中弹出元素?因为我的程序运行不正常,我想确定这一切都不是由非弹出值引起的。99%的导出Windows函数使用了。在32位x86上,这会创建更小、更高效的代码,因为被调用方会恢复堆栈 具有可变数量参数的函数不能使用stdcall,因为只有调用者知道有多少参数,

我正在用Nasm编写一个程序,我发现像
CreateProcessA
GetModuleFileNameA
这样的winapi函数在完成后会从堆栈中弹出参数,
printf
并没有这样做


这有什么原因吗?更重要的是:是否有其他winapi函数不从堆栈中弹出元素?因为我的程序运行不正常,我想确定这一切都不是由非弹出值引起的。

99%的导出Windows函数使用了。在32位x86上,这会创建更小、更高效的代码,因为被调用方会恢复堆栈

具有可变数量参数的函数不能使用stdcall,因为只有调用者知道有多少参数,因此调用者必须恢复堆栈


printf
不是Windows函数,它是一个C库函数,大多数C库使用调用方还原堆栈的函数。Windows提供的打印功能也包括cdecl。您可以假设任何以
..
作为最终参数结尾的API函数都使用cdecl。

99%的导出Windows函数使用cdecl。在32位x86上,这会创建更小、更高效的代码,因为被调用方会恢复堆栈

具有可变数量参数的函数不能使用stdcall,因为只有调用者知道有多少参数,因此调用者必须恢复堆栈


printf
不是Windows函数,它是一个C库函数,大多数C库使用调用方还原堆栈的函数。Windows提供的打印功能也包括cdecl。您可以假设任何以
..
结尾作为最终参数的API函数都使用cdecl。

假设为32位代码-因为
printf
不是WinApi的一部分(它使用STDCALL调用约定,函数在其中清除堆栈上的参数)
printf
它是MSVC runttime库的一部分,默认调用约定基本上是CDECL。如果您正在调用C库函数或调用由MSVC/C++生成的代码,则需要CDECL调用约定,如下所述:。其他信息如下:假设32位代码-因为
printf
不是WinApi的一部分(它使用STDCALL调用约定,函数在其中清除堆栈上的参数)
printf
它是MSVC runttime库的一部分,默认调用约定基本上是CDECL。如果您正在调用C库函数或调用由MSVC/C++生成的代码,则需要CDECL调用约定,如下所述:。其他信息如下:“您可以假设任何以
..
作为最终参数结尾的API函数都使用cdecl”-并且您可以假设任何Win32 API函数都使用
stdcall
,除非另有说明。“您可以假设任何以
..
作为最终参数结尾的API函数都使用cdecl”-您可以假设任何Win32 API函数都使用
stdcall
,除非另有说明。