在C/C++直接插入汇编代码的方法-内联汇编

简介: 在C/C++直接插入汇编代码的方法-内联汇编

🍃方法总结


在c语言直接插入汇编


C/C++中内嵌汇编(Visual Studio 2019)


案例1


#include <stdio.h>
int main()
{
  int a = 0, b = 0, c = 0;
  __asm
  {
  /*push eax s*/
  mov a, 1000
  mov b, 200
  mov c, 1
  /*mov eax, a
  add eax, b
  sub eax, c
  mov a, eax */
  /*pop eax*/
  }
  /*__asm mov a,1000*/
  printf("a=%d\nb=%d\nc=%d\n", a, b, c);
  return 0;
}


案例2-内联汇编


内联汇编示例:

Hello, World为例:

#include
#include
const char *s1="Hello, World\n",*s2="pause";
int main(){
 printf(s1);
 system(s2);
 return 0;
}


内联汇编版本:

#include <stdio.h>
#include<Windows.h>
const char* s1 = "Hello, World\n", * s2 = "pause";
int main() {
  __asm {
  mov eax, dword ptr[s1]
  push eax
  call dword ptr[printf]
  add esp, 4
  mov eax, dword ptr[s2]
  push eax
  call dword ptr[system]
  add esp, 4
  }
  return 0;
}


内联汇编A+B

1668323726393.jpg

1668323739033.jpg

#include <stdio.h>
#include<Windows.h>
const char *s1="%d%d",*s2="%d\n",*s3="pause";
int a,b;
int main(){
 __asm{
 lea eax,[b]
 push eax
 lea eax,[a]
 push eax
 mov eax,dword ptr [s1]
 push eax
 call dword ptr [scanf]
 add esp,12
 mov eax,[a]
 add eax,[b]
 push eax
 mov eax,dword ptr [s2]
 push eax
 call dword ptr [printf]
 add esp,8
 mov eax,dword ptr [s3]
 push eax
 call dword ptr [system]
 add esp,4
 }
 return 0;
}


基础讲解


因为在Visual C++中使用内联汇编不需要额外的编译器和联接器,且可以处理Visual

C++中不能处理的一些事情,同时可以使用在C/C++中的变量,所以非常方便。


内联汇编代码不易于移植,如果你的程序打算在不同类型的机器(比如x86和Alpha)上运行,应当尽量避免使用内联汇编,这时可以使用MASM,因为MASM支持更方便的宏指令和数据指示符。


__asm语法


__asm关键字用来调用内联汇编,可以出现在任何合法的C或C++声明中。它不能单独出现,后面必须有汇编指令,可以是一条汇编指令、大括号括起来的一组代码,或者至少是大括号括起来的空代码。术语“__asm块”指的是任何单独的一条指令或一组指令,可以不包括在大括号里。


第一种语法格式:


__asm 汇编指令


第二种语法格式:


__asm { 汇编指令列表 }


例如,下面的代码是一个简单的大括号里的__asm块:


__asm {   mov al, 4   mov dx, 0xB008   out dx, al }


另外,在每一条汇编指令前加上__asm,与前面的方法是一样的作用。例如:


__asm mov al, 4
__asm mov dx, 0xB0008
__asm out dx, al

上面的两个例子所生成的代码是相同的,但是在括号里的__asm块这种方式更具优势,因为大括号可以使汇编指令很清楚地和C或C++代码分开,避免了无意义的__asm关键字重复。另外,大括号还可以避免引起歧义。如果想把C或C++代码和__asm块放在同一行,则必须把这个__asm块放在括号里。如果没有括号,编译器就不能确定汇编代码结束和C或C++代码起始的位置。


另外,由于大括号里的语句和一般的MASM语句格式一样,所以可以很方便地从现有的MASM源程序里复制。


不像C或C++中的"{}",__asm块中的"{}"不会影响C或C++变量的作用范围。同时,__asm块可以嵌套,嵌套也不会影响变量的作用范围。


转载于:https://www.cnblogs.com/smart-zihan/p/11315436.html


目录
打赏
0
0
0
0
5
分享
相关文章
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
65 25
为什么C/C++编译腰要先完成汇编
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
4月前
|
提高C/C++代码的可读性
提高C/C++代码的可读性
119 4
|
5月前
|
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
779 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
71 6
|
6月前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
6月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。