第二章 --- 第五节

段寄存器就是提供段地址的。

8086CPU有4个段寄存器:CS、DS、ES、SS

CS:代码段

DS:数据段

SS:堆栈段

ES:附加段

要从内存中读取指令或者数据,就要制定存储指令或者数据的内存单元的地址,

8086的地址总线的宽度为20位,而8086内部寄存器的宽度都是16位的,所以采用 段地址 * 16 + 偏移地址 的方法来生成20位的地址。

所以当8086CPU要访问内存时,由这四个寄存器提供内存单元的段地址。

 

CS和IP是8086CPU中最关键的寄存器,它们指示了CPU当前要读取指令的地址。

CS为代码段寄存器,IP为指令指针寄存器。

CS提供代码段的段地址,IP提供偏移地址,CS:IP指向了CPU当前要读取指令的内存单元的地址。

8086读取和执行指令描述:

1、由CS产生段地址2000H,IP产生偏移地址0000H,然后经由地址加法器生成一个20位的地址:20000H。

2、地址20000H经由输入输出控制电路,被送入到20位的地址总线上。

3、地址为20000H的内存单元被选中,然后数据B82301经由数据总线(分三次传输)被送入到输入输出控制电路上。

4、B82301被送入到指令缓冲器中,IP寄存器的内容被自动加3。

5、执行控制器执行指令缓冲器中的内容。

6、重复步骤1~5。

细节:内存中的存储的二进制数据,无论它是code还是data,都是经由数据总线传输的,控制总线传输读写信号,地址总线传输由段地址和偏移地址构成的内存地址。

 

8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH,IP=0000H。

即在8086PC机刚启动时,CPU从内存FFFF0H单元中读取指令执行。

FFFF0H单元中的指令是8086PC机开机后执行那个的第一条指令。

 

在任何时候,CPU将CS、IP中的内容当做指令的段地址和偏移地址,用它们合成指令的物理地址,到内存中读取指令码,执行。

如果说,内存中的以短信息曾被CPU执行过的话,那么,它所在的内存单元必然被CS:IP指向过。

 

在CPU中,程序员能够用指令读写的部件只有寄存器,程序员可以通过改变寄存器中的内容实现对CPU的控制。

CPU从何处执行指令是由CS、IP中的内容决定的,程序员可以通过改变CS、IP中的内容来控制CPU执行目标指令。

我们如何改变CS、IP的值呢?

 

MOV指令,如MOV AX,123

MOV指令可以改变8086CPU大部分寄存器的值,被称为传送指令。

能够通过MOV指令改变CS、IP的值吗?

答案是:MOV指令不能用于设置CS、IP的值,8086CPU为CS、IP提供了另外的指令改变它们的值:转移指令JMP

 

同时修改CS、IP的内容:

JMP  段地址:偏移地址

例如:

JMP  2AE3:3

JMP  3:0B16

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

 

仅修改IP的内容:

JMP  某一合法寄存器(合法寄存器例如通用寄存器)

例如:

JMP  AX (类似于MOV IP, AX)

JMP  BX

功能:用寄存器中的值修改IP。

 

问题分析:CPU运行的流程

1、CS = 2000H,IP = 0000H,选中的内存单元为20000H

2、执行20000H内存单元的指令 MOV AX, 6622H

3、CS = 2000H,IP = 0003H,选中的内存单元为20003H

4、执行20003H内存单元的指令 JMP  1000:3

5、CS = 1000H,IP = 0003H,选中的内存单元为10003H

6、执行10003H内存单元的指令 MOV AX, 0123H

7、CS = 1000H,IP = 0006H,选中的内存单元为10006H

8、执行100006H内存单元的指令 MOV BX, AX

9、CS = 1000H,IP = 0008H,选中的内存单元为10008H

10、执行10008H内存单元的指令 JMP BX

11、CS = 1000H,IP = 0000H,选中的内存单元为10000H

12、执行10000H内存单元的指令 MOV AX, 0123H

13、重复步骤5~12

 

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。

可以将长度为N(N<=64KB)的一组代码,存在一组地址连续,起始地址为16的倍数的内存单元中,这段内存是用来存放代码的,从而定义了一个代码段。

 

这段长度为10字节的字节的指令,存在从123B0H~123B9H的一组内存单元中,我们就可以认为,123B0H~123B9H这段内存单元是用来存放代码的,是一个代码段,它的段地址为123BH,长度为10个字节。

 

如何使得代码段中的指令被执行呢?

将一段内存当做代码段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就自动将我们定义的代码段中的指令当做指令来执行。

CPU只认被CS:IP指向的内存单元中的内容为指令。

所以要将CS:IP指向所定义的代码段中的第一条指令的首地址。

 

段地址在8086CPU的寄存器中存放,当8086CPU要访问内存时,由段寄存器提供内存单元的段地址,8086CPU有4个段寄存器,其中CS用来存放指令的段地址。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值