深入理解计算机系统学习笔记

news2024/11/24 10:52:48

第三章 程序的机器级表示

3.2.1 机器级代码

对于机器级编程来说,其中两种抽象尤为重要。第一种是由捍令集体系结构或指令集架构(Instruction Set Architecture, ISA)来定义机器级程序的 格式和行为,它定义了处理器状态、指令的格式,以及每条指令对状态的影响。

第二种抽象是,机器级程序使用的内存地址是虚拟地址,提供的内存模型看上去是一个非常大的字节数组。存储器系 统的实际实现是将多个硬件存储器和操作系统软件组合起来。

汇编代码表示非常接近于机器代码。与机器代码的二进制格式相比,汇编代码的主要特点是它用可读性更好的文本格式表示。 能够理解汇编代码以及它与原始C代码的联系,是理解计算机如何执行程序的关键一步。

X86-64 的机器代码和原始的 C代码差别非常大。一些通常对C语言程序员隐藏的处理器状态都是可见的:

程序计数器(通常称为 “PC”,在 x86-64 中用%rip 表示)给出将要执行的下一条指令在内存中的地址。

整数寄存器文件包含16个命名的位置,分别存储64位的值。这些寄存器可以存储地址 (对应于C语言的指针)或整数数据。有的寄存器被用来记录某些重要的程序状态,而其 他的寄存器用来保存临时数据,例如过程的参数和局部变量,以及函数的返回值。

条件码寄存器保存着最近执行的算术或逻辑指令的状态信息。它们用来实现控制或 数据流中的条件变化,比如说用来实现if和while语句。

一组向量寄存器可以存放一个或多个整数或浮点数值。

程序内存包含:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调 用和返回的运行时桟,以及用户分配的内存块(比如说用malloc库函数分配的)。

3.2.2 代码示例

假设我们写了一个C语言代码文件mstore.c,在命令行上使用 “-s” 选项,就能看到C语言编译器产生的汇编代码:

linux> gcc -Og -S mstore.c

这会使GCC运行编译器,产生一个汇编文件mstore.s,但是不做其他进一步的工 作。(通常情况下,它还会继续调用汇编器产生目标代码文件)。

如果我们使用 “-c” 命令行选项,GCC会编译并汇编该代码:

 linux> gcc-Og-c mstore.c

这就会产生目标代码文件mstore.o, 它是二进制格式的,所以无法直接查看。

要查看机器代码文件的内容,有一类称为反汇编器(disassembler)的程序非常有用。

3.3 数据格式

由于是从16位体系结构扩展成32位的,Intel用术语 “字(word)” 表示 16位数据类型。因此,称32 位数为 “双字(double words)”,称 64 位数为 “四字(quad words)”。 图3-1 给出了C语言基本数据类型对应的 x86-64 表示。

3.4 访问信息

一个x86-64 的中央处理单元(CPU)包含一组 16 个存储 64 位值的通用目的寄存器。 这些寄存器用来存储整数数据和指针。

字节级操作可以访问最低的字节,16位操作可以访问最低的2个字 节,32位操作可以访问最低的4个字节,而64位操作可以访问整个寄存器。

3.4. 1 操作数指示符

大多数指令有一个或多个操作数(operand), 指示出执行一个操作中要使用的源数据 值,以及放置结果的目的位置。

操作数的可能性被分为三种类型。

第一种类型是立即数(immediate), 用来表 示常数值。

第二种类型是寄存器(register), 它表示某个寄存器的内容,16个寄存器的低位1字节、2字节、4 字节或8字节中的一个作为操作数, 这些字节数分别对应于8位、16位、32位或64位。

第三类操作数是内存引用,它会根据计算出来的地址(通常称为有效地址)访问某个内存位置。

3.4.2 数据传送指令

最频繁使用的指令是将数据从一个位置复制到另一个位置的指令。操作数表示的通用 性使得一条简单的数据传送指令能够完成在许多机器中要好几条不同指令才能完成的功能。

最简单形式的数据传送指令一MOV类。这些指令把数据从源位置 复制到目的位置,不做任何变化。

MOV 类由四条指令组成:movb、movw、movl 和 movq。

这些指令都执行同样的操作;主要区别在于它们操作的数据大小不同:分别是1、 2、4 和8字节。

注意事项:

源操作数指定的值是一个立即数,存放在寄存器活着内存中。

目的操作数指定的是一个位置,寄存器或者内存地址。

X86-64 限制,两个操作数都不能都是内存地址,

要么从内存移入寄存器,

要么寄存器移入内存,

要么寄存器移入寄存器

只有有名字的寄存器才能作为指令的操作数。即可以作为 MOV 命令的操作数的寄存器,只能是前文讲过的 16 个整数寄存器之一

