cpu对存储的器的读取
cpu要想进行数据的读写,必须与(芯片)进行交互
- 存储单元的地址(地址信息)
- 器件的选择,读或写的命令(控制信息)
- 读或写的数据(数据信息)
在计算机当中,专门有连接cpu和其他芯片的导线,称做“总线”,总线的逻辑又分为:地址总线, 控制总线和数据总线。
地址总线
CPU是通过地址总线来指定存储单元的,可见地址总线上能传送多少个不同的信息,cpu就可以对多少个存储单元进行寻址。
一个cpu有N个地址总线,可以说cpu的地址总线的宽度为N,最多可以寻找2^N次方个内存单元
数据总线
CPU与内存或者其他器件之间的数据传送是通过数据总线来进行的。数据总线的宽度决定了CPU和外界数据的传送速度,8根数据总线可以传送一个8位的二进制数据(一个字节),16根则可以传送2个字节。
控制总线
CPU对外部器件的控制是通过控制总线来进行的,有多少根控制总线,意味着CPU提供了对外部器件的多少种控制,所以控制总线的宽度决定CPU对外部器件的控制能力
知识点总结
- 存储单元:通常1字节代表一个存储单元,也就是1Byte。同时等同于8bit(比特)
- 地址总线的宽度和寻址之间的关系是2^N(N带表根数),例如16根的寻址大小为 2^102^6 = 641024Byte = 64KB
- 数据总线的宽度和传输数据的大小关系为8根 = 1Byte(字节),例如:总线宽度为8根,一次性可以传输 1(B),16根可以传输2(B)
- 从内存中读取数据,首先要了解数据总线的宽度,根据数据总线的宽度去评估传输的大小,例如:从内存中读取1KB的数据,8086(16g根)至少要读512次。(16根每次传输2字节,所以1024字节/2 = 512次)
- 在存储器中,数据和程序是以二进制形式进行存放。
寄存器
CPU由运算器,控制器,寄存器等器件构成,这些器件靠内部总线相连,总线相当于CPU的外部总线,内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其他器件的联系。
- 运算器进行信息处理
- 寄存器进行信息存储
- 控制器控制各个器件进行工作
- 内部总线连接各个器件,在它们之间进行数据的传送
- CPU的主要部件就是寄存器,寄存器是可以进行读写的部件。
- 不同的CPU,寄存器的个数,结构是不同的。
通用寄存器
8086CPU的所有寄存器是16位的,可以存放两个字节,AX,BX,CX,DX.这四个寄存器通常存放一般性的数据,被称为“通用寄存器”
- AX可分为AH和AL
- BX可分为BH和BL
- CX可分为CH和CL
- DX可分为DH和DL
字在存储器中存储
- 字节(byte):由8bit组成,可以存在8位寄存器中。
- 字(word):一个字由两个字节组成,这两个字节分为高位字节和低位字节
几条汇编指令
知识点总结
- 十六进制数的加减法的进/借位规则为:借一当十六,逢十六进一。
1,借一当十六:3D25H - 05C3H 运算方式如下
5-3 = 2,2-c = 2+16-12 = 6(由于2-12小于0,需要借一位,一位为16)
D-5 = 13-5-1 = 7(在减去一个1是因为上面运算2-c借了一位)
3-0 = 3 ,最终结果为:3762H
2,逢十六进一:同理相加大于16则进一位,例如:3762H+05C3H
2+3 = 5,6+c = 6+12 = 18 = (18-16) = 2(此时大于16要进一位)
7+5 = 12 +1 = 13 = D(由于6+12进一位所以需要+1)
3+0 = 3,最终结果为:3D25H - 在进行汇编指令运算时(add ax,bx)他们的位数要一致才可以
- 十进制转换十六进制,将当前数值每次除以16取余。例如:4877转换16进制
1,4766/16 = 304 余13(D)
2,304/16 = 19 余0
3,19/16 = 1 余3
4,1/16 = 0 余1 最终结果为:130DH - 十六进制的乘法运算
物理地址
CPU访问内存单元时,要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间都有唯一的地址,这个唯一地址称为“物理地址”。CPU通过地址总线送入存储器,必须是一个内存单元的物理地址。在CPU向地址总线发出物理地址之前,必须要在内部先形成这个物理地址。
16位结构的CPU
描述一个CPU具有下面几方面的结构特性
- 运算器一次最多可以处理16位的数据
- 寄存器的最大宽度为16位
- 寄存器和运算器之间的通路为16位
8086CPU给出物理地址的方法
8086CPU有20位地址总线,可以传送20位地址,达到1MB(2^20Byte)寻址能力,8086CPU又是16位结构,在内部一次性处理,传输,暂时存储的地址为16位,如果地址从内部出发,他只能传送16位的地址,表现出的寻址能力只有64KB
8086CPU采用两个16位地址合成的方法形成一个20位的物理地址
当8086CPU要读写内存时的步骤
- 1,CPU相关部件提供两个16位的地址,一个称为段地址,一个称为偏移地址。
- 2,段地址和偏移地址通过内部总线送入一个地址加法器的部件
- 3,地址加法器将两个16位地址合并成一个20位的物理地址
- 4,地址加法器通过内部总线将20位送入输入输出控制电路
- 5,输入输出控制电路将20位物理地址送上地址总线
- 6,20位物理地址被地址总线传送到存储器
- 地址加法器合成物理地址的方法是:段地址*16+偏移地址 = 物理地址
物理地址为什么这么计算?本质是什么?
总结就是:因为两个16位进制的寻址能力是有限的,需要重新生成一个20位的物理地址,需要提供两张16位的数据地址去合成一个地址。(个人大概理解)
知识点总结
- 给定段地址0001H,仅通过变化偏移地址寻址,CPU的寻址范围是多少?
答:由于物理地址 = 段地址16 + 偏移地址。那重点要了解偏移地址的范围[0000H ~ FFFFH], 所以段地址16 =0001H*16 = 00010H(乘以16相当于左移一位),那范围就是[00010H+0000H ~ 00010H+FFFFH] = 00010H~01000FH
段寄存器
8086CPU有4个段寄存器(段地址是在段寄存器存储),分别为CS,DS,SS,ES。本章讨论CS
CS和ip
cs:代表代码段寄存器假设为M,ip:代表指令指针寄存器假设为N。8086CPU将从M*16+N开始,读取一条指令并且执行
- 当前的CS为20000H,IP为0000H时,CPU将内存2000H*16+0000H读取指令执行。
- CS,IP的内容送入地址加法器中,生成20位物理地址(CS*16+IP)
- 地址加法器将物理地址送入输出输出控制电路
- 输入输出控制地址将物理地址送上地址总线
- 从内存20000H单元开始存放机器指令B8 23 01通过数据总线送入CPU
- 输入输出控制器将机器指令B8 23 01送入指令缓冲器
- IP的值自动添加,使CPU读取到下一条的指令,因当前的指令为B82301长度为3,所以IP中的值加3,此时CS:IP指向20000H:0003
- 依次类推,循环执行,IP根据读取的字节进行递增
修改CS和IP的指令
使用命令Jmp
- jmp 2AE3:3,执行后CS=2AE3H IP=0003H,CPU将从2AE33H处读取指令(cs*16+ip = cs<<1+ip)
- jmp 3:0B16 CS = 0003H IP = 0B16H CPU将从00B46H处读取指令
- jmp ax
执行前:ax=1000H,cs=2000h,ip=0003h
执行后:ax=1000H,cs=2000h,ip=1000H(类似MOV IP,AX -- 这里是一个比喻,不是可以用此方法进行处理)
代码段
将一组内存单元定义为一个段,我们可以将长度N(N<64KB)的一组代码,存在一组连续,起始地址为16倍数的内存单元中,我们可以认为,这段内存是用来存放代码的,定义为一个代码段
总结
下面的3条指令执行后,CPU几次修改IP?都是在什么时候?最后IP中的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答:一共四次,每次执行一次指令修改一次,jmp ax执行了二次(执行指令执行一次,修改寄存器的Ip执行一次),由于sub ax ax 命令执行,导致ax = 0000H, 最后一步jmp ax 相当于将ip值转换成ax,即:IP = 0000H;