Intel8086处理器-处理数据的方式/寻址方式/局部性原理/位运算/进制转换

本文主要是介绍Intel8086处理器-处理数据的方式/寻址方式/局部性原理/位运算/进制转换,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在计算机中,cpu将一切硬件,都看成内存,各种硬件在CPU的眼中都是下面这样子的
在这里插入图片描述

CPU对硬件的操作,其实就是和这些硬件的内存或者BIOS进行交互,CPU能做且只能做三件事

1.将某个地址中存储的字节转移到另一个地址处
2.将两个地址处的内容相加,并将结果存入某个地址
3.判断某地址处的字节是否为0

下面是8086CPU对内存的操作大致流程
在这里插入图片描述

日记:上图中可以看出是先取代码,IP自增,然后执行代码,而不是先执行代码,再IP自增,我个人认为此处应该与CPU的指令流水线实现有关,如果先执行,再IP自增,则指令流水线意义不大,此处纯属个人猜测

上图中涉及到8086段寄存器的概念,至于为什么会有段寄存器的存在可以参考这里

同时我们根据上图可以知道指令缓冲器是用来做什么的,如果CPU真的是一条一条的从内存中获取指令,那么效率实在是有些低了,正因为如此,CPU在指令缓冲器的位置又将其分成了一二三级缓存,在此,先要理解下面两个概念:局部性原理和缓存命中率

局部性原理

人们总是基于现在的情况,来推测未来的情况,比如,最近十分钟之内在下雨,那么我可以推测,未来一分钟之内还会下雨,毕竟未来一分钟之内下雨的概率比不下雨的概率要大很多,而缓存也同样是基于这个原理,缓存总是趋于最近使用过的数据或者指令,基于这个原理,所以,数据的分布地址不是随机的,而是聚集到一起的,这个原理,被称为局部性原理,局部性原理具体分为

空间局部性:接下来要访问的数据,和之前访问的数据,在内存地址中是临近的,所以当缓存数据A时,那么和A物理位置临近的数据,也会缓存起来

时间局部性:如果一个数据被访问,那么它接下来的一段时间之内,很有可能还会被访问,所以获取数据A时,会把A缓存起来

注意,局部性原理,并不是一个真正的原理,它是经验性主义,并且从统计学的角度来看,虽然不能百分之百为真,但是的确很有效

缓存命中率

既然了解了局部性原理,这个概念也就好解释了,因为局部性原理并不能保证缓存的数据一定有用,也并不能保证接下来要用的数据一定被缓存起来,但是,现代计算机依据统计学以及大量的样本实验,局部性原理的缓存命中率能高达0.9(百分之90,但是通常不说百分之多少,都用小数表示)

根据局部性原理和缓存命中率,就可以设计出缓存,绝大多数的缓存都是如下设计的:当从内存中获取一条指令的时候,顺便获取这条指令临近的一些指令,缓存起来

CPU可以处理下面三处过来的数据

1.CPU内部
直接从寄存器中获取数据,例如下面的汇编代码都是正确的

mov ax,cx
mov ax,dx
mov ax,ds

2.内存中
在汇编中,使用中括号包含寄存器的方式来描述从内存中获取数据,且只有4种寄存器可以用在[]中,它们分别是bx,bp,si,di,例如下面的汇编代码是正确的

mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]

下面的汇编代码是错误的

mov ax,[cx]
mov ax,[dx]
mov ax,[ds]

3.端口中
从端口中获取数据,本质上也是从内存中获取数据,只不过这个内存,不是我们常见的内存条,而是各个硬件的缓存中,例如网卡的缓存,键盘的缓存

CPU要读取多长的数据

在计算机中作为一个整体来处理或运算的一组二进制数码,称为一个字。英文是word。字是二进制数的基本单位,是数据总线宽度。比如在32位机器上,是按照4个字节作为一个整体来处理,所以32系统一个字的大小为4字节,同理,64位系统是按照8字节作为一个整体,所以64位系统中一个字的大小为8字节

汇编代码mov ax,[0]表示从ds+0的物理地址处读取数据,但是读取多长的数据呢?cpu是有一套自己的规范的,规则如下

1.通过寄存器位数决定操作多长的数据

mov ax,1;因为ax是16位寄存器,所以后面的数字1是2个字节
mov al,1;因为al是8位寄存器,所以后面的数字1是1个字节
mov eax,1;在32位cpu中,eax是32位寄存器,所以后面的数字1是4字节

2.通过指定位数决定是操作多少数据
使用X ptr参数指定

// 数字1是2个字节的数字1
mov word ptr ds:[0],1
// 数字1是1个字节的数字1
inc byte ptr [bx]
// 数字1是4个字节的数字1
inc dword ptr [ebx]

3.对栈的操作一定是字操作
具体字是多长取决于cpu位数

// 32位cpu压4个字节入栈,16位压1个字节入栈
push ax
// 32位cpu压4个字节入栈,16位不存在eax
push eax

寻址方式

“寻址”这两个字指的是给定一个物理地址,然后去内存中寻找该物理地址中的数据
段地址和偏移地址组合,叫做逻辑地址,偏移地址又叫做有效地址,在汇编代码中,给出有效地址的方式,叫做寻址方式,不同的写法,表示了不同的寻址方式,现在我用idata表示一个立即数,也可以说idata是一个常量

直接寻址
寻址方式:[idata]
示例:

