第六章 完善内核

news2024/11/21 21:31:57

函数调用约定简介

在这里插入图片描述

参数的传递方式:使用后栈来保存。

每个进程都有自己的栈,这就是每个内存自己的专用内存空间;保存参数的内存地址不用再花精力维护,已经有栈机制来维护地址变化了,参数在栈中的位置可以通过栈顶的偏移量来得到。

C语言 由调用者压入栈,由调用者清理栈空间,函数参数是从右到左的顺序入栈。

在这里插入图片描述
在这里插入图片描述

汇编语言和C语言混合编程

浅析C库函数与系统调用

汇编语言和C语言混合编码可分为两类:
单独的汇编代码文件与单独的C语言文件分别编译目标文件后,一起链接成可执行文件。(本文使用方法)
在C语言中嵌入汇编代码,直接编译生成可执行程序。

系统调用是用来实现一系列在用户态不能或不易实现的功能,比如最常见的读写硬盘文件,只有操作系统有权限去访问硬件,用户程序是没有权限的,所以系统调用是供用户程序来使用的。
系统调用类似BIOS中断,不过它只需要一个入口0x80启动中断,子功能用eax寄存器来指定。可以使用man命令查看某个系统调用的用法。

调用“系统调用”有两种方式:
将系统调用指令封装在C库函数,通过库函数进行系统调用;(直接使用库函数)
不依赖任何库函数,直接通过汇编指令int 与操作系统通信。

跨过库函数,使用汇编语言:

在这里插入图片描述
(每次需要操作系统就int 0x80,提前在eax上写入需要操作的子功能)

汇编语言和C语言共同协作

C语言文件使用汇编语言的函数,汇编语言使用C语言中的函数。C语言使用汇编函数时,直接将函数参数按照规范压入栈中。汇编函数需要用global进行外部引用。
在这里插入图片描述
在这里插入图片描述

实现自己的打印函数

显卡的端口控制

端口实际上就是IO接口电路上的寄存器,为了能访问到这些CPU外部的寄存器(端口),计算机系统为这些寄存器统一编址,一个寄存器被赋予一个地址寄存器的地址范围为0~65535(不是内存地址,只是寄存器编号),这些地址就是端口号,用专门的IO指令in和out来读写这些寄存器。

显卡中的寄存器

在这里插入图片描述

前四组寄存器属于分组,被分成了Address Register和Data Register寄存器两类。给显卡的寄存器分组是因为它的数量太多了。把一个寄存器分组视为一个寄存器数组,提供一个寄存器用于指定数组下标,再提供一个寄存器用于对索引所指向的数组元素进行输入输出操作,这样两个寄存器就能够定位寄存器数组中的任何寄存器了。(把一堆寄存器看出一个寄存器数组,只有一个端口用于输入输出,再提供一个端口用来表示索引)。这两个寄存器就是各组中的Address Register和Data Register。Address Register作为数组的索引,Data Register作为寄存器数组中该索引对应的寄存器,它相当于所对应的寄存器的窗口,往此窗口读写的数据都作用在索引所对应的寄存器上。

CRT Controller Register:
在这里插入图片描述
在这里插入图片描述

实现单个字符打印

实现字符打印(实验)
实现自己的打印函数

内联汇编

什么是内联汇编

内联汇编:在C语言中直接嵌入汇编语言,内联汇编所用的汇编语言其语法是AT&T。

汇编语言AT&T语法简介

AT&T是汇编语言的一种语法风格、格式。

在这里插入图片描述

AT&T的内存寻址:

在这里插入图片描述

在这里插入图片描述

内存寻址的不同方式表达:

在这里插入图片描述
在这里插入图片描述

基本内联汇编

基本内联汇编最简单的内联形式:(也就是在C语言编程中使用汇编语言的格式)

asm [volatile] ("assembly code")

各关键字之间可以用空格或制表符分隔,也可以紧凑挨在一起不分隔。
关键词asm用于声明内联表达式,这是内联汇编固定的部分,不可少。
asm和__asm__是一样的,是由gcc定义的宏:#define __asm__asm。

因为gcc有个优化选项-O,可以指定优化级别。当用-O来编译时,gcc按照自己的意图优化代码,说不定就会把自己所写的代码修改了。关键字volatile是可选项,它告诉gcc不能修改所写代码。volatile和__volatile__是一样的,是由gcc定义的宏:#define valatile volatile。

