我需要编写调用外部函数的代码,该函数可以是 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/