咱首先都知道CPU要从内存中读数据吧。
然后CPU要从内存中读数据,那CPU肯定要知道一些内存的信息吧。就像邀请女生去哪玩,你总要知道她爱玩什么吧,那我们CPU知道内存的信息有三种:
1.存储单元的地址(地址信息)
2.读还是写的命令(控制信息)
3.读或写的数据(数据信息)
以上三种信息通过总线传输,1通过地址线传输,2是控制线,3是数据线。
地址总线的宽度决定了CPU的寻址能力。
为什么这么说?请看题:
1个拥有10根地址总线的CPU能传输多少种不同类型的数据?
问题的答案是2的10次方个,因为每一根的状态只有两种,高电平-1或者是低电平-0。
那么假如我们的CPU有N根地址线 ,那么这个CPU可以找到2的N次方个内存单元哦,所以N越大我们CPU可以找到的地址越多。
数据总线的宽度决定了CPU传输数据的能力(一次数据传输)
一根数据总线一次可以传一个二进制数据,所以8根数据总线一次可以传一个字节的数据。
8088CPU的数据总线宽度为8,8086CPU的数据总线宽度为16
那么出个题,假设我们有十六进制数89D8H,两个CPU分别都是怎么传送的呢?
像8088第一次传D8,第二次传89
而8086直接一次就传完了,所以8086>8088,嘿嘿。
控制总线的作用是实现CPU对外部器件的控制,因为读或者写的指令是在控制总线上传输的。
总结一下三个线:
地址总线的宽度决定了CPU的寻址能力
数据总线的宽度决定了CPU传输数据的能力(一次数据传输)
控制总线的宽度决定了CPU对外部器件的控制能力。
电脑主板不知道大家见过没有,主板上的一些东西就是通过总线相连的
先说结论,我们有很多不同的存储器,但是CPU只把这些存储器这些不同的存储器当做一块内存来看待。看图,可以看到有很多不同的存储器。
存储器从读写上分为两类:随机存储器(RAM)和只读存储器(ROM,显卡上的ROM称为显存)
但是在CPU的眼里是这样的:
可以看到CPU都把它们统一看作内存(地址空间)。
一个CPU由运算器,控制器和寄存器构成,这些东西通过内部总线互相连接。其中寄存器是我们需要重点关注的点,因为我们可以通过写代码的方式和寄存器实现交互。然后先介绍一下CPU里的这些器件都有什么用吧。
运算器:运算器进行信息处理
控制器:控制器控制各种器件进行工作
寄存器:寄存器进行信息存储(这哥仨其实和1.7节中的功能很相像,实际上这三个东西就是对应了CPU中的三个个功能,详情见1.7节)
内部总线:连接上面的哥仨,让他们进行数据的传输。
下面来说说CPU有哪些寄存器吧。不同的CPU的寄存器的结构和个数可能有点差别,这里举8086CPU的例子,他有:AX,BX,CX,DX,SI,DI,SP,BP,IP,CS,SS,DS,ES,PSW这些种类的寄存器,之后会对这些寄存器做介绍。
什么是通用寄存器?AX,BX,CX,DX这类后面带X,存放一般性的数据的就叫做通用寄存器。
顺带提一嘴,8086CPU的所有寄存器都是16位的,那么上面提到的通用寄存器就自然也是16位的了,通用寄存器如图所示:
值得一提的是,为了保证兼容性,8086CPU的AX,BX,CX,DX这些寄存器都可以分为两个独立使用的8位的寄存器来使用。
举个例子:
AX可分为AH和AL
BX可分为BH和BL,以此类推
AH对应AX中的高8位,AL对应AX中的低8位。
如图所示:
什么是字?
字(word)实际上就是两个字节(Byte)。
又因为一个字节可以存在8位寄存器中,因为一个位等于一个bit。
所以一个字(注意是字!不是字节)可以存在16位寄存器中并等于两个字节。第一个字节称作这个字的高位字节,第二个字节称为这个字的低位字节,如图所示:
让我们看看以下几条汇编语句,看看他们分别是什么意思?
还有一点关于数据过长的问题怎么解决,将会在后续进行阐述。
在进行运算的时候需要注意,指令的两个操作对象的位数应当是一致的。下面是错误示范:
例如:mov ax,al(在16位寄存器和8位寄存器中传送数据)
mov al,20000(一个8位寄存器最大只能存255的数据,即2的8次方)
add al,100H(将一个高于8位的数据加到一个8位寄存器中)
之前我们说到的那张图,如图:
CPU连接的RAM啊,ROM,RAM等等之类的东西,我们都把他们当作一块内存单元(就是途中的地址空间)。
那么你CPU要访问这块内存单元,那么你CPU肯定要生成一个地址吧,这个CPU内部生成的地址就叫做物理地址。
什么是16位结构的CPU呢?
概括一下,16位的CPU,能够一次性处理,传输,暂时存储16位的地址,这个也正好对应CPU的三个功能(1.7以及第二章中有提到)。
处理的工作是运算器做的。
暂时存储的工作是寄存器做的
传输则指的是寄存器和运算器之间的通路
因为之前说到,物理地址是我们CPU内部生成的,所以下面就来介绍一下CPU是怎么生成这个物理地址的。
1)这个其他部件是CPU中的,CPU的其他部件将自己内部生成的16位段地址和16位的偏移地址送入地址加法器
2)重点!地址加法器采用段地址×16+偏移地址=物理地址得到物理地址
3)地址加法器通过内部总线将20位物理地址送入输入输出控制电路,然后再从20位地址总线将地址传到内存。
本章重点,敲黑板!物理地址=段地址×16+偏移地址。
还记得这幅图吗,这幅图中有一个其他部件。这个其他部件提供了段地址和偏移地址。那么提供了段地址的就是我们的段寄存器,提供了偏移地址的就是我们的IP寄存器
顺带一提,8086CPU中有四个段寄存器:CS,DS,SS,ES
CS和IP是所有寄存器中最重要的两个,因为他们两个指定了CPU要读取指令的地址。
假设我们的CS中的内容为M,IP中的内容为N,那么我们之前说到的物理地址=(段地址×16)+偏移地址,其中段地址就对应M,偏移地址就对应N。
先说结论:
8086CPU中大部分寄存器的值,都可以通过mov来改变,但是无法改变CS,IP中的值,mov指令又称为传送指令
那么如果要修改我们CS,IP中的值,需要使用指令:jmp指令,jmp指令又称为转移指令
①使用jmp指令同时修改CS和IP的形式为:
jmp段地址:偏移地址
例如jmp 2AE3:3
②仅修改IP的地址:
jmp 某个合法寄存器
例如jmp ax,IP寄存器中的值会被修改为IP的
本章将从内存访问的角度去学习几个寄存器
如图所示:我们的每一个块被称作一个内存单元,一个内存单元等于一个字节(8bit),又因为一个字等于两个字节,所以我们图中两块才组成一个字。
假设我们用0,1两块存储一个字,那么0号是低地址单元,1号是高地址单元。
这里王爽介绍了一个概念:字单元,字单元即是由两个图中块(内存单元)的东西。