在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月前
|
API C++ Windows
Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法
本文介绍Visual C++运行库、.NET Framework和DirectX运行库的作用及常见问题解决方案,涵盖MSVCP140.dll丢失、0xc000007b错误等典型故障的修复方法,提供官方下载链接与系统修复工具使用指南。
477 2
|
2月前
|
存储 缓存 监控
用 C++ 红黑树给公司电脑监控软件的日志快速排序的方法
本文介绍基于C++红黑树算法实现公司监控电脑软件的日志高效管理,利用其自平衡特性提升日志排序、检索与动态更新效率,并结合实际场景提出优化方向,增强系统性能与稳定性。
117 4
|
2月前
|
C++ Windows
应用程序无法正常启动(0xc0000005)?C++报错0xC0000005如何解决?使命召唤17频频出现闪退,错误代码0xC0000005(0x0)
简介: 本文介绍了Windows应用程序出现错误代码0xc0000005的解决方法,该错误多由C++运行库配置不一致或内存访问越界引起。提供包括统一运行库配置、调试排查及安装Visual C++运行库等解决方案,并附有修复工具下载链接。
1104 1
|
9月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
4月前
|
API 数据安全/隐私保护 C++
永久修改机器码工具, exe一机一码破解工具,软件机器码一键修改工具【c++代码】
程序实现了完整的机器码修改功能,包含进程查找、内存扫描、模式匹配和修改操作。代码使用
|
5月前
|
C++
爱心代码 C++
这段C++代码使用EasyX图形库生成动态爱心图案。程序通过数学公式绘制爱心形状,并以帧动画形式呈现渐变效果。运行时需安装EasyX库,教程链接:http://【EasyX图形库的安装和使用】https://www.bilibili.com/video/BV1Xv4y1p7z1。代码中定义了屏幕尺寸、颜色数组等参数,利用随机数与数学函数生成动态点位,模拟爱心扩散与收缩动画,最终实现流畅的视觉效果。
842 0
|
10月前
|
自然语言处理 编译器 C语言
为什么C/C++编译腰要先完成汇编
C/C++ 编译过程中先生成汇编语言是历史、技术和实践的共同选择。历史上,汇编语言作为成熟的中间表示方式,简化了工具链;技术上,分阶段编译更高效,汇编便于调试和移植;实践中,保留汇编阶段降低了复杂度,增强了可移植性和优化能力。即使在现代编译器中,汇编仍作为重要桥梁,帮助开发者更好地理解和优化代码。
199 25
为什么C/C++编译腰要先完成汇编
|
算法 安全 C++
提高C/C++代码的可读性
提高C/C++代码的可读性
264 4
|
Linux C语言 C++
vsCode远程执行c和c++代码并操控linux服务器完整教程
这篇文章提供了一个完整的教程,介绍如何在Visual Studio Code中配置和使用插件来远程执行C和C++代码,并操控Linux服务器,包括安装VSCode、安装插件、配置插件、配置编译工具、升级glibc和编写代码进行调试的步骤。
2499 0
vsCode远程执行c和c++代码并操控linux服务器完整教程
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
1027 2