内联汇编之32位程序

sohot

发布日期: 2019-01-03 10:50:01 浏览量: 855
评分:
star star star star star star star star star star
*转载请注明来自write-bug.com

背景

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

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

实现过程

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

  • __asm 块,要添加大括号

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

    1. __asm // 汇编代码

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

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

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

编码实现

  1. void MyFunc(char *pszText)
  2. {
  3. printf("%s\n", pszText);
  4. }
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7. char str1[] = "__asm{ }";
  8. char str2[] = "__asm";
  9. // 32位程序内联汇编 第一种方式
  10. __asm
  11. {
  12. lea eax, str1
  13. push eax
  14. mov eax, MyFunc
  15. call eax
  16. }
  17. // 32位程序内联汇编 第二种方式
  18. __asm lea eax, str2
  19. __asm push eax
  20. __asm mov eax, MyFunc
  21. __asm call eax
  22. system("pause");
  23. return 0;
  24. }

程序测试

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

总结

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

  1. __asm
  2. {
  3. // 汇编代码
  4. }

另一种是没有大括号的:

  1. __asm // 汇编代码

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

参考

参考自《Windows黑客编程技术详解》一书

上传的附件 cloud_download ASM_32_Test.7z ( 143.02kb, 2次下载 )

发送私信

我想要你幸福,但我希望我是你幸福的原因

15
文章数
11
评论数
最近文章
eject