调用可以是cdecl或stdcall的函数

sho*_*osh 5 windows assembly 32-bit cdecl stdcall

我需要编写调用外部函数的代码,该函数可以是32位Windows应用程序中的stdcall调用或cdecl。
我的代码(调用者)无法事先知道将要使用的代码。现在,如果我尝试从定义为stdcall的调用站点中调用cdecl函数,则会出现一个checkEsp异常对话框,并且我猜那是有充分原因的。
有什么办法吗?

joh*_*und 4

可以通过以下方式完成:

          mov     esi, esp

          push    arg3
          push    arg2
          push    arg1
          call    [SomeExternalProc]

          mov     esp, esi   ; now the stack is always properly cleaned 
Run Code Online (Sandbox Code Playgroud)

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

很好,CDECL 和 STDCALL 的参数顺序是相同的 - 顺序相反。(最左边的 arg 位于最低地址。)因此,除了 ESP 返回时指向的位置之外,它们是兼容的。两个约定都同意哪些寄存器是调用保留的,哪些是调用破坏的。