当执行汇编指令MOV [0001H] 01H时,CPU都做了什么?

news2024/11/24 2:50:17

今天和几位单位大佬聊天时,讨论到一个非常有趣的问题-当程序执行MOV [0001H], 01H计算机实际上都做了哪些工作?乍一看这个问题平平无奇,CPU只是把立即数01H放在了地址为0001的内存里,但仔细想想这个问题远没有那么简单,由于现代计算机体系中CPU速度比内存要快2到3个个数量级,因此从CPU执行MOV指令,到实际把01H写入内存之间,还有非常漫长而复杂的过程。

为了回答好这个问题,我翻阅了一些资料,发现不同时代的CPU在执行这个操作时,行为也不一样,下面分享一下我的成果。

一.386及之前的CPU

从现在的角度来看,386及以前的CPU完全是上古时期的物件,还没有指令流水线的概念,当CPU执行这条汇编指令时,会和我们的第一印象差不多,基本会是按照以下步骤进行工作:

1.取指、译码,简单说就是从可执行文件中把MOV的二进制表示100010翻译出来。

2. 取操作数,将立即数01H加载到内部寄存器。

3. 取内存地址,将内存地址0001H(地址为0001的内存单元,不考虑段寄存器加偏移量的形式)加载到内部寄存器。

4. 指令执行,将内存地址0001H所指向的内存单元与内部寄存器中的数据(即01H)进行写入操作,完成将01H写入到内存单元000H1的操作。

二.486与酷睿之前的CPU

这个阶段的CPU和386相比增加了指令流水线的概念,我们知道CPU的每个动作都需要用晶体震荡而触发,想完成一个最简单的指令也需要取指、译码、取操作数、执行以及获取操作结果等若干步骤,而每个步骤都需要一次晶体震荡才能推进,因此在流水线技术出现之前执行一条指令至少需要5到6次晶体震荡周期才能完成。

指令/时刻

T1

T2

T3

T4

T5

MOV

取指

译码

取操作数

执行

取结果

而流水线的思想就是将不同指令的译码、寻址、执行等操作,放在一个震荡周期中并发完成。

指令/时刻

T1

T2

T3

T4

T5

T6

T7

T8

指令1

取指

译码

取操作数

执行

取结果 

指令2

取指

译码

取操作数

执行

取结果 

指令3

取指

译码

取操作数

执行

取结果 

指令4

取指

译码

取操作数

执行

取结果 

指令5

取指

译码

取操作数

执行

指令6

取指

译码

取操作数

指令7

取指

译码

指令8

取指

但上述升级对于MOV [0001H] 01H指令的执行没有带来太多本质变化。

三、酷睿后的现代多核CPU

在2006年英特尔发布一代酷睿处理器之后,现代桌面CPU正式进入了多核时代,现代CPU在执行指令时会和内存交互,但CPU本身只是直接操作高速缓存而不会直接操作内存。

MESI协议简介

现代X86 CPU的高速缓存(Cache),包括多级缓存(L1、L2、L3)。高速缓存是位于CPU内部的一块快速访问的存储区域,用于临时存储从主内存中读取的指令和数据。当CPU需要访问内存时,它首先会检查高速缓存,如果所需数据已经存在于高速缓存中,CPU会直接从高速缓存中读取或写入数据,无需访问主内存。其中L1和L2为每个CPU核心的专属缓存,L3为各核心的共享使用。 CPU多核心之间的高速缓存同步一般按照MESI协议进行,即每个缓存行都有四个状态,分别是E(exclusive)、M(modified)、S(shared)、I(invalid),说明如下:

M:代表该缓存行中的内容被修改,并且该缓存行只被缓存在该CPU中。这个状态代表缓存行的数据和内存中的数据不同。

E:代表该缓存行对应内存中的内容只被该CPU缓存,其他CPU没有缓存该缓存对应内存行中的内容。这个状态的缓存行中的数据与内存的数据一致。

I:代表该缓存行中的内容无效。

:该状态意味着数不只存在在本地CPU缓存中,还存在其它CPU的缓存中。这个状态的数据和内存中的数据也是一致的。不过只要有CPU修改该缓存行都会使该行状态变成 I 。

四种状态的状态转移图如下:

 

