《汇编语言》读书笔记——第二章 寄存器

一个典型的CPU由运算器,控制器,寄存器等器件构成

 

1.通用寄存器

8086CPU的所有寄存器都是16位的,以AX为例

《汇编语言》读书笔记——第二章 寄存器

 

8086CPU的上一代CPU中的寄存器是8位的,为了保证兼容,使基于上代CPU编写的程序稍加修改可以运行在8086上,8086CPU的AX,BX,CX,DX这四个寄存器可以分为两个可独立使用的8位寄存器来用

《汇编语言》读书笔记——第二章 寄存器

 

2.字在寄存器中的存储

字节:byte,一字节由8个bit组成,可以存在8位存储器中

字:记为word,一个字由两个字节组成,这两个字节分别称为这个字的高位字节和低位字节

《汇编语言》读书笔记——第二章 寄存器

 

3.典型的汇编指令

《汇编语言》读书笔记——第二章 寄存器

4.物理地址

CPU访问内存单元时,要给出内存单元的地址,所有内存单元构成的存储空间是一个一维的空间,每个内存单元在这个空间中有唯一的地址,我们将这个唯一的地址称为物理地址

CPU通过地址总线送入存储器的,必须是一个内存单元的物理地址,在CPU向地址总线上发出物理地址之前,必须要在内部先形成这个物理地址。不同的CPU可以有不同的形成物理地址的方式。

 

 

5.16位结构的CPU

我们说8086CPU的上一代CPU等是8位机,而8086是16位机,也可以说8086是16位结构的CPU,那么什么是16位结构的CPU呢?

 

概括地讲,16位结构描述了一个CPU具有下面几方面的结构特性:

  • 运算器一次最多可以处理16位数据
  • 寄存器的最大宽度为16位
  • 寄存器和运算器之间的通路为16位

 

8086是16位结构的CPU,也就是说,在8086内部,能够一次性处理、传输、暂时存储的信息的最大长度是16位的。

 

6.8086CPU给出物理地址的方法

8086CPU有20位地址总线,可以传送20位地址,达到1MB的寻址能力,8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位,表现出的寻址能力只有64KB

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

《汇编语言》读书笔记——第二章 寄存器

 

《汇编语言》读书笔记——第二章 寄存器

 

地址加法器采用物理地址=段地址*16+偏移地址的方法用段地址和偏移地址合成物理地址,例如8086CPU要访问地址为123C8H的内存单元,此时地址加法器的工作过程:

《汇编语言》读书笔记——第二章 寄存器

更一般地说,这种寻址功能是“基础地址+偏移地址=物理地址”

 

7.段地址

我们注意到,“段地址”这个名称中包含“段”的概念。这种说法并不是说内存被划分成一个一个的段。

段的划分来自于CPU,由于8086CPU用“基础地址+偏移地址=物理地址”的方式给出内存单元的物理地址,我们可以认为10000H~100FFH的内存单元组成一个段,该段的起始地址(基础地质)为10000H,段地址为100H,大小为100H。我们也可以认为,地址10000H~1007FH,10080H~100FFH的内存单元组成两个段,它们的起始地址(基础地质)为10000H和10080H,段地址为1000H和1008H,大小都为80H

《汇编语言》读书笔记——第二章 寄存器

 

注意:CPU可以用不同的段地址和偏移地址形成同一个物理地址



物理地址 段地址 偏移地址
21F60H 2000H 1F60H
  2100H 0F60H
  21F0H 0060H
  21F6H 0000H
  1F00H 2F60H

 

 

 

8.CS和IP

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

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

 

下图所示的过程清晰展示了读取指令并执行的过程:

《汇编语言》读书笔记——第二章 寄存器

 

《汇编语言》读书笔记——第二章 寄存器

 

《汇编语言》读书笔记——第二章 寄存器

 

《汇编语言》读书笔记——第二章 寄存器

《汇编语言》读书笔记——第二章 寄存器

《汇编语言》读书笔记——第二章 寄存器

《汇编语言》读书笔记——第二章 寄存器

 

 

下图以图2.19的情况为初始状态,展示了8086CPU继续读取、执行3条指令的过程,注意IP的变化

《汇编语言》读书笔记——第二章 寄存器

《汇编语言》读书笔记——第二章 寄存器

《汇编语言》读书笔记——第二章 寄存器

《汇编语言》读书笔记——第二章 寄存器

《汇编语言》读书笔记——第二章 寄存器

 

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

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

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

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

 

 

9.修改CS、IP的指令

如果我们想修改寄存器AX中的值,可以用mov指令,如mov ax,123 将ax中的值设置为123。但是mov指令不能用于设置CS、IP的值,因为8086CPU没有提供这样的功能。能够改变CS、IP的内容的指令被统称为转移指令。

一个最简单的可以修改CS、IP的指令:jmp指令

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

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

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

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

jmp ax,执行前:ax=1000H,CS=2000H,IP=0003H

              执行后:ax=1000H,CS=2000H,IP=1000H

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

jmp ax,在含义上类似:mov IP,ax

 

 

10.代码段

对于8086PC机,在编程时,可根据需要,将一组内存单元定义为一个段,我们可以将长度为N(N<=64KB)的一组代码,存在一组地址连续,起始地址为16的倍数的内存单元中,我们可以认为,这段内存是用来存放代码的,从而定义了一个代码段,例如如下指令:

《汇编语言》读书笔记——第二章 寄存器

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

将一段内存当作代码段仅仅是我们在编程时的一种安排,CPU并不会因为这种安排就自动把代码段中的指令当作指令去执行,因此我们需要让CS:IP指向所定义的代码段的第一条指令的首地址。

因此设置CS=123BH、IP=000H,则上述代码段就可得到执行