嵌入汇编

2023-10-31

本文介绍内核C语言程序中接触到的嵌入式汇编(内联汇编)语句。具有输入和输出参数的嵌入式汇编语句的基本格式为:asm("汇编语句"

:输出寄存器

:输入寄存器

:会被修改的寄存器);

除第一行外,后面带冒号的行若不使用就都可以省略。其实asm是内联汇编语句的关键词;"汇编语句"是你写汇编指令的地方;"输出寄存器"表示这段嵌入汇编执行完之后那些寄存器用于存放输出数据。输入寄存器表示在开始执行汇编代码时,这里指定的寄存器会存放输入值。“会被修改的寄存器”表示已对其中列出的一些寄存器的值进行改动,gcc编译器不能再依赖于它原先对这些寄存器加载的值。如果必要的话,gcc需要重新加载这些寄存器。

下面我们举例子来说明嵌入式汇编语句的使用方法。这里列出/kernel/traps。c文件中的一段代码来详细解释。

#define get_seg_byte(seg,addr)\
({\
register char __res;\
__asm__("push %%fs;\
		mov %%ax,%%fs;\
		movb %%fs:%2,%%al;\
		pop %%fs"\
		:"=a" (__res)\
		:"0" (seg),"m" (*(addr)));\
__res;})

这段代码定义了一个嵌入式汇编宏函数。通常使用汇编语句最方便的方式就是把他们放在一个宏内。用圆括号括住的组合语句(花括号中的语句)。{}可以当做表达式使用,最后一行的变量_res是该表达式的输出值。

__asm__表示嵌入式汇编的开始。

:”=a" (_res)代表输出寄存器,意义是这段嵌入式汇编代码运行结束后将eax寄存器的值存放到_res变量中。=a称为加载代码,“=”表示这是输出寄存器,并且其中的值将被输出值代替。

:“0” (seg)表示在这段代码开始运行时将seg放到eax寄存器中,为什么是eax寄存器?就从这个0看出来的。嵌入式汇编程序规定把输出和输入寄存器统一按顺序编号,顺序是从输出寄存器开始,从左到右、从上到下,从0开始计数,因此输出寄存器的编号是0(这里只有一个输出寄存器eax)。





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入汇编 的相关文章

  • static在c语言中是什么意思,在C语言中static有什么含义

    2019 10 10阅读 64 最主要有两点用途 让一个变量长期有效 而不管其是在什么地方被申明 比如 intfun1 staticints value 0 那么fun1不管在什么地方被调用 当函数退出后 s value最后的值将一直会被系
  • MR(MapReduce)架构

    一 什么是MR MapReduce将复杂的 运行于大规模集群上的并行计算过程高度地抽了两个函数 Map和Reduce 二 为什么使用MR 特点 1 易于编程 只关心业务逻辑 它简单的实现一些接口 就可以完成一个分布式程序 2 良好的扩展性
  • 算法面试-深度学习基础面试题整理(2023.8.29开始)

    一 无监督相关 聚类 异常检测 1 常见的距离度量方法有哪些 写一下距离计算公式 1 连续数据的距离计算 闵可夫斯基距离家族 当p 1时 为曼哈顿距离 p 2时 为欧式距离 p gt 时 就是切比雪夫距离 余弦距离 其中 A 和B是要比较的
  • Java8 consumer接口

    Java8 consumer接口 1 由来 Consumer是Java 8中的一个函数式接口 它属于java util function包 该接口定义了一个具有单个输入参数并且没有返回值的操作方法accept 2 官方常见五种示例命令和说明
  • 大数据技术与原理 概述

    大数据概述 大数据的发展历程 第一阶段 萌芽期 20世纪90年代至21世纪初 第二阶段 成熟期 21世纪前十年 第三阶段 大规模应用期 2010年以后 大数据的特点 简称4V 数据量大 数据类型多 处理速度快 价值密度低 大数据的特征 全面
  • Makefile 中gcc -lm -ldl是什么意思?

    gcc lm ldl是什么意思 包含动态链接库 到书上出现gcc lm 的选项 甚是不解 在网上查阅了一些资料 访问了一些论坛整理下 初学linux和gcc C代码调用math h中的函数有问题 如sqrt函数 若如sqrt 3 0 则可以

