段寄存器

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

2.10说明如下。

(1) 8086CPU当前状态:CS中的内容为2000HIP中的内容为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的物理结构以及具体的工作细节)

51.jpg 

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

 

53.jpg 

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

 

54.jpg 

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

 

55.jpg 

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

 

 56.jpg 

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

 

57.jpg 

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

 

58.jpg 

2.17  IP中的值自动增加

 

(读取一条指令后,IP中的值自动增加,以使CPU可以读取下一条指令。因当前读入的指令B82301

长度为3个字节,所以IP中的值加3。此时,CSIP指向内存单元2000:0003)

2.10 CSIP2

59.jpg 

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

 

60.jpg 

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

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

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

61.jpg 

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

 

62.jpg 

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

 

63.jpg 

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

 

64.jpg 

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

 

65.jpg 

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

 

66.jpg 

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

 

67.jpg 

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

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

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

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

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

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

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

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

修改CS、IP的指令

在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

我们如何改变CS、IP的值呢?显然,8086CPU必须提供相应的指令。我们如何修改AX中的值?可以用mov指令,如mov ax,123将ax中的值设为123,显然,我们也可以用同样的方法设置其他寄存器的值,如mov bx,123,mov cx,123,mov dx,123等。其实,8086CPU大部分寄存器的值,都可以用mov指令来改变,mov指令被称为传送指令。

但是,mov指令不能用于设置CS、IP的值,原因很简单,因为8086CPU没有提供这样的功能。8086CPU为CS、IP提供了另外的指令来改变它们的值。能够改变CS、IP的内容的指令被统称为转移指令(我们以后会深入研究)。我们现在介绍一个最简单的可以修改CS、IP的指令:jmp指令。

若想同时修改CS、IP的内容,可用形如"jmp段地址:偏移地址"的指令完成,如

jmp 2AE3:3,执行后:CS=2AE3H,IP=0003H,CPU将从2AE33H处读取指令。

jmp 3:0B16,执行后:CS=0003H,IP=0B16H,CPU将从00B46H处读取指令。

"jmp 段地址:偏移地址"指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP。

若想仅修改IP的内容,可用形如"jmp 某一合法寄存器"的指令完成,如

jmp ax,指令执行前:ax=1000H,CS=2000H,IP=0003H
指令执行后:ax=1000H,CS=2000H,IP=1000H
jmp bx,指令执行前:bx=0B16H,CS=2000H,IP=0003H
指令执行后:bx=0B16H,CS=2000H,IP=0B16H

"jmp 某一合法寄存器"指令的功能为:用寄存器中的值修改IP。

jmp ax,在含义上好似:mov IP,ax。

注意,我们在适当的时候,会用已知的汇编指令的语法来描述新学的汇编指令的功能。采用一种"用汇编解释汇编"的方法来使读者更好地理解汇编指令的功能,这样做有助于读者进行知识的相互融会。要强调的是,我们是用"已知的汇编指令的语法"进行描述,并不是用"已知的汇编指令"来描述,比如,我们用mov IP,ax来描述jmp ax,并不是说真有mov IP,ax这样的指令,而是用mov指令的语法来说明jmp指令的功能。我们可以用同样的方法描述jmp 3:01B6的功能:jmp 3:01B6 在含义上好似mov CS,3  mov IP,01B6。

 

 

posted on 2009-03-26 12:52  jasonM  阅读(1725)  评论(0编辑  收藏  举报