跟我学汇编(三)寄存器和物理地址的形成

一、通用寄存器

对于一个汇编程序猿来说,CPU中主要部件是寄存器。寄存器是CPU中程序猿能够用指令读写的部件。程序猿通过改变各种寄存器的内容来实现对CPU的控制。

不同的CPU,寄存器的个数、结构是不同的。8086CPU 有14个寄存器。每一个寄存器有一个名称。

这些寄存器是:AX、BX、CX、DX、SI、BP、IP、CS、SS、DS、ES、PSW。在今后的学习中我们用到这些寄存器时就对这些寄存器进行介绍。

AX、BX、CX、DX四个寄存器能够存放一般性的数据,所以这四个寄存器称为通用寄存器。在8086CPU中,寄存器都是16位的,能够存放两个字节的数据,所以表示的最大值是2^16-1。

8086CPU的上一代CPU使用的是8位的寄存器,所以为了保证程序的兼容性,使的针对上一代CPU开发的汇编程序能够在8086CPU上运行。8086将通用寄存器分成两个8位的寄存器:

  • AX能够分为AH和AL
  • BX能够分为BH和BL
  • CX能够分为CH和CL
  • DX能够分为DH和DL

    这里写图片描写叙述

以AX为例。如上图所看到的。AX的0~7位为AL,8~15位为AH。对AX中存放的数据有两种解释方式。假设是看做16位的AX则表示20000,假设看做8位的寄存器,则AH表示78,AL表示32。

二、几条汇编指令

以下我们来看一下汇编中两个最经常使用的指令mov和add,下表展示了它们的使用方法。

这里写图片描写叙述

注意:汇编指令是不区分大写和小写的,所以写成ADD AX,8和add ax。8的效果是一样的。

我们结合着刚刚讲过的寄存器来看一下汇编指令是怎样改变寄存器中的内容的。

我们假定開始时,AX和BX中的数据都是0000H。

这里写图片描写叙述

如今我们来分析一下最后的?是怎么回事。最后一条指令运行之前AX=8226H,BX=8226H,假设运行ADD操作。则A的值应该是1044CH,可是AX是16位的寄存器。最大值就为FFFFH,所以超出16位的部分就会被省略,所以AX=044CH。

再来看看对AH和AL的操作实例:

我们还是假设,開始时AX和BX中的数据为0000H。

这里写图片描写叙述

以下来看一下最后的?应该是什么值,ADD AL,93H运行后AL的数值为158H。可是AL为8位寄存器最大仅仅能存储FFH。所以超过8位的部分会自己主动省略,于是AX中数据就变成了0058H。

三、物理地址的形成

8086CPU是16位的结构,这就意味着字长是16位,寄存器的最大宽度为16位,运算器一次能够处理16位的数据。寄存器和运算器之间的数据通路为16位。

然而8086CPU却有20位地址总线。能够传送20位地址,所以能够达到1MB的寻址空间。可是由于是16位架构的CPU,所以假设仅仅从CPU内部简单的将地址送出则仅仅能形成16位的地址,寻址能力也仅仅有64KB。这可咋办呢。

为了解决上述问题,8086CPU採用了一种使用两个16位地址合成一个20位地址的方法来形成一个20位的物理地址,从而扩大了寻址能力。

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

这里写图片描写叙述

地址加法器採用物理地址=段地址*16+偏移地址的方法用段地址和偏移地址合成物理地址。比如,8086CPU想要訪问123C8H的内存单元,此时。加法器就利用1230H和00C8H两个地址形成123C8H这个地址。

我们能够用一个简单的样例来描写叙述一下这个思想,例如以下图所看到的,假如学校、体育馆和图书馆的位置例如以下:

这里写图片描写叙述

假如你有一张能够写4位数的纸条,那么图书馆的位置能够被表述为2826,假设不幸你没有4位的纸条仅仅有两张三位的纸条,那么图书馆的位置就必须借助上面的思想,我们能够用200和826两个三位数字来表示,图书馆的位置就在200*10+826=2826m上。

四、段寄存器

上面我们一直说段地址,但实际上内存中并没有分段,段的划分来自CPU,由于8086CPU用基础地址(段地址)*16+偏移地址=物理地址的方式给出内存的物理地址,使得我们能够用分段的方式来管理内存。

我们能够觉得10000H~100FFH的内存单元为一个段,段的起始地址是10000H,段地址为1000H,大小为100H;我们也能够觉得10000H~1007FH、10080H~100FFH的内存单元组成两个段,它们的起始地址为10000H和10080H,段地址为1000H和1008H。段大小为80H。

既然地址加法部件要用段地址和偏移地址形成物理地址。那么这两个地址就必须都被保存下来。8086CPU有四个段寄存器:CS、DS、SS、ES。

CS和IP是8086CPU中两个关键的寄存器,他们指示了CPU当前要读取指令的地址。CS为代码段寄存器,IP为指令指针寄存器。

假设CS中的内容为M,IP中的内容为N。那么CPU就将从内存M*16+N单元開始,读取一条指令并运行。也能够表述为例如以下:

8086机中,随意时刻,CPU将CS:IP指向的内容当做指令运行。

以下通过一组图的方式展示8086CPU读取、运行一条指令的过程。

这里写图片描写叙述

初始状态。CS:2000H,IP:0000H。

这里写图片描写叙述

地址加法器利用CS和IP中的地址形成物理地址。

这里写图片描写叙述

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

这里写图片描写叙述

输入输出电路将地址送上地址总线。

这里写图片描写叙述

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

这里写图片描写叙述

输入输出电路将机器指令送入指令缓冲器。

这里写图片描写叙述

读取一条指令后。IP中值会自己主动添加,以使CPU能够读取下一条指令,由于当前读入的指令为3个字节,所以IP的值加3。

这里写图片描写叙述

运行控制器运行指令。

这里写图片描写叙述

AX中的内容被改变。

后面的过程与这个过程是同样的,这里不再画出来了。由于文章的篇幅已经非常长了。

注意:在8086CPU加电启动后或复位后,CS和IP被设置为CS=FFFFH,IP=00000H,即8086CPU在刚启动时,CPU从内存FFFF0H单元中读取指令运行。

五、改动CS、IP的指令

那么我们能否够通过指令改变CS和IP的值呢?答案是肯定的,可是不是通过MOV指令。8086提供了单独的指令来改变这两个寄存器的值。

1、若想同一时候改变CS和IP的值,能够用“JMP 段地址:偏移地址”的指令来完毕。

比如:JMP 2AE3:3,运行后:CS=2AE3H。IP=0003H。CPU将从2AE33H单元读取指令。

2、若想仅改动IP的内容,能够使用形如“JMP 某个合法寄存器”的指令来完毕。

比如:JMP AX,指令运行前:AX=1000H,CS=2000H。IP=00003H,指令运行后:AX=1000H,CS=20000H,IP=1000H

posted @ 2017-07-30 15:51  jzdwajue  阅读(1096)  评论(0编辑  收藏  举报