c ++使用裸函数

我正在学习ASM,并想尝试一些与C ++结合的东西。 ASM部分是在裸露的function下完成的。 但是每当我调用函数(空),应用程序在下一个函数中崩溃。 我应该做什么赤裸的function,使其工作,我需要stream行ESP或东西? 一个例子可能是有用的。

_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的原始实现可以作为程序代码中间某处的标签。 而当你调用你的函数时,你实际上是在做一个goto asmfunc ,也就是说你将控制权转移到某个地方而没有任何回报的希望。

出于这个原因,一个最小的裸体功能应该看起来像

 _declspec(naked) void asmfunc() { _asm { ret } } 

ret指令放置在裸露的功能中是您的责任。