"assembly code"是所写的汇编代码,它必须位于圆括号中,而且必须用双引号引起来
在这里插入图片描述

在这里插入图片描述
(在内联汇编中,若要引用C变量,只能将它定义为全局变量)

扩展内联汇编

在这里插入图片描述

如何将C代码中的变量变成汇编代码中的操作数?
编译器采取的做法是它提供一个模板,让用户在模板中提出要求,其余工作由它负责实现。

asm [volatile] ("assembly code":output : input : clobber/modeify)

圆括号中的每一部分都可以省略,省略的部分要保留冒号分隔符来占位,如果省略的是后面的一个或多个连续部分,分隔符也不用保留。input和output是C为汇编提供输入参数和存储其输出的部分。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

约束的作用是把C代码中的操作数(变量、立即数)映射为汇编中所使用的操作数,实际就是描述C中的操作数如何变成汇编操作数。

在这里插入图片描述
在这里插入图片描述

基本内联汇编和扩展内联汇编的区别:
基本内联汇编的操作数需要在汇编语言编写中手动输入,而扩展内联汇编在格式中就输入了,用约束名a为C变量指定了寄存器eax,用约束名b指定了寄存器ebx。

在这里插入图片描述在这里插入图片描述

内存约束就是直接对当前输入变量地址操作,不需要把变量的值复制到寄存器中。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

C操作数通过约束(C变量在汇编中的映射)后,在汇编中的操作数是约束所指定的那个操作数载体,即内存或寄存器,如果是寄存器约束,汇编中操作的并不是C变量本身,而是C变量通过值传递到汇编的副本。
在这里插入图片描述

占位符的作用是代表约束的操作数,使用占位符来引用操作数。无论哪种占位符,它都是指代C变量经过约束后、由gcc分配的对应于汇编代码中的操作数,和C变量本身无关。

占位符分为序号占位符和名称占位符。
序号占位符根据出现次序直接用%n指代操作数。

序号占位符:

在这里插入图片描述

占位符在默认情况下为32位数据。但指令的操作数大小并不一致,有32位,16位(默认用低16位),8位(默认用低8位)。
gcc为我们提供了改变默认操作数的机会,对于8位,可以在%和序号之间插入字符‘h’来表示操作数为ah(8-15位),或者插入字符’b’来表示操作数为al(0-7位)。

名称占位符:

在这里插入图片描述

操作数类型修饰符,用来修饰所约束的操作数:内存、寄存器,分别在output和input中有以下几种。

在这里插入图片描述

扩展内联汇编之机器模式简介

机器模式用来在机器层面上指定数据的大小及格式。由于各种约束均不能确切地表达具体的操作数对象,所以引用了机器模式,用来从更细的粒度上描述数据对象的大小及其指定部分。

机器模式名称的结构:数据大小+数据类型+mode。

在这里插入图片描述

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

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

相关文章

QMS-云质说质量 - 1 张小泉的质量危机

云质QMS原创 转载请注明来源 作者:王洪石 引言 百年老店的拍蒜质量门 最近张小泉拍蒜断刀事件,吸引了全民关注,虽然随后发布了“断刀召集令”,但从事件发生到后续拖沓且不专业的应对,张小泉肯定是“失蒜”了。 张小泉…

一篇终结synchronized

一:基本原理 Java对象在内存中由两部分组成 : 1 是成员变量 2 是对象头,以32位虚拟机介绍:此时对象头是64位,即8字节 其中32个字节代表 mark word 另外32个字节代表klass word分别是什么意思呢? 1 klass …

文心一言 VS chatgpt (12)-- 算法导论3.1 6~7题

六、证明:一个算法的运行时间为θ(g(n))当且仅当其最坏情况运行时间为O(g(n)),且其最好情况运行时间为Ω(g(n)) 。 文心一言: chatgpt: 要证明「一个算法的运行时间为θ(g(n))当且仅当其最坏情况运行时间为O(g(n)),且…

LeetCode213 打家劫舍 II 动态规划法

题目地址 https://leetcode.cn/problems/house-robber-ii/ 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装…

【Hive实战】Windows下 IDEA DEBUG hiveMetastore hive2.3.9

Windows下 IDEA DEBUG hiveMetastore hive2.3.9 环境准备 编译好hive2.3.9源码,参考文档编译hive2.3.9源码准备好Mysql库,并手动创建schema,相关sql文件:hive-schema-2.3.0.mysql.sql和hive-txn-schema-2.3.0.mysql.sql。 启动…

