C语言内联汇编(详细)介绍附实例快速掌握

目录

    • 一、简介
    • 二、具体介绍
    • 三、实例讲解
      • 3.1 实例一:基本使用
      • 3.2 实例二:使用占位符
    • 四、其他相关链接
      • 1、ARM全汇编指令总结
      • 2、gcc编译流程、参数实例详细(总结)
      • 3、c语言gcc编译常见报错及解决方法整理

一、简介

使用内联汇编主要目的是为了提高效率,同时还是为了实现 C 语言无法实现的部分。
GUN内联汇编的基本格式:

asm("汇编语句": 输出部分: 输入部分: 会被修改的部分);

ANSI C规范的关键字(前后都有两个下划线连接,中间没有空格) :
asm volatile(“汇编语句”
: 输出部分
: 输入部分
: 会被修改的部分);

二、具体介绍

各部分使用“:”格开,汇编语句必不可少,其他三部分可选,如果使用了后面的部分,而前面部分为空,也需要用“:”格开,相应部分内容为空。例如:

__asm__ __volatile__("asm code":output :input :changed)

第一部分是汇编语句,其中 “asm” 是内联汇编语句关键词。

"汇编语句"是你写汇编指令的地方,其格式和汇编语言程序中使用的基本相同。这一部分是必须要有的。后面带冒号的行若不使用就都可以省略。语句之间使用“;”、“\n” 或 “\n\t” 分开。

在汇编语句中,数字加前缀 %,如 %0、%1 等,表示需要使用寄存器的样板操作数。可以使用的此类操作数的总数取决于 CPU 中通用寄存器的数量。由于这些样板操作数也是用%前缀,因此,在涉及到具体的寄存器时就要在寄存器前面加上2个%,以免混淆。

“输出部分”表示当这段嵌入汇编执行完之后,对输出变量的规定,也即是目标操作数如何结合的约束条件。每个这样的条件成为一个“约束”。必要时“输出部分”可以有多个约束,互相以逗号分隔。每个输出约束以“=” 号开头,然后是一个字母表示对操作数类型的说明,然后是关于变量结合的约束。

“输入部分”表示在开始执行汇编代码时,这里指定的一些寄存器中应存放的输入值,它们也分别对应着一 C 变量或常数值。输入约束的格式和输出约束相似,但不带“=”号。当“输出部分”为空,也即没有输出约束时,若有输入约束存在,则必须保留分隔标记 “:” 号。

“会被修改的部分”表示你已对其中列出的寄存器中的值进行了改动,gcc 编译器不能再依赖于它原来对这些寄存器加载的值。如果必要的话,gcc 需要重新加载这些寄存器。因此我们需要把那些没有在输出/输入寄存器中的部分列出,但是在汇编语句中明确使用到或隐含使用到的寄存器明列在这个部分。

操作数的编号从输出部分的第一个约束(序号为0)开始,顺序数下来,每个约束计数一次。在“汇编语句”中引用这些操作数或分配这些操作数的寄存器时,就在序号前面加上一个 “%” 号。
表示约束条件的字母有很多。主要有:

字母约束条件
“m”, “v” 和“o”表示内存单元
“r”表示任何寄存器
“q”表示寄存器 eax、ebx、ecx、edx之一
“i” 和 “h”表示直接操作数
“E” 和 “F”表示浮点数
“g”表示“任意”
“a”,“b”,“c”,“d”分别表示要求使用寄存器 eax、ebx、ecx或edx
“S”, “D”分别表示要求使用寄存器 esi 或 edi
“I”表示常数(0至31)

三、实例讲解

3.1 实例一:基本使用

__asm__ __volatile__("movl %1,%0" : "=r" (result) : "m" (input));

asm 表示后面的代码为内嵌汇编,asm 是 asm 的别名。
volatile 表示编译器不要优化代码,后面的指令保留原样,volatile 是它的别名。
movl %1,%0是指令模板,%0和%1代表指令的操作数,称为占位符,内嵌汇编靠它们将C 语言表达式与指令操作数相对应,他们按照出现的顺序分别与指令操作数 %0 、%1 对应(先依次排完输出的操作数,再依次排输入操作数)。
指令模板后面用小括号括起来的是 C 语言表达式,本例中只有两个:result和input

