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

目录

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

一、简介

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

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

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.xdnf.cn/news/147973.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

WebSocket实战之五JSR356

一、前言 前几篇WebSocket例子服务端我是用NodeJS实现,这一篇我们用Java来搭建一个WebSocket服务端,从2011年WebSocket协议RFC6455发布后,大多数浏览器都实现了WebSocket协议客户端的API,而对于服务端Java也定义了一个规范JSR356,即Java API for WebSoc…

华为云云耀云服务器L实例评测|搭建CounterStrike Source Delicated Server(CS起源游戏服务器)

华为云云耀云服务器L实例评测|搭建CounterStrike Source Delicated Server(CS起源游戏服务器) #【有奖征文】华为云云服务器焕新上线,快来亲身感受评测吧!# ⭐️ CounterStrikeSource(CS起源是Valve的一款…

windows系统利用powershell查看系统支持那些Windows功能选项

在PowerShell中,我们可以使用Get-WindowsOptionalFeature cmdlet命令来查看Windows功能选项。 打开PowerShell 输入以下命令:将结果输出到1.log Get-WindowsOptionalFeature -Online >1.log 可以看到在指定路径下看到生成了文件 打开查看内容&…

jvm 参数配置

查看当前jvm配置参数的值 jsp查看所有的jvm端口 jinfo -flag 参数(XX:后面的) JIT配置 -XX:CompileThreshold在方法调用的默认阈值在客户端1500次,在服务器端10000次。 -XX:-UseCounterDecay用来关闭热度衰减。 -XX:CounterHalfLifeTime设置半衰减的时间&#x…

辅助驾驶功能开发-测试篇(2)-真值系统介绍

1 真值系统概述 1.1 真值评测系统核心应用 快速构建有效感知真值,快速完成感知性能评估,快速分析感知性能缺陷。 主要应用场景包括: 1. 感知算法开发验证: 在算法开发周期中,评测结果可以作为测试报告的一部分,体现算法性能的提升。 2. 遴选供应…

基于SpringBoot+MyBatis实现的个人博客系统(一)

这篇主要讲解一下如何基于SpringBoot和MyBatis技术实现一个简易的博客系统(前端页面主要是利用CSS,HTML进行布局书写),前端的静态页面代码可以直接复制粘贴,后端的接口以及前端发送的Ajax请求需要自己书写. 博客系统需要完成的接口: 注册登录博客列表页展示博客详情页展示发布博…

九、2023.10.3.Linux(end).9

文章目录 33、简述mmap的原理和使用场景?34、互斥量能不能在进程中使用?35、协程是轻量级线程,轻量级表现在哪里?36、说说常见信号有哪些,表示什么含义?37、说说线程间通信的方式有哪些?38、说说…

C# 自定义控件库之Lable组合控件

1、创建类库 2、在类库中添加用户控件(Window窗体) 3、控件视图 4、后台代码 namespace UILib {public partial class DeviceInfoV : UserControl{public DeviceInfoV(){InitializeComponent();ParameterInitialize();}#region 初始化private void Par…

初级篇—第二章SELECT查询语句

文章目录 什么是SQLSQL 分类SQL语言的规则与规范阿里巴巴MySQL命名规范数据导入指令 显示表结构 DESC基本的SELECT语句SELECTSELECT ... FROM列的别名 AS去除重复行 DISTINCT空值参与运算着重号查询常数过滤数据 WHERE练习 运算符算术运算符加减符号乘除符号取模符号 符号比较运…

DevSecOps 将会嵌入 DevOps

通常人们在一个项目行将结束时才会考虑到安全,这么做会导致很多问题;将安全融入到DevOps的工作流中已产生了积极结果。 DevSecOps:安全正当时 一直以来,开发人员在构建软件时认为功能需求优先于安全。虽然安全编码实践起着重要作…

python——Django框架

一、基本介绍 Django 是一个由 Python 编写的一个开放源代码的 Web 应用框架。 使用 Django,只要很少的代码,Python 的程序开发人员就可以轻松地完成一个正式网站所需要的大部分内容,并进一步开发出全功能的 Web 服务 Django 本身基于 MVC …

踩坑笔记 MySQL分页排序查询(Order by limit)导致数据丢失和重复

文章目录 背景现象原因解决方案 背景 分页查询排序后的数据,是一个非常常见的业务场景;但当使用不唯一的字段排序时,分两页查询的数据可能出现数据重复和丢失的错觉。 在执行查询时,MySQL会根据查询优化器的决策来确定数据的检索…

R语言进行孟德尔随机化+meta分析(2)----基于R和stata

目前不少文章用到了孟德尔随机化meta分析,在上一章咱们简单介绍了一下meta分析的基础知识。咱们今天来介绍一篇11分文章,由文章看看孟德尔随机化meta分析如何进行,文章的题目是:Appraising the causal role of smoking in multipl…

【PostgreSQL】【存储管理】表和元组的组织方式

外存管理负责处理数据库与外存介质(PostgreSQL8.4.1版本中只支持磁盘的管理操作)的交互过程。在PostgreSQL中,外存管理由SMGR(主要代码在smgr.c中)提供了对外存的统一接口。SMGR负责统管各种介质管理器,会根据上层的请求选择一个具体的介质管理器进行操作…

动态链接那些事

1、为什么要动态链接 1.1 空间浪费 对于静态链接来说,在程序运行之前,会将程序所需的所有模块编译、链接成一个可执行文件。这种情况下,如果 Program1 和 Program2 都需要用到 Lib.o 模块,那么,内存中和磁盘中实际上就…

Guava限流器原理浅析

文章目录 基本知识限流器的类图使用示例 原理解析限流整体流程问题驱动1、限流器创建的时候会初始化令牌吗?2、令牌是如何放到桶里的?3、如果要获取的令牌数大于桶里的令牌数会怎么样4、令牌数量的更新会有并发问题吗 总结 实际工作中难免有限流的场景。…

外卖订餐系统:数字时代的美食点餐新体验

在数字时代,外卖订餐系统已经成为现代生活的一部分。它不仅改变了我们点餐的方式,还为餐饮业带来了巨大的变革。本文将深入探讨外卖订餐系统的崭新世界,探讨它的发展历程、优势和未来趋势。 从电话点餐到外卖订餐系统 许多人还记得过去打电…

Linux环境下gdb调试方法与演示

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 演示环境&#xff1…

初识jdbc

java中的数据存储技术 在Java中,数据库存取技术可分为如下几类: JDBC直接访问数据库 JDO (Java Data Object )技术 第三方O/R工具,如Hibernate, Mybatis 等 JDBC是java访问数据库的基石,JDO、Hibernate、MyBatis等只是更好的封…

华为云云耀云服务器L实例评测使用 | 通过程序实现直播流自动分段录制

华为云云耀云服务器L实例评测使用 | 通过程序实现直播流自动分段录制 1. 准备工作2. 环境搭建3. 心得总结 1. 准备工作 随着云计算时代的进一步深入,越来越多的中小企业企业与开发者需要一款简单易用、高能高效的云计算基础设施产品来支撑自身业务运营和创新开发。基…