8086CPU指令执行的基本过程

8086CPU指令执行的基本过程

  • 1 通用寄存器
  • 2 几条汇编指令
  • 3 物理地址
  • 4 段寄存器
  • 5 指令的读取与执行
  • 6 小结
    • 6.1 通用寄存器
    • 6.2 控制寄存器
    • 6.3 段寄存器

本文属于《 X86指令基础系列教程》之一,欢迎查看其它文章。

1 通用寄存器

我们说8086CPU的上一代CPU(8080、8085)等是8位机,而8086是16位机,也可以说8086 是16位结构的CPU。
8086CPU 的所有寄存器都是 16 位的,可以存放两个字节。AX、BX、CX、DX 这 4个寄存器通常用来存放一般性的数据,被称为通用寄存器

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

  • AX 可分为 AH 和 AL;
  • BX 可分为 BH 和 BL;
  • CX 可分为 CH 和 CL;
  • DX 可分为 DH 和 DL。

以AX为例, 8086CPU的16位寄存器分为两个8位寄存器的情况如下图所示。
8086CPU指令执行的基本过程_第1张图片
AX的低 8 位(0位~7位)构成了AL寄存器,高 8 位(8 位~15位)构成了AH寄存器。AH 和 AL 寄存器是可以独立使用的 8 位寄存器。

2 几条汇编指令

8086CPU指令执行的基本过程_第2张图片
注意,为了使具有高级语言基础的读者更好地理解指令的含义,有时会用文字描述和高级语言描述这两种方式来描述一条汇编指令的含义。在写一条汇编指令或一个寄存器的名称时不区分大小写。如: movax,18和MOVAX,18的含义相同; bx和BX的含义相同。

3 物理地址

