目录
频道首页
内联汇编(一)——内联汇编之32位程序
收藏
0
YUNZAI 最近修改于 2023-05-04 10:34:55

背景

内联汇编是指在 C/C++ 代码中嵌入的汇编代码,与全部是汇编的汇编源文件不同,它们被嵌入到 C/C++ 的大环境中。内联汇编方式两个作用,一是程序的某些关键代码直接用汇编语言编写,可提高代码的执行效率;二是有些操作无法通过高级语言实现,或者实现起来很困难,必须借助汇编语言达到目的。

32 位程序和 64 位程序下使用内联汇编的方式,有很大的差别。现在,我们对此分别进行介绍。本篇文章主要介绍的是在 32 位程序中使用内联汇编。

实现过程

使用内联汇编要用到 __asm 关键字,它可以出现在任何允许 C/C++ 语句出现的地方。对 __asm 关键字的使用有两种方式:

  1. __asm 块,要添加大括号。

    __asm
    {
      // 汇编代码
    }
    
  2. __asm 语句,在每条汇编指令之前加 __asm 关键字。

    __asm // 汇编代码
    

显然,第一种方法与 C/C++ 的风格很一致,并且把汇编代码和 C/C++ 代码清楚地分开,还避免了重复输入 __asm 关键字,因此推荐使用第一种方法。

不像在 C/C++ 中的“{ }”,__asm 块的“{ }”不会影响 C/C++ 变量的作用范围。同时,__asm 块可以嵌套,而且嵌套也不会影响变量的作用范围。

为了与低版本的 Visual C++ 兼容,_asm 和 __asm 具有相同的意义。另外,Visual C++ 支持标准 C++ 的 asm 关键字,但是它不会生成任何指令,它的作用仅限于使编译器不会出现编译错误。要使用内联汇编,必须使用 __asm 而不是 asm 关键字。

编码实现

void MyFunc(char *pszText)
{
    printf("%s\n", pszText);
}
​
int _tmain(int argc, _TCHAR* argv[])
{
    char str1[] = "__asm{ }";
    char str2[] = "__asm";
    // 32位程序内联汇编 第一种方式
    __asm
    {
        lea     eax, str1
            push    eax
            mov     eax, MyFunc
            call    eax
    }
    // 32位程序内联汇编 第二种方式
    __asm lea   eax, str2
    __asm push  eax
    __asm mov   eax, MyFunc
    __asm call  eax
​
    system("pause");
    return 0;
}

程序测试

我们直接运行程序,程序成功显示两行字符串,说明两种方式的内联汇编均使用成功。

总结

在 32 位程序中使用内联汇编比较方便,就两种形式,一种是有大括号的:

__asm
{
  // 汇编代码
}

另一种是没有大括号的:

__asm // 汇编代码

这两种方式是等价的,大家可以根据自己的程序需要,自行选择使用哪种方式即可。

内容大纲
批注笔记
内联汇编(一)——内联汇编之32位程序
ArticleBot
z
z
z
z
主页
会议室
Git管理
文章
看板
留言墙