_declspec(naked) void asmfunc() { _asm { } } int _tmain(int argc,_TCHAR* argv[]) { i = 1; asmfunc(); cout << i << endl; // <-- crash system("pause"); return 0; }
这意味着您声明的函数最后没有ret指令.一旦控件转移到asmfunc,它就永远不会返回.该函数继续执行该位置存在的任何代码,直到它遇到使其崩溃的内容.
基本上,asmfunc的原始实现在程序代码中间的某处作为标签.当你调用你的函数时,你实际上是在做一个转到asmfunc,即你将控制转移到某个地方而没有任何回报的希望.
出于这个原因,最小的裸体功能应该看起来像
_declspec(naked) void asmfunc() { _asm { ret } }
您可以将ret指令放入裸功能中.