寄存器部分的大小必须于指令的最后一个字符(‘b’,‘w’,‘l’,‘q’)指定的大小匹配

如果 MOV 传送 4 字节到寄存器(movl指令),按照之前 x86-64 的惯例,指令会将目的寄存器的高四字节清零。

惯例:任何为寄存器生成 32 位值的指令都会把该寄存器的高位部分置为 0。

常规 mov 命令只能处理 32 位的源操作数,然后经过拓展变为 64 位数。

movbsq可以直接将 64 位数作为源操作数,但目的操作数只能是寄存器。

3.4.3 压入和弹出栈数据

找在处理过程调用中起到至关重要的作用。栈是一种数据结构,可以添加或者删除值,不过要遵循 “后进先出” 的原则。通过push操作把数据压入栈中,通过pop操作删除数据;它具有一个属性:弹出的值永远是最近被压人而且仍然在栈中的值。

将一个四字值压人栈中,首先要将栈指针减8,然后将值写到新的栈顶地址。

因此,指令pushq %rbp的行为等价于下面两条指令:

subq $8,%rsp  

这条指令用于分配额外的堆栈空间,其含义是从栈指针 %rsp中减去立即数 8。在x86-64汇编中,subq是减法指令,$8表示立即数8字节,%rsp是栈指针寄存器。

movq %rbp,(%rsp) 

这条指令将 %rbp 寄存器的值(即当前函数的基址指针)移动到 %rsp 指向的内存地址中。%rbp 是基址指针寄存器,它通常用于访问当前函数的栈帧。(%rsp) 表示 %rsp 指向的内存地址。

图示:

前两栏给出的是,当%rsp 为 0xl08,%rax 为 0x123 时,执行指令 pushq %rax 的效果。首先%rsp 会减 8,得到 0x100,然后会将 0x123存放到内存地址 0x100 处。

弹出一个四字的操作包括从栈顶位置读出数据,然后将栈指针加8。

第三栏说明的是在执行完pushq后立即执行指令popq %rdx的效果。先从内 存中读出值0x123, 再写到寄存器%rdx 中,然后,寄存器%rsp的值将增加回到 0x108。

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

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

相关文章

在Ubuntu上为ARM 8处理器安装Python 3.10.4虚拟环境指南