8086CPU有20位地址总线,可以传送20位地址,达到1MB寻址能力。8086CPU又是16位结构,在内部一次性处理、传输、暂时存储的地址为16位。从8086CPU的内部结构来看,如果将地址从内部简单地发出,那么它只能送出 16 位的地址,表现出的寻址能力只有64KB。
8086CPU采用一种在内部用两个16位地址合成的方法来形成一个20位的物理地址。
8086CPU指令执行的基本过程_第3张图片
如上图所示,当 8086CPU 要读写内存时:

  • (1) CPU中的相关部件提供两个16位的地址,一个称为段地址,另一个称为偏移地址;
  • (2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
  • (3)地址加法器将两个 16 位地址合成为一个 20 位的物理地址;
  • (4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
  • (5)输入输出控制电路将 20 位物理地址送上地址总线;
  • (6) 20位物理地址被地址总线传送到存储器。

地址加法器采用物理地址=段地址×16+偏移地址的方法,用段地址和偏移地址合成物理地址。例如, 8086CPU要访问地址为123C8H的内存单元,此时,地址加法器的工作过程如下图所示(图中数据皆为十六进制表示)。
8086CPU指令执行的基本过程_第4张图片
以后,在编程时可以根据需要,将若干地址连续的内存单元看作一个段,用段地址×16 定位段的起始地址(基础地址),用偏移地址定位段中的内存单元。有两点需要注意:段地址×16必然是16的倍数,所以一个段的起始地址也一定是16的倍数;偏移地址为16位, 16位地址的寻址能力为64KB,所以一个段的长度最大为64KB.

4 段寄存器

段地址在8086CPU的段寄存器中存放。8086CPU有4个段寄存器: CS、 DS、SS、ES。当8086CPU要访问内存时由这4个段寄存器提供内存单元的段地址。本章中只看一下CS。

CS 和 IP是 8086CPU中两个最关键的寄存器,它们指示了CPU 当前要读取指令的地址。CS为代码段寄存器, IP为指令指针寄存器,从名称上我们可以看出它们和指令的关系。
在8086PC机中,任意时刻,设CS中的内容为M, IP中的内容为N, 8086CPU将从内存 Mx16+N 单元开始,读取一条指令并执行

5 指令的读取与执行

下图展示了 8086CPU 读取、执行指令的工作原理(图中只包括了和所要说明的问题密切相关的部件,图中数字都为十六进制)。
8086CPU指令执行的基本过程_第5张图片
上图说明如下:

  • (1) 8086CPU当前状态: CS 中的内容为2000H, IP 中的内容为0000H;
  • (2) 内存20000H-20009H单元存放着可执行的机器码;
  • (3) 内存 20000H-20009H 单元中存放的机器码对应的汇编指令如下。
    地址: 20000H-20002H,内容: B8 23 01,长度: 3Byte,对应汇编指令: movax,0123H
    地址: 20003H-20005H,内容: BB03 00,长度: 3Byte,对应汇编指令: mov bx,0003H
    地址: 20006H-20007H,内容: 89 D8,长度: 2Byte,对应汇编指令: movax,bx
    地址: 20008H-20009H,内容: 01 D8,长度: 2Byte,对应汇编指令: addax,bx

下面的一组图,以上图描述的情况为初始状态,展示了8086CPU读取、执行一条指令的过程。注意每幅图中发生的变化(下面对8086CPU的描述,是在逻辑结构、宏观过程的层面上进行的, 目的是使读者对CPU工作原理有一个清晰、直观的认识,为汇编语言的学习打下基础。其中隐蔽了CPU的物理结构以及具体的工作细节)。
8086CPU指令执行的基本过程_第6张图片
8086CPU指令执行的基本过程_第7张图片
8086CPU指令执行的基本过程_第8张图片
8086CPU指令执行的基本过程_第9张图片
8086CPU指令执行的基本过程_第10张图片
8086CPU指令执行的基本过程_第11张图片
8086CPU指令执行的基本过程_第12张图片
8086CPU指令执行的基本过程_第13张图片
8086CPU指令执行的基本过程_第14张图片
下面的一组图(图 2.20-图 2.26),以图 2.19 的情况为初始状态,展示了 8086CPU 继续读取、执行3条指令的过程。注意IP的变化(下面的描述中,隐蔽了读取每条指令的细节)。
8086CPU指令执行的基本过程_第15张图片
8086CPU指令执行的基本过程_第16张图片
8086CPU指令执行的基本过程_第17张图片
8086CPU指令执行的基本过程_第18张图片
8086CPU指令执行的基本过程_第19张图片
8086CPU指令执行的基本过程_第20张图片
8086CPU指令执行的基本过程_第21张图片
通过上面的过程展示,8086CPU的工作过程可以简要描述如下。

  • (1)从CS:IP指向的内存单元读取指令,读取的指令进入指令缓冲器;
  • (2) IP=IP+所读取指令的长度,从而指向下一条指令;
  • (3)执行指令。转到步骤(1),重复这个过程。

在8086CPU加电启动或复位后(即CPU刚开始工作时)CS和IP被设置为CS=FFFFH, IP=0000H,即在8086PC机刚启动时, CPU从内存FFFFOH 单元中读取指令执行, FFFFOH单元中的指令是8086PC机开机后执行的第一条指令。现在,我们更清楚了CS和IP 的重要性,它们的内容提供了CPU要执行指令的地址。

CPU从何处执行指令,是由CS、IP中的内容决定的,程序员可以通过改变 CS、IP 中的内容,来控制 CPU 执行目标指令。若想同时修改 CS、IP的内容,可用形如“jmp 段地址:偏移地址”的指令完成,如:

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

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

6 小结

8086 CPU 中寄存器总共为 14 个,且均为 16 位 。即 AX,BX,CX,DX,SP,BP,SI,DI,IP,FLAG,CS,DS,SS,ES 共 14 个。而这 14 个寄存器按照一定方式又分为了通用寄存器控制寄存器段寄存器

6.1 通用寄存器

缩写 含义
AX,BX,CX,DX称作为数据寄存器 AX (Accumulator):累加寄存器,也称之为累加器;
BX (Base):基地址寄存器;
CX (Count):计数器寄存器;
DX (Data):数据寄存器;
SP 和 BP又称作为指针寄存器 SP (Stack Pointer):堆栈指针寄存器;
BP (Base Pointer):基指针寄存器;
SI 和 DI又称作为变址寄存器 SI (Source Index):源变址寄存器;
DI (Destination Index):目的变址寄存器;

AX、BX、CX、DX 这 4个寄存器,都可分为两个可独立使用的8位寄存器来用:

  • AX 可分为 AH 和 AL;
  • BX 可分为 BH 和 BL;
  • CX 可分为 CH 和 CL;
  • DX 可分为 DH 和 DL。

6.2 控制寄存器

  • IP (Instruction Pointer):指令指针寄存器;
  • FLAG:标志寄存器;

6.3 段寄存器

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

  • CS (Code Segment):代码段寄存器;
  • DS (Data Segment):数据段寄存器;
  • SS (Stack Segment):堆栈段寄存器;
  • ES (Extra Segment):附加段寄存器;

8086CPU的物理地址,是用段地址和偏移地址合成的,物理地址=段地址×16+偏移地址。
因此,在8086PC机中,任意时刻,8086CPU将从内存 CSx16+IP 单元开始,读取一条指令并执行。

可通过“jmp 段地址:偏移地址”指令,修改CS和IP寄存器中的值。
jmp 3:0B16,执行后:CS=0003H, IP=0B16H,CPU 将从00B46H处读取指令。


参考文档:

  • 《汇编语言 第3版》 王爽 清华大学出版社
  • 《x86 - CPU架构/寄存器详解 (二) 实模式(8086模式)》

你可能感兴趣的:(X86指令集,CPU指令集)