c使用裸功能

前端之家收集整理的这篇文章主要介绍了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;
}

解决方法

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

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

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

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

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

您可以将ret指令放入裸功能中.

猜你在找的C&C++相关文章