繁体   English   中英

编译器忽略__stdcall

[英]Compiler ignore __stdcall

在我看来,MSVS忽略了我的函数的__stdcall指令。 我正在手动清理堆栈,但编译器在每次CALL后仍会附加ADD ESP指令。

这是我声明函数的方式:

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 )和这会导致我的程序崩溃。 如果我用NOPs手动替换ADD指令,程序将按预期工作。 所以,我的问题是......有没有办法强制编译器停止添加这些指令?

谢谢。

问题在于: , ...)

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

__stdcall函数必须在最后从堆栈中删除所有堆栈参数,但它们无法预先知道它们将作为参数接收多少内容。

这同样适用于__fastcall函数。

具有可变参数个数的函数的唯一适用调用约定是__cdecl ,其中调用者必须在调用后删除堆栈参数。 这就是编译器使用尽管您使用__stdcall的请求所使用的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM