3

在我看来,MSVS 忽略了我函数上的 __stdcall 指令。我正在手动清理堆栈,但编译器仍然ADD ESP在每个CALL.

这就是我声明函数的方式:

extern "C" void * __stdcall core_call(int addr, ...);
#define function(...) (DWORD WINAPI) core_call(12345, __VA_ARGS__)
return function("Hello", 789);

这就是输出的样子:( 来源:server4u.cz在此处输入图像描述

我用箭头标记了冗余ADD指令,MSVS 在每次调用后自动附加,尽管事实上,清理堆栈是被调用者的责任(参考:http ://en.wikipedia.org/wiki/X86_calling_conventions#List_of_x86_calling_conventions )和这个导致我的程序崩溃。如果我用 手动替换ADD说明NOPs,程序将按预期工作。所以,我的问题是......有没有办法强制编译器停止添加这些指令?

谢谢。

4

1 回答 1

5

问题出在这里:, ...)

具有可变数量参数的函数不能是__stdcall.

__stdcall函数必须在最后从堆栈中删除所有堆栈参数,但它们无法提前知道它们将接收多少作为参数的东西。

函数也是如此__fastcall

对于具有可变数量参数的函数,唯一适用的调用约定是__cdecl,调用者必须在调用后删除堆栈参数。尽管您要求使用__stdcall.

于 2012-08-06T19:10:10.400 回答