随机推荐

  • ros-sensor_msgs::PointCloud2类型消息解读

    ROS中sensor msgs PointCloud2类型消息解读 实例 header seq 2116 stamp secs 1586919439 nsecs 448866652 frame id LidarSensor1 height
  • Kubernetes系列(二)架构及特性

    在了解了k8s的发展历程之后 正式进入到学习k8s的阶段 本文主要内容是K8S的整体架构的说明和K8S一些特性的概括 架构 如下图是K8S的整体架构图 Kubernetes属于主从分布式架构 主要由Master Node和Worker No
  • 线程中捕获异常

    总结 正常线程抛出异常时 在外部是捕捉不到的 当此类异常跑抛出时 线程就会终结 而对于主线程和其他线程完全不受影响 且完全感知不到某个线程抛出的异常 也是说完全无法catch到这个异常 解决方案 为线程添加未捕获异常处理器 Uncaught
  • 关于错误 TypeError: ‘list‘ object is not callable 的解决办法

    在使用类型转换的过程中 运行以下代码产生了错误 1 tuple 将一个序列转换成元组 list 10 20 30 tuple tuple list print tuple print type tuple 2 list 将一个序列转换成列表
  • ip68能达到什么程度防水_IP68级防水能防多少米

    IPX8级防水8是厂商自定义的 具体防水深度由客户根据对自身产品的了解以及要求而定 IP68是连接器防水等级标准的最高级别 大家都知道 看防水连接器防水性能如何 主要看IPXX的后面两位数字XX 第一位X是从0到6 最高等级为6 第2位X是
  • ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer) kafka.c

    kafka启动时报错如下 2021 12 28 23 35 02 165 ERROR Fatal error during KafkaServer startup Prepare to shutdown kafka server Kafka
  • 必须收藏!Node.js下载(全版本秒下载!)

    全版本都有包含 windows Linux 源码等 根据文件夹名称进行挑选 下载 网址 https nodejs org dist 如何解决了您的问题 欢迎关注我 还希望来JAVA WEB开发交流群 958923746 有问题欢迎共享 共同
  • GTSRB数据集

    GTSRB数据集数据集XML格式现已整理完毕
  • matlab经验模态分解代码_Matlab中的模态分析

    频响函数FRF是如何得这个问题很难吗 回忆了一下 其实对新手来说确实蛮难的 虽然课本上将了一堆模态分析 但是我们都是用较为成熟的商业软件进行 只需要对软件 点点点 即可 勒博其实为此困扰过很久 今天勒博就简单讲讲我们一般说的模态分析 1 勒
  • 互联网金融青年会成立一周年庆典在京举办

    2015年11月15日 互联网金融 北京 高峰论坛暨互联网金融青年会成立一周年庆典在京举办 2015年是互联网金融发展历程中颇具意义的一年 随着行业指导意见的发布 监管框架越来越明晰 在互联网金融即将告别无序进入有序的当下 本次活动以 路越
  • 机器学习——数据探索大致流程

    什么是EDA 在拿到数据后 首先要进行的是数据探索性分析 Exploratory Data Analysis 它可以有效的帮助我们熟悉数据集 了解数据集 初步分析变量间的相互关系以及变量与预测值之间的关系 并且对数据进行初步处理 如 数据的
  • 卷积和积分运算

    先看到卷积运算 知道了卷积就是把模版与图像对应点相乘再相加 把最后的结果代替模版中心点的值的一种运算 但是 近来又看到了积分图像的定义 立马晕菜 于是整理一番 追根溯源一下吧 1 卷积图像 1 1 源头 首先找到了一篇讲解特别好的博文 原文
  • 大学计算机高海波目录,华中师范大学

    个人简介 基本情况 性别 男 出生年月 1974年5月 籍贯 安徽省宿松县 职称 教授 研究方向 新闻传播史论 学历学位 博士研究生 工作单位 华中师范大学新闻传播学院 学习与工作经历 1993 9 1997 6 华中理工大学新闻系本科生
  • Linux环境中VScode无法进行函数跳转

    前言 我在Ubuntu中使用VScode阅读源码 发现无法进行函数跳转 查了很久 最后发现了一下原因 原因一 查看是否下载了clangd插件 原因二 查看是否关闭了intellisense 注意 必须是Disabled 而不是disable
  • 【深度学习与计算机视觉】6、图像分类与搜索

    文章目录 一 神经网络基础 从loss曲线和accuracy来判断如何调整训练参数 二 详解卷积操作 三 海洋鱼类分类 一 神经网络基础 从loss曲线和accuracy来判断如何调整训练参数 1 loss曲线 步长 学习率 batch s
  • 群晖服务器文件管理套件,群晖drive套件的使用教程

    摘要 群晖同步套件最近头脑一热组成了一台J3455的黑群晖1 安装群晖本站之前有分享相关的操作 https u nf za 45 htmlhttps u nf za 44 h 群晖同步套件 最近头脑一热组成了一台J3455的黑群晖 1 安装
  • leetcode第319场周赛

    T1 温度转换 这个题目就很简单 根据题意写代码即可 class Solution public vector
  • Vue实现TabBar底部导航栏灵活组件保姆级超详细

    Vue实现TabBar底部导航栏组件 标题项目介绍 需求 要求tabbar中的文字可动态更改 文字对应的图片动态更改动态增加 文字颜色对应更改 TabBarItem的图片动态更改和增加 整个项目灵活化 利用插槽 路由 父子组件的值传递 利用
  • Ts中泛型的使用

    泛型 指在定义函数 接口或类的时候 不预先指定具体的类型 而在使用的时候再指定具体类型的一种特性 引入 下面创建一个函数 实现功能 根据指定的数量 count 和数据 value 创建一个包含 count 个 value 的数组 不使用泛型
  • 嵌入汇编

    本文介绍内核C语言程序中接触到的嵌入式汇编 内联汇编 语句 具有输入和输出参数的嵌入式汇编语句的基本格式为 asm 汇编语句 输出寄存器 输入寄存器 会被修改的寄存器 除第一行外 后面带冒号的行若不使用就都可以省略 其实asm是内联汇编语句