计算机流水线在正常程序中的体现(效果可视)

news/2024/11/29 3:49:15/

众所周知,流水线技术对于软件开发人员不是可见的(visiable),毕竟已经在在机器语言之下,是组成机器语言的基本逻辑

但今天我就带领大家看看我新发现的结果,那就是流水线的可视效果,包括流水线预测技术的侧面体现,当然也是可见的

首先我先声明一下需要的基础,需要懂16位以及32位操作系统下的汇编语言,不懂者当然是不能体会到这篇文章的意图的

知识点来源:x86汇编语言从实模式到保护模式(希望以后大家写博客能标出知识点来源,帮助小白纠正知识是从博客学来的坏习惯,以及给大家一个深入学习的机会)

好了,直接开始看代码(全汇编)

 1    mov eax,cr0 2    or eax,1 3    mov cr0,eax ;设置PE位    并以32位模式开始译码4    5    ;以下进入保护模式... ... 6    ;jmp dword 0x0008:flush ;16位的描述符选择子:32位偏移 7    8    ;清流水线并串行化处理器 9    [bits 32];将之后的代码全部解析成32位模式代码 
10    flush: 
11    mov cx,0100 ;加载数据段选择子(0x10) 

1-3行就是将16位实模式转换到32位保护模式,并且将16位下的译码模式转换成32位的译码模式

第6行的代码是跳转到flush标签,也就是第10行,不过我在这里先行给它注释

第9行是一条对于编译器有作用的标签,和C语言中的#pragma comment差不多,这里的意思是之后的代码全部编译成32位的汇编

下面是运行时的反汇编代码

 这两条连续的反汇编指令是从汇编代码中的第三行开始的,我把汇编代码以及机器指令一并圈了出来

大家有没有发现不对劲,第二条反汇编指令和我们手写的汇编指令不能说是看不出来,只能说是毫无关联,

明明我们的操作数是cx,这边竟然变成了ecx,还有立即数,明明是0x0010,这边变成了0xd98e0010,也不怪大家看不出来,这换谁都一样

大家都知道,机器是很傻的,我们叫他干啥,他就干啥,这边为什么就没有听我们的话呢

其实就是因为计算机流水线的缘故,大家可以回忆一下流水线的特性(不会等一条指令执行完了,再取下一条指令)

我们再仔细观察一下第二条指令的机器代码, 66 b9 10 00 8e d9

66这这机器指令前缀的作用是16位模式下,将16位寄存器转成32位寄存器,

32位模式下,将32位寄存器转成16位寄存器,

因为32位和16位下的代表寄存器的机器码是一样的,就比如16位下cx是d9,而32位模式下ecx也是d9,那总得有机器码在32位下表示cx吧

就拿上面这条66 b9 10 00 8e d9 举例

32位模式下这条指令是 :mov cx,0x0010(8e,d9之所以没了,就是因为cx装不下,本来这就是下一条指令的内容)

而16位模式下就是:      mov ecx,0xd98e0010

很明显啊,我们的代码使用了16位下的解码方式,但是我们明明已经进入了保护模式

而究其原因就是计算机流水线的缘故了,很明显是我们在mov cr0,eax之前就开始译码(decode)了mov cx,0x0010,而且是以16位模式译码,直接导致了程序的失控

现在我们把汇编代码第6行的注释打开,让jmp生效(虽然我的学过的流水线遇到jmp是不会导致流水线暂停的,但有可能我虚拟机模拟的硬件太老)

 可以看到,这下反汇编指令就是完全正确的了,也的确说明了流水线发生了暂停,不然我们解码肯定会以16位来解码


http://www.ppmy.cn/news/979159.html

相关文章

JavaScript学习 -- Base64编码

Base64编码是一种常用的将二进制数据转换为文本数据的方式。在JavaScript中,我们可以通过使用Base64编码算法,将二进制数据转换为可读的文本数据,以便于在网络传输、文件传输等场景下使用。在本篇博客中,我们将介绍Base64编码的基…

vue全局字体不生效的问题

今天接手了一个新项目,在熟悉项目的时候,意外发现,网站的字体和设计稿上的字体不一样。 于是查看一番之后,发现引入字体的方式错了。 原代码是这样的: body {font-family: HONORSansCN-DemiBold, HONORSansCN;font-…

如何轻松获取短视频资源?

短视频里面的素材其实主要包含三大部分: 拍摄的原创素材:比如情节剧、风景视频、知识百科、热门解说、便装、美妆、vlog等视频需要使用的素材 二次创作的素材:比如影视剪辑视频、鬼畜视频、文史解说等内容需要使用的素材 特效素材&#xf…

右击不显示TortoiseGit图标处理方法

第一种 右键--》TortoiseGIt--》setting--》Icon Overlays--》Status cache,按照下图设置,然后重启电脑。 第二种 进入注册信息,按照步骤找到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIden…

pytorch安装GPU版本 (Cuda12.1)教程: Windows、Mac和Linux系统下GPU版PyTorch(CUDA 12.1)快速安装

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

Spring Boot 日志文件有什么用

目录 一、自定义打印日志 1.1 日志框架说明 1.2 实现自定义打印日志 1.3 日志的格式说明 2.1 日志的级别 2.2 设置日志级别的作用: 2.3 如何设置日志的级别 二、 日志的持久化 3.1 设置日志保存路径 (在 .yml 配置文件中设置日志保存路径&…

ipvs 原理解析(二)netfilter hook

文章目录 netfilter hook netfilter hook 在 __ipvs_vs_init 中有通过 nf_register_net_hooks 注册 hook 函数到 netfilter 框架 如 ipv4 下的 static const struct nf_hook_ops ip_vs_ops[] {/* After packet filtering, change source only for VS/NAT */{.hook ip_vs_…

使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案

为何archiveRootObject和unarchiveObjectWithFile正常,而archivedDataWithRootObject和unarchivedObjectOfClasses一直报错。 [NSKeyedArchiver archiveRootObject:account toFile:path];和c PPAccountModel *account [NSKeyedUnarchiver unarchiveObjectWithFile:…