par*_*ara 6 c++ windows x86 assembly visual-c++
我正在尝试学习ASM,并希望尝试一些与C++相结合的东西.ASM部分是在裸功能中完成的.但每当我调用该函数(空)时,应用程序在下一个函数中崩溃.我应该在裸体功能中做些什么来使它工作,我需要弹出esp或者其他东西吗?一个例子可能是有帮助的.
_declspec(naked) void asmfunc()
{
_asm
{
}
}
int _tmain(int argc, _TCHAR* argv[])
{
i = 1;
asmfunc();
cout << i << endl; // <-- crash
system("pause");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
AnT*_*AnT 15
裸函数不包含任何编译器生成的序言和结尾代码.这也适用于函数末尾的隐式return语句.
这意味着您声明的函数ret最后没有指令.一旦控制转移到asmfunc,它就永远不会返回.该函数继续执行该位置存在的任何代码,直到它遇到使其崩溃的内容.
基本上,您的原始实现asmfunc在程序代码中间的某处作为标签工作.当你调用你的函数时,你实际上是在做一个goto asmfunc,即你在某个地方转移控制而没有任何回报的希望.
出于这个原因,最小的裸体功能应该看起来像
_declspec(naked) void asmfunc()
{
_asm
{
ret
}
}
Run Code Online (Sandbox Code Playgroud)
您有责任将ret指令放入裸体功能中.