C++ 使用裸函数

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

我正在尝试学习 ASM,并想结合 C++ 尝试一些东西。 ASM 部分是在裸函数中完成的。但是每当我调用函数(空)时,应用程序就会在下一个函数中崩溃。我应该在 naked 函数中做什么才能使其工作,我需要 pop 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 的原始实现作为程序代码中间某处的标签。当您调用您的函数时,您实际上是在执行 goto asmfunc,即您将控制权转移到某处而没有返回的希望。

因此,最小的裸函数应该看起来像

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

ret 指令放入裸函数是您的责任。

关于C++ 使用裸函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11385369/

相关文章:

visual-studio - 获取默认浏览器

c++ - OpenCl 不能使用 clGetPlatformIDs

c++ - MSVC++ 限制关键字和局部变量

C++ : Different deduction of type auto between const int * and cont int &

c++ - "if" "elseif" "else"语句有哪些好的做法

c++ - 全局运算符和多态性

windows - Windows PATH 上的批处理字符串搜索

windows - 将 mongodb 作为 Windows 服务运行

c++ - 将元组传递给函数并让它返回数字列表的最佳方法?

windows - 从 WP7 获取 live id