首页 > 编程语言 >计算机流水线在正常程序中的体现(效果可视)

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

时间:2023-04-01 10:45:29浏览次数:32  
标签:计算机 16 32 代码 mov cx 可视 流水线

众所周知,流水线技术对于软件开发人员不是可见的(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位来解码

 

标签:计算机,16,32,代码,mov,cx,可视,流水线
From: https://www.cnblogs.com/haiyuyuyu/p/17277582.html

相关文章

  • 2023.3.29计算机导论
     ......
  • 天翼云可视化大屏开发的几个问题
    1.预配置参数无法满足我的需求,想要自定义样式怎么做天翼云大屏使用的是echarts平台,向上层封装了option为config,我们可以通过js获取一个组件然后getOption然后查看echart官方文档了解参数然后setOption然后预览效果 2.js代码不生效,且时不时出现卡顿其实这是一个问题,原因......
  • 分析微信好友数据,可以可视化好友男女比例分布,可视化省份来源,可视化签名的情感强度值
    一、分析数据可视化好友男女分布比例 1plt.rcParams['font.sans-serif']=['SimHei']2#用来正常显示中文标签3plt.rcParams['axes.unicode_minus']=False45#1.读取csv文件,把性别信息读取出来6defgetSex(filename):7lstsex=[]8withopen(fi......
  • 计算机视觉中的主动学习(Active Learning)介绍
    前言 ActiveLearning主动学习是机器学习(ML)的一个研究领域,旨在通过以智能方式查询管道的下一个数据来降低构建新机器学习解决方案的成本和时间。在开发新的AI解决方案和处理图像、音频或文本等非结构化数据时,我们通常需要人工对数据进行注释,然后才能使用它们来训练我们的模......
  • 可视化
    2D动画transformtransform属性允许你旋转,缩放,倾斜或平移给定元素平移:translate(x,y)缩放:scale(x,y)旋转:rotate(deg)倾斜:skew(deg,deg)坐标系用transform属性变换的元素会受transform-origin的影响,该属性用于指定形变的原点。css中的每个元素都有一个坐标系,其原点位于元......
  • R语言SVM支持向量机、文本挖掘新闻语料情感情绪分类和词云可视化
    全文链接:http://tecdat.cn/?p=32032原文出处:拓端数据部落公众号支持向量机(SVM)是一种机器学习方法,基于结构风险最小化原则,即通过少量样本数据,得到尽可能多的样本数据。支持向量机对线性问题进行处理,能解决非线性分类问题。本文介绍了R语言中的SVM工具箱及其支持向量机(SVM)方法,并......
  • Docker 轻量级可视化工具 Portainer
    1.概述Portainer是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。官网:https://www.portainer.io/2.在Docker镜像仓库查找Portainer镜像dockerhub镜像仓库3.拉取Portainer镜像#拉取nginx镜像dockerpullportainer......
  • Python计算机视觉基础实验3-显著性检测(HC&FC)
    一、实验基础图像显著性检测图像的显著性是指对于给定一副真实世界中的场景图像,人们会自动地识别出感兴趣区域,忽略掉不感兴趣的区域,即将注意力集中在图像中某些显著的部分区域。图像的注意预测,也称视觉显著性检测,指通过智能算法模拟人的视觉系统特点,预测人类的视觉凝视点(就是全神贯......
  • 基于pytorch 的loss监控可视化
    基于pytorch的loss监控可视化绘制可以train和val在一张图上的趋势图。1安装tensorboardpipinstalltensorboard2嵌入代码工程1)定义数据集#-------------......
  • BI数据可视化|排版混乱、无重点怎么办?
    BI数据可视化报表往往需要容纳大量的数据信息,为决策提供丰富详尽的数据支持。但也这引发另一个问题,那就是BI数据可视化报表的排版布局。BI数据可视化报表要将大量的数据信息......