在Ubuntu上为ARM 8处理器安装Python 3.10.4虚拟环境指南 安装Anaconda或Miniconda: 首先,您需要从官方网站下载适用于ARM架构的Anaconda或Miniconda安装包。下载完成后,在终端中使用bash Anaconda3-2019.10-Linux-armv8.sh(文件…

将仓库A中的部分提交迁移到仓库B中

结论: 使用git format-patchgit am即可实现 使用场景: 例如仓库A这里有5个提交记录,commitid1, commitid2, commitid3, commitid4,commitid5 仓库B想用仓库A中提交的代码,手动改比较慢,当改动较多的时候…

2.26 Qt day4+5 纯净窗口移动+绘画事件+Qt实现TCP连接服务+Qt实现连接数据库

思维导图 Qt实现TCP连接 服务器端&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer>//服务器端类 #include<QTcpSocket>//客户端类 #include<QMessageBox>//消息对话框类 #include<QList>//链…

2024-02-26(Spark,kafka)

1.Spark SQL是Spark的一个模块&#xff0c;用于处理海量结构化数据 限定&#xff1a;结构化数据处理 RDD的数据开发中&#xff0c;结构化&#xff0c;非结构化&#xff0c;半结构化数据都能处理。 2.为什么要学习SparkSQL SparkSQL是非常成熟的海量结构化数据处理框架。 学…

实践航拍小目标检测,基于轻量级YOLOv8n开发构建无人机航拍场景下的小目标检测识别分析系统

关于无人机相关的场景在我们之前的博文也有一些比较早期的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《deepLabV3Plus实现无人机航拍目标分割识别系统》 《基于目标检测的无人机航拍场景下小目标检测实践》 《助力环保河道水质监测&#xff0c;基于yolov…

掌握ChatGPT润色绝技:什么是人工智能写作以及如何使用它来完成写作任务

如对AI写论文感兴趣&#xff0c;欢迎添加作者wx讨论 : ryan_2982 人工智能 (AI) 的出现开创了技术进步的新时代&#xff0c;彻底改变了包括写作和内容创作在内的各个行业。人工智能写作和人工智能提示已成为可以简化和增强写作任务的强大工具。在这篇博文中&#xff0c;我们将…

C++多线程学习09:并发队列

参考 链接&#xff1a;恋恋风辰官方博客 并发队列&线程安全栈 代码结构&#xff1a; 并发队列ThreadSafeQueue.h&#xff1a; #pragma once#include <mutex> #include <queue>template<typename T> class threadsafe_queue { private:mutable std::m…

深入理解Python中的JSON模块:基础大总结与实战代码解析【第102篇—JSON模块】

深入理解Python中的JSON模块&#xff1a;基础大总结与实战代码解析 在Python中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;模块是处理JSON数据的重要工具之一。JSON是一种轻量级的数据交换格式&#xff0c;广泛应用于Web开发、API通信等领域。本文将…

linux操作系统期末练习题

背景&#xff1a; 一、远程登录 1&#xff0e;利用远程登录软件&#xff0c;以用户userManager(密码123456)&#xff0c;远程登录教师计算机&#xff08;考试现场给出IP地址&#xff09;&#xff0c;只有操作&#xff0c;没有命令。 2&#xff0e;以stu班级学生个人学号后3位…

goland配置新增文件头

参考&#xff1a; goland函数注释生成插件 goland函数注释生成插件_goland自动加函数说明-CSDN博客 GoLand 快速添加方法注释 GoLand 快速添加方法注释_goland批量注释-CSDN博客 goland 如何设置头注释&#xff0c;自定义author和data goland 如何设置头注释&#xff0c;自定…

spring boot 集成科大讯飞星火认知大模型

一、安装依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

springboot003图书个性化推荐系统的设计与实现(源码+调试+LW)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。今天给大家介绍一篇基于SpringBoot的图书个…

SOLIDWORKS 查找并修复装配体配合错误

我们在SOLIDWORKS 正版软件进行装配体装配时&#xff0c;时常会出现一些报错&#xff0c;例如在配合、装配体特征或被装配体参考引用的零部件和子装配体中。一些常见的错误&#xff0c;如一个零部件的过定义会引发更多其他错误信息&#xff0c;并导致装配体停止解析配合关系。下…

RestTemplate启动问题解决

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ RestTemplate启动问题解决 问题&#xff1a;在SpringCloud架构项目中配…

汽车大灯尾灯划痕裂缝破洞破损掉角崩角等如何修复?根本没必要换车灯换总成,使用无痕修UV树脂胶液即可轻松搞定。

TADHE车灯无痕修复专用UV胶是一种经过处理的UV树脂胶&#xff0c;主要成份是改性丙烯酸UV树脂。应用在车灯的专业无痕修复领域。 车灯修复UV树脂有以下优点&#xff1a; 1. 快速修复&#xff1a;此UV树脂是一种用UV光照射在10秒内固化的材料。 2. 高强度&#xff1a;UV树脂固…

【npm下载包报错:CERT_HAS_EXPIRED,问题解决】

npm下载包报错&#xff1a;CERT_HAS_EXPIRED npm安装依赖的时候出现报错 根据第三行报错的提示得知报错原因是证书已过期 上网一查&#xff0c;原来常用的淘宝镜像早就换新域名了&#xff0c; 之前的镜像域名在2024年1月22日https证书到期了 替换为最新的地址就可以了 npm …

蛋白结构预测模型评价指标

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、蛋白结构预测模型评价指标TM-scorelDDT 二、Alphafold中的评价指标pLDDTpTMPAE 三、AlphaFold-multimer 蛋白结构的评价指标DockQipTM 总结参考资料 前言 本文汇总了AlphaFold和AlphaFold-mul…

线性表——单链表的增删查改(下)

本节继续上节未完成的链表增删查改接口的实现。这是上节的地址:线性表——单链表的增删查改&#xff08;上&#xff09;-CSDN博客 上节实现的接口如下&#xff1a; //申请链表节点函数接口 SLNode* BuySListNode(SLTDataType x); //单链表的打印函数接口 void SListPrint(SLNod…

探索比特币现货 ETF 对加密货币价格的潜在影响

撰文&#xff1a;Sean&#xff0c;Techub News 文章来源Techub News&#xff0c;搜Tehub News下载查看更多Web3资讯。 自美国比特币现货交易所交易基金&#xff08;ETF&#xff09;上市以来&#xff0c;比特币现货 ETF 的相关信息无疑成为了影响比特币价格及加密货币市场走向…

《Docker 简易速速上手小册》第10章 朝着 Docker Swarm 和 Kubernetes 迈进(2024 最新版)

文章目录 10.1 Docker Swarm 基础10.1.1 重点基础知识10.1.2 重点案例&#xff1a;Python Web 应用的 Docker Swarm 部署10.1.3 拓展案例 1&#xff1a;微服务架构的 Docker Swarm 部署10.1.4 拓展案例 2&#xff1a;使用 Docker Swarm 进行持续部署 10.2 Kubernetes 与 Docker…