王爽之《汇编语言》学习重点四

时间:2022-03-20 12:29:31

2.9  段寄存器

      我们前面讲到,8086CPU在访问内存时要由相关部件提供内存单元的段地址和偏移地址,送入地址加法器合成物理地址。这里,需要看一下,是什么部件提供段地址。段地址在8086CPU的段寄存器中存放。8086CPU有4个段寄存器:CS、DS、SS、ES当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。本章中只看一下CS。

 

2.10  CS和IP

      CS和IP是8086CPU中两个最关键的寄存器,它们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器,从名称上我们可以看出它们和指令的关系。

      在8086PC机中,任意时刻,设CS中的内容为M,IP中的内容为N,8086CPU将从内存M*16+N单元开始,读取一条指令并执行。

也可以这样表述:8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

图2.10展示了8086CPU读取、执行指令的工作原理(图中只包括了和所要说明的问题密切相关的部件,图中数字都为十六进制)。

王爽之《汇编语言》学习重点四

                                 图2.10  8086PC读取和执行指令的相关部件

 

图2.10说明如下。

(1) 8086CPU当前状态:CS中的内容为2000H,IP中的内容为0000H;

(2) 内存20000H~20009H单元存放着可执行的机器码;

(3) 内存20000H~20009H单元中存放的机器码对应的汇编指令如下。

地址:20000H~20002H,内容:B8 23 01,长度:3Byte,对应汇编指令:mov ax,0123H

地址:20003H~20005H,内容:BB 03 00,长度:3Byte,对应汇编指令:mov bx,0003H

地址:20006H~20007H,内容:89 D8,长度:2Byte,对应汇编指令:mov ax,bx

地址:20008H~20009H,内容:01 D8,长度:2Byte,对应汇编指令:add ax,bx

下面的一组图(图2.11~图2.19),以图2.10描述的情况为初始状态,展示了8086CPU读取、执行一条指令的过程。注意每幅图中发生的变化(下面对8086CPU的描述,是在逻辑结构、宏观过程的层面上进行的,目的是使读者对CPU工作原理有一个清晰、直观的认识,为汇编语言的学习打下基础。其中隐蔽了CPU的物理结构以及具体的工作细节)。

王爽之《汇编语言》学习重点四

  图2.11  初始状态(CS:2000H,IP:0000H,CPU将从内存2000H×16+0000H处读取指令执行)

 

王爽之《汇编语言》学习重点四

    图2.12  CS、IP中的内容送入地址加法器(地址加法器完成:物理地址=段地址×16+偏移地址)

 

王爽之《汇编语言》学习重点四

 图2.13  地址加法器将物理地址送入输入输出控制电路

 

王爽之《汇编语言》学习重点四

图2.14  输入输出控制电路将物理地址20000H送上地址总线

 

王爽之《汇编语言》学习重点四

 图2.15  从内存20000H单元开始存放的机器指令B8 23 01通过数据总线被送入CPU

 

王爽之《汇编语言》学习重点四

 图2.16  输入输出控制电路将机器指令B8 23 01送入指令缓冲器

 

王爽之《汇编语言》学习重点四

 图2.17  IP中的值自动增加

 

(读取一条指令后,IP中的值自动增加,以使CPU可以读取下一条指令。因当前读入的指令B82301长度为3个字节,所以IP中的值加3。此时,CS:IP指向内存单元2000:0003。)

 

王爽之《汇编语言》学习重点四

 图2.18  执行控制器执行指令B8 23 01(即mov ax,0123H)

 

王爽之《汇编语言》学习重点四

 图2.19  指令B8 23 01被执行后AX中的内容为0123H

 

(此时,CPU将从内存单元2000:0003处读取指令。)

下面的一组图(图2.20~图2.26),以图2.19的情况为初始状态,展示了8086CPU继续读取、执行3条指令的过程。注意IP的变化(下面的描述中,隐蔽了读取每条指令的细节)。

 

王爽之《汇编语言》学习重点四

 图2.20  CS:2000H,IP:0003H(CPU将从内存2000H×16+0003H处读取指令BB 03 00)

 

王爽之《汇编语言》学习重点四

 图2.21  CPU从内存20003H处读取指令BB 03 00入指令缓冲器(IP中的值加3)

 

王爽之《汇编语言》学习重点四

 图2.22  执行指令BB 03 00(即mov bx,0003H)

 

王爽之《汇编语言》学习重点四

 图2.23  CPU从内存20006H处读取指令89 D8入指令缓冲器(IP中的值加2)

 

王爽之《汇编语言》学习重点四

图2.24  执行指令89 D8(即mov ax,bx)后,AX中的内容为0003H

 

王爽之《汇编语言》学习重点四

图2.25  CPU从内存20008H处读取指令01 D8入指令缓冲器(IP中的值加2)

 

王爽之《汇编语言》学习重点四

图2.26  执行指令01 D8(即add ax,bx)后,AX中的内容为0006H

 

通过上面的过程展示,8086CPU的工作过程可以简要描述如下。

(1) CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;

(2) IP=IP+所读取指令的长度,从而指向下一条指令;

(3) 执行指令。转到步骤(1),重复这个过程。

      在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H,在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行,FFFF0H单元中的指令是8086PC机开机后执行的第一条指令。

      现在,我们更清楚了CS和IP的重要性,它们的内容提供了CPU要执行指令的地址。

      我们在第1章中讲过,在内存中,指令和数据没有任何区别,都是二进制信息,CPU在工作的时候把有的信息看作指令,有的信息看作数据。现在,如果提出一个问题:CPU根据什么将内存中的信息看作指令?如何回答?我们可以说,CPU将CS:IP指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS、IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。如果说,内存中的一段信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。