3.2 实例二:使用占位符

int a = 100,b= 200;
int result;
__asm__
__volatile__("mov %0,%3\n\t"			//%0代表result,%3代表123,汇编器自动加#号"ldr r0,%1\n\t”			//%1代表a的地址"ldr r0,%2\n\t”			//%2代表b的地址"str r0,%2\n\t"			//是地址所以只能用ldr或str指令: "=r"(result),"+m"(a),"+m"(b) //*out1 是%0,out2是%1,..,outN:"i"(123)				//in1是%N,in2是%N+1,...);

四、其他相关链接

1、ARM全汇编指令总结

2、gcc编译流程、参数实例详细(总结)

3、c语言gcc编译常见报错及解决方法整理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/92856.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--双链表

今天我们来用数组来模拟双链表 为什么要数组模拟呢? 因为用数组模拟的双链表,运行速度更快,做算法题更加舒服 用数组模拟双链表的内容 1、同样也有首尾结点 2、相邻的两个节点是相互指向的 3、可以看成两个方向相反的单链表相互连接在一起 …

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用: 一…

Mysql分库分表

1.原理 2.Sharding JDBC 官网https://shardingsphere.apache.org/ 2.1 水平拆分 创建一个新的springboot项目 导入依赖,直接将原本的dependencies给覆盖掉 <dependencies><!-- ShardingJDBC依赖 --><dependency><groupId>org.apache.shardings…

springmvc-controller视图层配置SpringMVC处理请求的流程

目录 1. 什么是springmvc 2.项目中加入springmvc支持 2.1 导入依赖 2.2 springMVC配置文件 2.3 web.xml配置 2.4 中文编码处理 3. 编写一个简单的controller 4. 视图层配置 4.1 视图解析器配 4.2 静态资源配置 4.2 编写页面 4.3 页面跳转方式 5. SpringMVC处理请求…

whisper+剪映+chatgpt实现实时语音对话功能

whisper将录音文件转成文字---chatgpt回答---剪映tts将文字转成语言。 GitHub - openai/whisper: Robust Speech Recognition via Large-Scale Weak Supervision whisper剪映chatgpt实现实时语音对话功能_哔哩哔哩_bilibili

【物联网】常见电子元器件(电阻、电容、电感、二极管、三极管)综合,详细分析原理及其应用

电子元器件是现代电子技术的基础&#xff0c;它们在各个领域中发挥着重要作用。从三极管到电容器、电阻器&#xff0c;这些常用元器件承担着放大、开关、滤波等关键任务。它们的特性和组合方式决定了电路的性能和功能。本文将介绍常用电子元器件的工作原理和应用场景&#xff0…

zkLogin构建者的最佳实践和业务思考

随着zkLogin在Sui主网上线&#xff0c;构建者可以开始为其应用程序提供丝滑的帐户创建服务。与任何新技术集成一样&#xff0c;构建者需要考虑许多重要的问题&#xff0c;以降低风险并成功优化。 本文概述了其中一些考虑因素&#xff0c;并突出了zkLogin文档中提供的明确指导。…

vue3 - 使用 xlsx 库将数据导出到 Excel 文件

GitHub Demo 地址 在线预览 xlsx是由SheetJS开发的一个处理excel文件的JavaScript库。它可以读取、编写和操作 Excel 文件 安装xlsx npm install xlsx --save实现一个通过的数据导出工具类 import * as XLSX from xlsx/*** description: 导出excel* param {any} dataList* p…

基于SSM的微博系统网站的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用Vue技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

phpstudy_pro高效率建一个属于自己的网站

1.下载phpStudy_32 2.下载wordpress-6.3-zh_CN 安装好phpstudy后启动phpstudy中对应的服务&#xff0c;并在网站中配置好对一个的应用的路径 ps:根目录中的路径是你想要通过phpstudy部署应用的路径 这里以wordpress为例 将下载wordpress的压缩包解压后&#xff0c;需要修改…

华为ac无线侧命令行配置思路和步骤

无线侧配置思路&#xff1a; Ap和ac在同一个广播域内&#xff0c;不用配置 option 43 source 源ip回包哪个模式都得配置 Cli配置业务模版流程&#xff1a; 1、 AC控制器上全局配置capwap回包接口地址 1、配置ssid&#xff1a;wifi名称 2、配置安全模版&#xff1a;用户连接密码…

前端页面初步开发

<template><div><el-card class"box-card" style"height: 620px"><el-input v-model"query.name" style"width:200px" placeholder"请输入用户姓名"></el-input>&nbsp&nbsp&nbsp…

【Golang】数组 切片

【Golang】数组 && 切片 1、数组 基本概念 数组是一个由固定长度的特定类型元素组成的序列&#xff0c;一个数组可以由零个或多个元素组成 因为数组的长度是固定的&#xff0c;所以在Go语言中很少直接使用数组 数组初始化 //1、默认数组中的值是类型的默认值 var arr…

Pycharm操作git仓库 合并等

菜单 Git CommitPushUpdate ProjectPullFetchMergreRebase 查询 查询分支 查询本地所有分支 # 查询本地分支 git branch# 查询远程分支 git branch -rPycharm查看当前分支 步骤&#xff1a; Git->Branches 哈喽&#xff0c;大家好&#xff0c;我是[有勇气的牛排]&…

红外遥控器 数据格式,按下及松开判断

红外遥控是一种无线、非接触控制技术&#xff0c;具有抗干扰能力强&#xff0c;信息传输可靠&#xff0c;功耗低&#xff0c;成本低&#xff0c;易实现等显著优点&#xff0c;被诸多电子设备特别是家用电器广泛采用&#xff0c;并越来越多的应用到计算机系统中。 同类产品的红…

FPGA project :HDMI

实验目标&#xff1a;驱动HdMI显示十色等宽彩条。 本实验的重点是&#xff1a; 1掌握TMDS通信协议。 2rgb565转rgb888。 3编写HDMI驱动程序。 4学会看流程图编写代码。 值得注意的事情 1注意数据与解析数据的信号&#xff08;比如传入的数据中0或者1的个数&#xff09;&…

IoTDB 在国际数据库性能测试排行榜中位居第一?测试环境复现与流程详解第一弹!...

最近我们得知&#xff0c;Apache IoTDB 多项性能表现位居 benchANT 时序数据库排行榜&#xff08;Time Series: DevOps&#xff09;性能排行第一名&#xff01;&#xff08;榜单地址&#xff1a;https://benchANT.com/ranking/database-ranking&#xff09; benchANT 位于德国&…

毛玻璃动画交互效果

效果展示 页面结构组成 从上述的效果展示页面结构来看&#xff0c;页面布局都是比较简单的&#xff0c;只是元素的动画交互比较麻烦。 第一个动画交互是两个圆相互交错来回运动。第二个动画交互是三角绕着圆进行 360 度旋转。 CSS 知识点 animationanimation-delay绝对定位…

Vue之transition组件

Vue提供了transition组件&#xff0c;使用户可以更便捷地添加过渡动画效果。 transition组件 transition组件也是一个抽象组件&#xff0c;并不会渲染出真实dom。Vue会在其第一个真实子元素上添加过渡效果。 props render 这里将render分为两部分&#xff0c;第一部分界定真…

线性表的链式存储结构——链表

一、顺序表优缺点 优点&#xff1a;我们知道顺序表结构简单&#xff0c;便于随机访问表中任一元素&#xff1b; 缺点&#xff1a;顺序存储结构不利于插入和删除&#xff0c;不利于扩充&#xff0c;也容易造成空间浪费。 二、链表的定义 ①&#xff1a;概念&#xff1a; 用一组任…