​在初始执行MOV [0001H] 01H,实际执行这条语句的核心上会触发local write的动作,这实际会把内存地址对应的缓址行置为Modify状态,而Modify状态下内存和缓存的内容实际是不一致的。而01H到底会不会被写回内存也是需要讨论的。

 01H被显式写入内存0001H:这种情况也有其他其它核心也发起了对于0001H地址的读取操作,即发起remote read,在这种情况缓存的状态会从Modify迁移到Share状态,而Share状态下缓存中的数据会被显示的写回内存。也就是MOV [0001H] 01H被实际执行完成。

 01H未被写入内存0001H:这种情有其他其它核心发对于地于0001H的写操作,即发起remote wri,e,这种情况下,在这种情况缓存的状态会从Modify迁移到Invalid状态,而Invalid状态下的调整缓存数据不会再被写入内存了。

内存写入状态未知:如果0001H地址的读写一直由同一核心操作,那么这种情况下缓存的状态就一直是Modify,那么这时候01H是否被写入内存,就取决于0001H这个内存地址是否能始终处于热点访问状态了,如果该地址一直在缓存中不被换出的话,那么01H的值有可能不会被写入内存,只有当该地址从缓存中换出时才会触发内存的回写操作。

总之,现代的CPU在执行MOV [0001H] 01H这样一条平平无奇的指令时,其实背后也做了很多工作,甚至操作完成后01H的值到底有没有写入到内存地址0001H也是很不确定的,希望通过本文梳理各阶段CPU执行MOV [0001H] 01H指令的过程,可以帮助读者更好的理解现代CPU的工作原理。

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

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

相关文章

Synchronized八锁

