c ++使用裸功能

时间:2012-07-08 18:00:58

标签: c++ windows visual-c++ assembly x86

我正在尝试学习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;
}

2 个答案:

答案 0 :(得分:14)

Naked函数不包含任何编译器生成的序言和结尾代码。这也适用于函数末尾的隐式return语句。

这意味着您声明的函数最后没有ret指令。控件转移到asmfunc后,它永远不会返回。该函数继续执行该位置存在的任何代码,直到它遇到使其崩溃的内容。

基本上,asmfunc的原始实现在程序代码中间的某处作为标签。当你调用你的函数时,你实际上是在做一个goto asmfunc,即你将控制转移到某个地方而没有任何回报的希望。

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

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

您有责任将ret指令放入裸体功能中。

答案 1 :(得分:0)

c语言程序中的裸功能不包含准备执行任务的功能的序言和结尾代码。所以这是你的工作,以制作序言和结尾代码。在下面的代码中,您看到我定义了序言和结尾,您可以在那里定义汇编代码。

__declspec(naked) void NakedFunction() {
    __asm {
        push ebp
        mov ebp, esp
    }

    __asm {
        // write your code here
    }

    __asm {
        leave
        ret
    }
}

int main() {
    NakedFunction();

    return 0x0;
}