IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 在C/C++直接插入汇编代码的方法-内联汇编 -> 正文阅读

[C++知识库]在C/C++直接插入汇编代码的方法-内联汇编

🍃博主昵称:一拳必胜客
博主主页面链接:博主主页传送门
博主专栏页面连接:专栏传送门–计算机考研
🍑创作初心:本博客的初心是每天分享记录自己学习的脚步,和各位技术友探讨交流,同时给同样感兴趣的朋友以参考;
博主研究方向:渗透测试、嵌入式、机器学习;
🌸博主寄语:感谢各位技术友的支持,您的支持就是我前进的动力 ;
‘’
 特别鸣谢:木芯工作室
特别鸣谢:木芯工作室 、Ivan from Russia



🍃方法总结

在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-内联汇编

  1. 内联汇编示例:
    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

这里是引用
在这里插入图片描述

#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支持更方便的宏指令和数据指示符。

  1. __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

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-10-31 11:35:34  更:2022-10-31 11:40:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 6:00:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码