/** * Description: 8 锁 * 1 标准访问,先打印短信还是邮件 ------sendSMS ------sendEmail 2 停 4 秒在短信方法内,先打印短信还是邮件 ------sendSMS ------sendEmail 3 新增普通的 hello 方法,是先打短信还是 hello ------getHello ------…

阿里云服务器IP地址查看方法(公网/私网)

阿里云服务器IP地址在哪查看?在云服务器ECS管理控制台即可查看,阿里云服务器IP地址包括公网IP和私有IP,阿里云百科分享阿里云服务器IP地址查询方法: 目录 阿里云服务器IP地址查询 阿里云服务器IP地址查询 1、登录到阿里云服务器…

HTML基础知识,网页和报表都可用

首先我们先介绍一下网页: 网页时构成网站的基本元素,它通常由图片,链接,文字,声音,视频等元素组成。通常我们看到的网页,常见以.htm或.html后缀结尾的文件,因此我们把它俗称为HTML文…

易服客工作室:Elementor AI简介 – 彻底改变您创建网站的方式

Elementor 作为领先的 WordPress 网站构建器,是第一个添加本机 AI 集成的。Elementor AI 的第一阶段将使您能够生成和改进文本和自定义代码(HTML、自定义代码和自定义 CSS)。我们还已经在进行以下阶段的工作,其中将包括基于人工智…

uniapp 使用 uni push 2.0 推送消息

因为之前使用uni push 1.0,开通账号和配置厂商就不写了。只说一点,配置厂商很重要,不然收不到离线推送的消息。那么就直接开始咯!!! 一、创建并关联云服务空间 1.创建云服务空间,右键项目【创…

『C语言初阶』第八章 -隐式类型转换规则

前言 今天小羊又来给铁汁们分享关于C语言的隐式类型转换规则,在C语言中类型转换方式可分为隐式类型转换和显式类型转换(强制类型转换),其中隐式类型转换是由编译器自动进行,无需程序员干预,今天小羊课堂说的就是关于隐式类型转换…

阻塞和非阻塞,同步和异步

文章目录 典型的一次IO的两个阶段IO多路复用是同步还是异步? 典型的一次IO的两个阶段 数据就绪和数据读写 同步:需要应用程序自己操作 IO多路复用是同步还是异步? epoll也是同步的 具体数据读取还是通过应用程序自己完成的 只有使用了特…

快速开发平台 WebBuilder 的功能特点

WebBuilder 是一款强大,全面和高效的应用开发和运行平台。基于浏览器的集成开发环境,智能化的设计,能轻松完成常规桌面应用和面向手机等的移动应用开发。高效、稳定和可扩展的特点,适合复杂企业级应用的运行。跨平台、数据库和浏览…

线性回归例子

转自:https://www.cnblogs.com/BlairGrowing/p/15061912.html 刚开始接触深度学习和机器学习,由于是非全日制,也没有方向感,缺乏学习氛围、圈子,全靠自己业余时间瞎琢磨,犹如黑夜中的摸索着过河。 只是顺…

易服客工作室:WordPress是什么?初学者的解释

目录 什么是WordPress? WordPress可以制作什么类型的网站? 谁制作了WordPress?它已经存在多久了? 谁使用 WordPress? 白宫网站 微软 滚石乐队 为什么要使用 WordPress? WordPress 是免费且…

【不支持发行版本 5】错误解决

说明&#xff1a;启动项目报下面的错误&#xff0c;不支持发行版本 5 解决&#xff1a;在pom文件中添加下面这两行配置&#xff0c;修改成你自己安装的jdk版本 <properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target&g…

TienChin 新建业务菜单

首先是移动菜单&#xff0c;参考下图将菜单移动到下图结构&#xff1a; 我这里将系统监控&#xff0c;系统工具都移动到了系统管理下面&#xff0c;并且排了个序&#xff0c;将多级菜单放在了一起&#xff0c;这样看起来更加的清晰。 修改一下系统管理(100)与TienChin健身官网(…

Blazor:组件生命周期和刷新机制详解

文章目录 前言生命周期子组件设置事件刷新为什么传入非基础元素&#xff0c;会强制刷新 自动刷新逻辑如何解决委托事件强制刷新问题 前言 对于组件化来说&#xff0c;生命周期是必须掌握的知识&#xff0c;只有掌握了生命周期才能更好的去设置数据的变化。 Blazor 生命周期 微…

99. for循环练习题-3种方式输出0-9

【目录】 文章目录 99. for循环练习题-3种方式输出0-91. for循环和while循环的区别2. 输出 0~(n-1)的数字2.1 基础代码2.2 自定义函数代码2.3 异常处理语句代码 【正文】 99. for循环练习题-3种方式输出0-9 1. for循环和while循环的区别 for循环和while循环都用于重复执行特定…

AI Infra工具关键能力解析:数据准备、模型训练、模型部署与整合

在预训练大模型时代,我们可以从应用落地过程里提炼出标准化的工作流,AI Infra的投资机会得以演绎。传统ML时代AI模型通用性较低,项目落地停留在“手工作坊”阶段,流程难以统一规范。而大规模预训练模型统一了“从0到1”的技术路径,具备解决问题的泛化能力,能够赋能“从1到…

WiFi小工具homedale,可以切换同名WiFi节点

有一个很小众的需求&#xff0c;就是多个路由器组网时候&#xff0c;PC有时不会自动切换同名WiFi&#xff0c;homedale这个工具可以满足手动切换需求 这个界面可以看到所有节点列表&#xff0c;可以看到有很多同名的 可以选择自己想要的那个&#xff0c;比如信道/信号强度&am…

avd(emulator)设置代理以及与pc互访

默认pc127.0.0.1是还回ip&#xff0c;模拟器使用127.0.0.1指向了自己&#xff0c;模拟器使用10.0.2.2指代pc地址&#xff0c;这点在官方文档有说明可以查看,所以想要挂代理抓包就需要为模拟器设置代理为10.0.2.2 安卓模拟器设置代理 前提&#xff1a;本机开启了代理如&#xf…

nodejs+vue+elementui健康饮食美食菜谱分享网站系统

本系统采用了nodejs语言的vue框架&#xff0c;数据采用MySQL数据库进行存储。结合B/S结构进行开发设计&#xff0c;功能强大&#xff0c;界面化操作便于上手。本系统具有良好的易用性和安全性&#xff0c;系统功能齐全&#xff0c;可以满足饮食分享管理的相关工作。 语言 node.…

05 mysql innodb page

前言 最近看到了 何登成 大佬的 "深入MySQL源码 -- Step By Step" 的 pdf 呵呵 似乎是找到了一些 方向 之前对于 mysql 方面的东西, 更多的仅仅是简单的使用[业务中的各种增删改查], 以及一些面试题的背诵 这里会参照 MySQL Internals Manual 来大致的看一下 i…

06_Hudi案例实战

本文来自"黑马程序员"hudi课程 6.第六章 Hudi案例实战 6.1 案例架构 6.2 业务数据 6.2.1 消息数据格式 6.2.2 数据生成 6.3 七陌数据采集 6.3.1 Apache Flume 是什么 6.3.2 Apache Flume 运行机制 6.3.3 Apache Flume 安装部署 6.3.4 Apache Flume 入门程序 6.3.5 七…