SpringCloud --- Gateway服务网关

一、简介 Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。 二、为…

QT实现固高运动控制卡示波器

目录 一、固高示波器 二、基于QCustomPlot实现示波器 三、完整源码 一、固高示波器 固高运动控制卡自带的软件有一个示波器功能,可以实时显示速度的波形,可辅助分析电机的运行状态。但是我们基于sdk开发了自己的软件,无法再使用该功能&…

深度学习技巧应用8-各种数据类型的加载与处理,并输入神经网络进行训练

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用8-各种数据类型的加载与处理,并输入神经网络进行训练。在模型训练中,大家往往对各种的数据类型比较难下手,对于非结构化数据已经复杂的数据的要进行特殊处理&…

听我一句劝,别去外包,干了三年,废了....

先说一下自己的情况,大专生,18年通过校招进入湖南某软件公司,干了接近4年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

2.黑马SpringbBoot运维篇笔记自己修改

SpringBoot运维实用篇 ​ 基础篇发布以后,看到了很多小伙伴在网上的留言,也帮助超过100位小伙伴解决了一些遇到的问题,并且已经发现了部分问题具有典型性,预计将有些问题在后面篇章的合适位置添加到本套课程中,作为解…

[社区图书馆】《PyTorch高级机器学习实战》书评

《PyTorch高级机器学习实战》是一本非常实用的机器学习书籍,作者为阿里云智能首席AI专家赵健。这本书的目标读者是具有一定Python编程基础并对深度学习有兴趣的开发者和研究者。 在书中,作者从最基础的线性回归、逻辑回归、卷积神经网络(CNN…

前端食堂技术周刊第 80 期:Vite 4.3、Node.js 20、TS 5.1 Beta、Windi CSS 即将落幕

美味值:🌟🌟🌟🌟🌟 口味:东坡肉 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Vite 4.3Node.js 20TypeScript 5.1 BetaWindi CSS 即将落幕Pretty TypeScri…

springboot项目的jar文件以打包成docker镜像的方式部署

清单: 安装有docker的Linuxspringboot打包的jar文件(该项目只有一个返回"hello world"接口) Linux的IP地址:192.168.221.129 springboot项目的接口: 1、上传jar文件至Linux 我上传的位置为:/…

4.2——派生类的构造函数和析构函数

派生类继承了基类的成员,实现了原有代码的重用,但是基类的构造函数和析构函数不能被继承,在派生类中,如果对派生类新增的成员进行初始化,就需要加入派生类的构造函数。与此同时,对所有从基类继承下来的成员…

SpringMVC-学习修改尚硅谷最新教程笔记

三、SpringMVC 1、SpringMVC简介 1.1、什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: **一类称为实…

【JAVA-模块五 数组】

JAVA-模块五 数组 一、数组(一维)1.1数组是什么?1.2java中数组静态初始化:(存)两种定义格式:数组初始化格式:静态初始化后,打印数组名: 1.3 数组元素访问&…

win11 环境下streamlit使用pycharm debug

目录 1. pycharm中配置run 脚本2. streamlit3. 开始debug调试 1. pycharm中配置run 脚本 (一)点击 Edit Configurations,按图操作. 2. streamlit 1.streamlit 安装在 anaconda 的 base 环境(随意哈,安装哪里都可以&#xff0c…

Zookeeper 面试题总结

Zookeeper 1、工作中 Zookeeper 有什么用途吗2、zookeeper 数据模型是什么样的3、那你知道 znode 有几种类型呢4、你知道 znode 节点里面存储什么吗5、每个节点数据最大不能超过多少呢6、你知道 znode 节点上监听机制嘛7、那你讲下 Zookeeper 特性吧8、你刚提到顺序一致性&…

LRU缓存淘汰策略——面试高频

⭐️前言⭐️ 本文主要介绍在面试中常见的高频手撕算法题目,LRU算法, 🍉欢迎点赞 👍 收藏 ⭐留言评论 📝私信必回哟😁 🍉博主将持续更新学习记录收获,友友们有任何问题可以在评论区…

LEVIR-CD遥感建筑变化检测数据集

LEVIR-CD是一个新的大规模遥感二元变化检测数据集,它将有助于开发新的基于深度学习的遥感图像变化检测算法。 下载地址:https://justchenhao.github.io/LEVIR/ 历史消息 20230311:我们为LEVIR_CD中的每个样本补充了地理空间信息(例如&#…