我正在尝试学习 ASM,并想结合 C++ 尝试一些东西。 ASM 部分是在裸函数中完成的。但是每当我调用函数(空)时,应用程序就会在下一个函数中崩溃。我应该在 naked 函数中做什么才能使其工作,我需要 pop esp 还是什么?一个例子可能会有帮助。
_declspec(naked) void asmfunc()
{
_asm
{
}
}
int _tmain(int argc, _TCHAR* argv[])
{
i = 1;
asmfunc();
cout << i << endl; // <-- crash
system("pause");
return 0;
}
最佳答案
裸函数将不包含任何编译器生成的序言和结尾代码。这也适用于函数末尾的隐式 return 语句。
这意味着你声明的函数最后没有ret
指令。一旦控制权转移到 asmfunc
,它就永远不会返回。该函数会继续执行该位置存在的任何代码,直到遇到导致其崩溃的问题。
基本上,asmfunc
的原始实现作为程序代码中间某处的标签。当您调用您的函数时,您实际上是在执行 goto asmfunc
,即您将控制权转移到某处而没有返回的希望。
因此,最小的裸函数应该看起来像
_declspec(naked) void asmfunc()
{
_asm
{
ret
}
}
将 ret
指令放入裸函数是您的责任。
关于C++ 使用裸函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385369/