在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


相关文章
|
1天前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
36 25
为什么C/C++编译腰要先完成汇编
|
4月前
|
网络协议 C++
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
解决MASM32代码汇编出错: error A2181: initializer must be a string or single item
|
2月前
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
77 4
|
3月前
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
564 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
4月前
|
编译器 API C语言
超级好用的C++实用库之跨平台实用方法
超级好用的C++实用库之跨平台实用方法
59 6
|
4月前
|
C++
2合1,整合C++类(Class)代码转换为MASM32代码的平台
2合1,整合C++类(Class)代码转换为MASM32代码的平台
|
4月前
|
C++
继续更新完善:C++ 结构体代码转MASM32代码
继续更新完善:C++ 结构体代码转MASM32代码
|
4月前
|
C++ Windows
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
HTML+JavaScript构建C++类代码一键转换MASM32代码平台
|
4月前
|
前端开发 C++ Windows
C++生成QML代码与QML里面集成QWidget
这篇文章介绍了如何在C++中生成QML代码,以及如何在QML中集成QWidget,包括使用Qt Widgets嵌入到QML界面中的技术示例。
|
15天前
|
C++ 芯片
【C++面向对象——类与对象】Computer类(头歌实践教学平台习题)【合集】
声明一个简单的Computer类,含有数据成员芯片(cpu)、内存(ram)、光驱(cdrom)等等,以及两个公有成员函数run、stop。只能在类的内部访问。这是一种数据隐藏的机制,用于保护类的数据不被外部随意修改。根据提示,在右侧编辑器补充代码,平台会对你编写的代码进行测试。成员可以在派生类(继承该类的子类)中访问。成员,在类的外部不能直接访问。可以在类的外部直接访问。为了完成本关任务,你需要掌握。
56 19