文档库 最新最全的文档下载
当前位置:文档库 › ch02_寄存器

ch02_寄存器

第二课寄存器

2.1通用寄存器

一个典型的CPU由运算器、控制器、寄存器等器件组成,这些器件靠内部总线相连,内部总线实现CPU内部各个器件之间的联系,外部总线实现CPU和主板上其它器件的联系。8086CPU有14个寄存器它们的名称为:

AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。

这些寄存器以后会陆续介绍

8086CPU所有的寄存器都是16位的,可以存放两个字节。

AX、BX、CX、DX 通常用来存放一般性数据被称为通用寄存器。

下面以AX为例,我们看一下寄存器的逻辑结构。

数据:20000

二进制表示:0100111000100000

在寄存器AX中的存储:

8086上一代CPU中的寄存器都是8位的,为保证兼容性,这四个寄存器都可以分为两个独立的8位寄存器使用。

AX可以分为AH和AL;

BX可以分为BH和BL;

CX可以分为CH和CL;

DX可以分为DH和DL。

以AX为例,8086CPU的16位寄存器分为两个8位寄存器的情况:

AX的低8位(0位~7位)构成了AL寄存器,高8位(8位~15位)构成了AH寄存器。AH和AL寄存器是可以独立使用的8位寄存器。

2.2 字在寄存器中的存储

一个字可以存在一个16位寄存器中,这个字的高位字节和低位字节自然就存在这个寄存器的高8位寄存器和低8位寄存器中。

2.3几条汇编指令

注意:汇编指令不区分大小写

2.4 物理地址

CPU访问内存单元时要给出内存单元的地址。所有的内存单元构成的存储空间是一个一维的线性空间。每一个内存单元在这个空间中都有唯一的地址,这个唯一的地址称为物理地址。概括的讲,16位结构描述了一个CPU具有以下几个方面特征:

1、运算器一次最多可以处理16位的数据。

2、寄存器的最大宽度为16位。

3、寄存器和运算器之间的通路是16位的。

8086有20位地址总线,可传送20位地址,寻址能力为1M。

8086内部为16位结构,它只能传送16位的地址,表现出的寻址能力却只有64K。

8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。

地址加法器合成物理地址的方法:

物理地址=段地址×16+偏移地址

2.5 段的概念

错误认识:

内存被划分成了一个一个的段,每一个段有一个段地址。

其实:

内存并没有分段,段的划分来自于CPU,由于8086CPU用“(段地址×16)+偏移地址=物理地址”的方式给出内存单元的物理地址,使得我们可以用分段的方式来管理内存。

我们也可以认为地址10000H~1007FH、

10080H~100FFH 的内存单元组成两个段,它们的起

始地址(基础地址)为10000H和10080H,段地址

为:1000H 和1008H,大小都为80H。

注意:

(1)段地址×16 必然是16的倍数,所以一个段的起始地址也一定是16的倍数;(2)偏移地址为16位,16 位地址的寻址能力为64K,所以一个段的长度最大为64K。

2.6 段寄存器

段寄存器就是提供段地址的,8086CPU有4个段寄存器:C S、DS、SS、ES ,当8086CPU要访问内存时,由这4个段寄存器提供内存单元的段地址。

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

CS为代码段寄存器;

IP为指令指针寄存器;

参考动画演示:DEMO/2_8086CPU读取和执行指令的过程.swf

8086PC工作过程的简要描述:

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

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

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

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

2.7 CS和IP

内存中指令和数据没有任何区别,都是二进制信息,CPU在工作的时候把有的信息看作指令,有的信息看作数据。

CPU根据什么将内存中的信息看作指令?

CPU将CS:IP指向的内存单元中的内容看作指令。

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

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

2.8 修改CS、IP的指令

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

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

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

mov指令不能用于设置CS、IP的值,8086CPU没有提供这样的功能。8086CPU为CS、IP 提供了另外的指令来改变它们的值:转移指令

同时修改CS、IP的内容:

jmp 段地址:偏移地址

jmp 2AE3:3

jmp 3:0B16

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

仅修改IP的内容:

jmp 某一合法寄存器

jmp ax (类似于mov IP,ax)

jmp bx

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

内存中存放的机器码和对应汇编指令情况:(初始:CS=2000H,IP=0000H)

问题分析结果:

(1)mov ax,6622

(2)jmp 1000:3

(3)mov ax,0000

(4)mov bx,ax

(5)jmp bx

(6)mov ax,0123H

(7)转到第(3)步执行

2.9 代码段

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

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

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

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

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

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

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

CS = 123BH,IP = 0000H。

小结:

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

2、CS存放指令的段地址,IP存放指令的偏移地址。

8086机中,任意时刻,CPU将CS:IP指向的内容当作指令执行。

3、8086CPU的工作过程:

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

(2)IP指向下一条指令;

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

4、8086CPU提供转移指令修改CS、IP的内容。

2.10 Debug

2.10.1什么是Debug

Debug是DOS、Windows都提供的实模式(8086方式)程序的调试工具,使用它可以查看CPU各种寄存器的内容、内存的情况和在机器码级跟踪程序的运行。

2.10.2 Debug常用功能

1.R查看、改变CPU寄存器的内容

2.D查看内存的内容

3.E改写内存的内容

4.U将内存中机器指令翻译成汇编指令

5.T执行一条机器指令

6.A以汇编指令的格式在内存中写入一条机器指令

2.10.3启动Debug

开始-->cmd.exe->debug

2.10.4 R命令改变寄存器的内容R 寄存器

R AX回车

输入AX中的新内容

2.10.5 D查看内存的内容

方法一:直接输入D

方法二:D 段地址:偏移地址

相关文档
相关文档 最新文档