CPU工作的实质即为不断从内存中取指令并执行指令的过程。
一、8086CPU构成
CPU的工作:取指令和执行指令
1.CPU内部两大功能部件:总线接口部件BIU和执行部件EU(2部件并行工作提高了CPU的工作效率)
重点:理解2个独立功能部件的分工和协同配合关系。
理解BIU内地址加法器的作用,理解指令队列的作用。
2.掌握CPU内部寄存器的作用
包括:通用寄存器AX,BX,CX,DX,BP,SP,SI,DI
段寄存器CS,DS,SS,ES
指令指针寄存器IP
标志寄存器FLAG
二、存储器的基础知识
1.物理地址
8086的存储器是以字节(即每个单元存放8位二进制数)为单位组织的。
8086CPU具有20条地址总线,所以可访问的存储器地址空间容量为220即1M字节(表示为1MB)。
每个单元对应一个唯一的20位地址,对于1MB存储器,其地址范围用16进制表示为00000H~0FFFFFH,如图1所示。
地址低端
地址高端
图1 1MB存储器地址表示
物理地址:存储器的每个单元都有一个唯一的20位地址,将其称为物理地址。
2.字节地址与字地址
存储器内两个连续的字节,定义为一个字,一个字中的每个字节,都有一个字节地址,每个字的低字节(低8位)存放在低地址中,高字节(高8位)存放在高地址中。
字的地址指低字节的地址。
各位的编号方法是最低位为位0,一个字节中,最高位编号为位7;一个字中最高位的编号为位15。
字数据在存储器中存放的格式如图2所示。
地址低端
地址高端
图2 字数据在存储器中的存放
3.单元地址与内容
内容
单元地址
图3
如图3,地址是00100H 的字节单元的内容为27H,表示为(00100H)= 27H。
图3中字数据3427H存放在地址是00100H和00101H的两个字节单元中,其中低字节27H在低地址的字节单元00100H中,高字节34H在高地址的字节单元00101H中,字数据3427H的地址是低地址00100H。
地址是00100H的字单元的内容为3427H,表示为(00100H)= 3427H
可见一个地址既可作字节单元的地址,又可作字单元的地址,视使用情况而定。
总结:
字节单元:(00100H)=27H
字单元:(00100H)=3427H
设寄存器DS=0000H,
用MOV指令访问字节单元:MOV AL,[0100H]
用MOV指令访问字单元:MOV AX,[0100H]
三、存储器的分段
1.为什么要分段
8086CPU有20位地址总线,可寻址的最大内存空间达1M字节,地址范围为00000H-0FFFFFH。
内存中每个字节单元有唯一的20位物理地址,CPU存取内存中的程序和数据必须使用20位物理地址。
问题:8086 CPU访问1MB空间的内存必须有20位地址,而其内部的寄存器均为16位的,那么在传输地址时一次只能传输16位地址,即只能访问64K字节地址空间。
8086 CPU应如何提供20位地址,以寻址1MB内存?
2.如何分段
为了使8086 CPU能访问到1MB内存空间中任何一个单元,8086巧妙地采用了地址分段方法(即将1MB空间分成若干个逻辑段),从而将寻址范围扩大到了1MB。
分段的规则:
(1)为了能在1MB空间内进行全范围寻址,即可访问到1MB存储器的任何一个存储单元,把lMB存储器分成若干段(segment),每一段最大为64KB。
(2)在分段时,要求段起始单元的20位物理地址的低4位全为0(即是16的整数倍),写成十六进制,最后一位应是0,即XXXX0H(X为任一个十六进制数码)。
图4 分段示意图
分析:既然段起始地址的低4位为零,则只需将段起始地址的高16位保存到CPU内部的寄存器中(保存段起始地址的寄存器称之为段寄存器)
3.有关内存地址的概念
段基址:将段起始地址的高16位称为段基址。
偏移量:段内各存储单元相对段的起始单元都有一个距离,称为段内偏移量,又称偏移地址或有效地址(EA)。
因段的大小不超过64KB,所以段内任何一个单元距离段首的偏移量均在0000H-FFFFH 之间,即偏移量可以用一个16位二进制数表示。
总结:段基址决定了一个段在内存的开始位置(即段首地址),偏移地址描述了该单元与段首的距离。
可见,由段基址与偏移地址可描述出一个单元在内存的空间位置。
例如:一个单元所在段的段基址为1234H ,该单元与段首的距离为2,该单元在内存的位置表示如图5。
图5 内存单元的物理地址与逻辑地址表示
把1MB 的存贮空间分成若干个逻辑段以后,对一个段内的任意存贮单元,都可以用两部分地址来描述,一部分地址为段基址,另一部分为段内偏移地址(有效地址EA),段基址和段内偏移地址都是16位二进制数,常用4位十六进制数表示。
逻辑地址:使用段基址:偏移地址表示内存单元的地址形式称为逻辑地址。
上图中单元的地址用逻辑地址表示为:1234H :0002H
4.物理地址的形成
在整个1M 地址空间中,存储单元的物理地址等于段起始地址加上段内偏移。
已知某存储单元的逻辑地址,该单元的物理地址PA 的计算方法为:物理地址=段基址*10H+段内偏移地址。
8086CPU 的总线接口部件BIU 中设置了地址加法器Σ,它用来完成物理地址的计算。
图6 物理地址的形成
例1:某单元的逻辑地址为1234H:1000H ,则该存储单元的物理地址为:
物理地址(PA )=段地址*10H+EA=1234H* 10H+1000H=12340H+1000H=13340H
例2:物理地址为00020H 单元,其逻辑地址可以有:0000H:0020H 和0001H :0010H 12340H-----段首(物理地址表示) 地址低端 地址高端 该单元所在的段基址为
1234H , 它距离段首偏移2个单元 逻辑地址表示:1234H :0000H 逻辑地址表示:1234H :0002H
可见,一个单元的物理地址是唯一的,逻辑地址确有多个。
5.信息的分段存储与段寄存器的关系
用8086汇编语言编写程序时,要把程序中的不同信息安排在不同的段。
而程序中的信息包括:程序(代码)信息;数据信息;堆栈信息。
其中,代码信息存放在代码段,其地址由CS:IP提供。
堆栈信息存放在堆栈段,其地址由SS:SP提供。
数据信息,通常情况下,存放在数据段(段基址由DS提供),当然也可以存放在附加数据段(段地址由ES提供),其段内偏移地址依据寻址方式的不同来求得。
图 7 信息的分段存储与段寄存器的关系
其中段基址由段寄存器提供:
CS ——提供当前代码(程序)段的段基址;
DS ——提供当前数据段的段基址;
SS ——提供当前堆栈段的段基址;
ES ——提供当前附加数据段的段基址;
一个存储单元用逻辑地址表示后,CPU 访问该单元时应提供两部分地址:段基址和段内偏移地址。
CPU访问内存时,根据对应的操作,形成段基址和偏移地址,具体来说:
◆当CPU 从内存取指令时,由寄存器CS提供代码段的段基址,由指令指针寄存器IP提供指令所在单元的偏移地址。
在取指令时,CPU会自动引用代码段寄存器CS,再加上由IP所给出的16位段内偏移,得到要取指令的物理地址。
◆当进行堆栈操作时,由寄存器SS提供堆栈段的段基址,由寄存器SP提供堆栈段的段内偏移地址。
当涉及堆栈操作时,CPU会自动引用堆栈段寄存器SS,再加上由SP所给出的16位段内偏移,得到堆栈操作所需的物理地址。
◆当CPU 对存储器进行数据读/写操作时,可由寄存器BX,SI,DI,BP以某种寻址方式向存储器提供段内偏移地址。
当段内偏移涉及BP寄存器时,缺省引用的段寄存器为堆栈段寄存器SS。