assembly - 调用可以是 cdecl 或 stdcall 的函数

标签 assembly x86 calling-convention stdcall cdecl

我需要编写调用外部函数的代码,该函数可以是 32 位 Windows 应用程序中的 stdcall 调用或 cdecl。
我的代码,调用者,无法提前知道它会是哪一个。 现在,如果我尝试从定义为 stdcall 的调用站点调用 cdecl 函数,我会看到一个 checkEsp 异常对话框,我猜这是有充分理由的。
有什么办法吗?

最佳答案

可以通过以下方式完成:

          mov     esi, esp

          push    arg3
          push    arg2
          push    arg1
          call    [SomeExternalProc]

          mov     esp, esi   ; now the stack is always properly cleaned 

外部过程将保留 esi。或者您可以使用外部过程保存的任何其他寄存器,甚至内存变量 - 本地或全局。

很好,参数的顺序对于 CDECL 和 STDCALL 是相同的——相反的顺序。 (最左边的 arg 在最低地址。)所以它们是兼容的,除了 ESP 指向返回的地方。两种约定都同意哪些寄存器是调用保留的,哪些是调用破坏的。

关于assembly - 调用可以是 cdecl 或 stdcall 的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17625790/

相关文章:

assembly - I386指令集中GRPL指令的作用是什么?

c++ - 未解析的外部符号 - 来自 C++ dll 的 LNK2019

c++ - std::function 如何知道调用约定?

linux - 尝试使用 scanf 存储两个数字,但程序崩溃

c - 如何将参数传递给函数,从 Assembly 到 C

c - ARM 上的高效复制,两个 16 位提取还是 1 个 32 位?

x86 - 在AVX-512加载和存储中使用掩码寄存器时,是否会由于对被掩码元素的无效访问而引发故障?

assembly - 为什么在 x86 汇编中 left 会执行 "mov esp,ebp"?

c - 微型 C 编译器 : "error: unknown opcode ' jmp'"

c - 在 C 中以相反的顺序传递参数有什么意义?