【问题标题】:Nasm - Winapi functions that do not pop their parametersNasm - 不弹出参数的 Winapi 函数
【发布时间】:2019-09-18 23:24:36
【问题描述】:

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

这是有原因的吗?更重要的是:还有其他不会从堆栈中弹出元素的 winapi 函数吗?因为我的程序行为不端,我想确保它不是由未弹出的值引起的。

【问题讨论】:

  • 假设 32 位代码 - 因为 printf 不是 WinApi 的一部分(它使用 STDCALL 调用约定,该函数会清除堆栈上的参数)。 printf 它是 MSVC 运行时库的一部分,默认调用约定是 CDECL @ .附加信息在这里:en.wikipedia.org/wiki/X86_calling_conventions#cdecl

标签: winapi assembly x86 calling-convention msvcrt


【解决方案1】:

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

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

printf 不是 Windows 函数,它是 C 库函数,大多数 C 库使用 cdecl calling convention,调用者在其中恢复堆栈。 Windows 提供的打印函数如wsprintf 也是 cdecl。您可以假设任何以... 作为最终参数结尾的API 函数都使用cdecl。

【讨论】:

  • "您可以假设任何以... 结尾作为最终参数的 API 函数都使用 cdecl" - 您可以假设任何 Win32 API 函数都使用 stdcall,除非另有记录。
猜你喜欢
  • 2020-12-09
  • 2020-07-04
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多