mov ax,[66]

寄存器间接寻址
寻址方式:[bx]或者[bp]或者[si]或者[di]
示例:

mov ax,[bx]
mov ax,[bp]
mov ax,[si]
mov ax,[di]

寄存器相对寻址
寻址方式:[bx+idata]或者[bp+idata]或者[si+idata]或者[di+idata]
示例:

mov ax,[bx+123]
mov ax,[bp+234]
mov ax,[si+11H]
mov ax,[di+5638]

基址变址寻址
寻址方式:[bx+si]或者[bx+di]或者[bp+si]或者[bp+di],此处可参考通用寄存器(7)BP会更好记忆
示例:

mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp+si]
mov ax,[bp+di]

相对基址变址寻址
寻址方式:[bx+si+idata]或者[bx+di+idata]或者[bp+si+idata]或者[bp+di+idata],就是在基址变址寻址的方式上加上了立即数(idata)
示例:

mov ax,[bx+si+0123H]
mov ax,[bx+di+89AB]
mov ax,[bp+si+89CC]]
mov ax,[bp+di+666H]

进制的概念

进制转换
由于10进制转换成16进制或者转8进制很复杂,所以通常情况都先将10进制转换成2进制,在从2进制转换成16或者8

例如:把二进制数101111转换成八进制数和十六进制数
二进制数转换成八进制数的方法是:整数部分从小数点向左数,每三位二进制数码为一组,最后不足三位补0,读出三位二进制数对应的十进制数值,就是整数部分转换的八进制数;小数部分从小数点向右数,也是每三位二进制数码为一组,最后不足三位补0,读出三位二进制数对应的十进制数值,就是小数部分转换的八进制小数的数值。即:2进制101111=8进制57。下面是分解步骤
1.因为2的3次方是8,所以每3位分解101111,于是变成了【101,111】
2.101对应的8进制是5,111对应的8进制是7,所以等于57
同理,2进制101111转换16进制
1.因为2的4次方是16,所以每4位分解101111,于是变成了【0010,1111】
2.0010对应的16进制是2,1111对应的16进制是15,所以等于2F

在C++中的表示

std::cout << 10 << std::endl; //打印10
std::cout << 0b10 << std::endl;//0b开头表示二进制,打印出2
std::cout << 010 << std::endl;//0开头表示8进制
std::cout << 0x10 << std::endl;//0x开头表示16进制

负数的补码:
补码是负数在内存中的表示,比方说-9这个数,会将-9的补码存在内存中,因为补码的存在,所以cpu就可以把减法当成加法来处理,这样cpu就不需要设计两套电路(一个加法电路,一个减法电路),这是cpu使用补码的唯一原因,下面是对负9取其补码

(1)-9的绝对值是9
(2)9的二进制是:0000 1001
(3)对9的二进制按位取反:1111 0110
(4)对上述的值加1:1111 0111
结果:所以-9的补码就是:1111 0111

现有10-9=1这个计算,则用上面的补码表达就是

10-91
0000 1010+1111 0111=0000 0001

NOTE: 可以根据首位是不是0,也就是说char类型是不是<0来判断该字符是不是ASCII字符,因为ASCII只使用了后7位,最高位没用

左移/右移

逻辑右移:补0
算数右移:补符号位,如果符号位是1,则补1,符号位是0,则补0
左移:左移不区分逻辑还是算数,也不区分正负数,右侧补0
注:多数C++编译器会采用算数右移

按位与:参与运算的双方都为1,结果为1,否则结果为0,该操作可以实现下面功能
1.清0,如果将一个数清0,则可以直接与0做与运算,下面是清0的java代码

	int a = 3;a &= 0;System.out.println(a);

2.可以取出指定数中的某些位,下面该操作的java代码

// 十进制666对应的二进制位:10 1001 1010
int a = 666;
// 取右侧4位,那么就与1111
a &= 0xF;
System.out.println(a);
// 取右侧1位,那么就与0001
a &= 0x1;
System.out.println(a);
// 取右侧5位,那么就与1 1111
a &= 0x1F;
System.out.println(a);
// 取从右侧开始数第3位,那么就与0100
a &= 0x4;
System.out.println(a);

按位异或:参与运算的两个位不相同,结果为1,若相同,结果为0

1^1==0;
0^0==0;
1^0==1;

异或操作具有以下特性
1.如果一个bit位与0进行异或,则该bit位将不变
2.如果一个bit位与1进行异或,0变1,1变0,也就是所谓的翻转

// 十进制666对应的二进制位:10 1001 1010
int a = 666;
// 异或1111
int b=0xF;
// c为661,对应的二进制是:10 1001 0101
int c=a^b;

3.两个变量对调

int a = 3;
int b = 5;
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a);
System.out.println(b);

这篇关于Intel8086处理器-处理数据的方式/寻址方式/局部性原理/位运算/进制转换的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1057333

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

hdu4407(容斥原理)

题意:给一串数字1,2,......n,两个操作:1、修改第k个数字,2、查询区间[l,r]中与n互质的数之和。 解题思路:咱一看,像线段树,但是如果用线段树做,那么每个区间一定要记录所有的素因子,这样会超内存。然后我就做不来了。后来看了题解,原来是用容斥原理来做的。还记得这道题目吗?求区间[1,r]中与p互质的数的个数,如果不会的话就先去做那题吧。现在这题是求区间[l,r]中与n互质的数的和