Intel 8086/8088 CPU 结构与可编程寄存器

摘要:
除了上述差异,8086和8088 CPU的结构和原理从软件设计的角度来看几乎相同。图4 Intel8086/8088 CPU功能结构执行单元EU的功能是从BIU的指令队列中提取指令代码,然后执行指令指定的所有功能。Intel 8086/8088 CPU中有14个16位寄存器,如图5所示。图5 Inter8086/8088 CPU内部寄存器(I)共有8个通用寄存器。它们的功能是存储操作中涉及的数据或程序操作结果。它们的特点是通用性好。

目录

一、8086/8088 CPU 功能结构

Intel 公司于 1978 年推出了标准 16 位微处理器 8086。由于它的内部、外部数据总线宽度都为 16 位,产品推向市场后,当时 8 位接口芯片出现兼容问题,于是又生产了准 16 位微处理器 8088,将外部数据总线改为 8 位,以解决与外围电路的兼容问题。8086 与 8088 CPU 结构与原理除上述差别外,从软件设计角度几乎没有什么差别。

Intel 8086/8088 CPU 功能结构如图 4 所示。 CPU 采用指令流水线结构,把访问存储器(含取指令、存取数据操作等)与执行指令分成两个独立单元:总线接口单元 BIU(Bus Interface Unit)和执行单元 EU(Execute Unit)。

Intel 8086/8088 CPU 功能结构

图 4 Intel 8086/8088 CPU 功能结构

执行单元 EU 的功能是从 BIU 的指令队列中取出指令代码,然后执行指令所规定的全部功能。如果在执行指令过程中,需要向存储器或 I/O 端口传送数据,EU 向 BIU 发出访问命令,并提供访问的地址和数据。

总线接口单元 BIU 负责 CPU 与存储器及 I/O 端口的信息传送。具体功能是根据段寄存器 CS 和指令指针 IP 形成 20 位物理地址,从存储器中取出指令,并暂存在指令队列中,等待 EU 取走执行。如 EU 发出访问存储器或 I/O 端口的命令时,BIU 根据 EU 提供的地址和数据,进入外部总线周期,存取数据。

由此可知,EU 和 BIU 是既分工又合作的两个独立单元。它们的操作是并行的,分别完成不同的任务,因而大大加快了指令执行速度。

二、CPU内部寄存器组

对于汇编语言指令,被操作的数据或运算的中间结果可以放在 CPU 内部的寄存器中,也可以放在存储器(内存)中。尤其是 CPU 内部的寄存器,在指令中使用的频度最大,因为访问寄存器要比访问存储器更快捷,汇编语言程序设计者掌握 CPU 中各寄存器的用途是非常重要的。

Intel 8086/8088 CPU 内部共有 14 个 16 位寄存器,如图 5 所示。根据其作用可分为通用寄存器、段寄存器、指令指针、标志寄存器等。

Inter 8086/8088 CPU 内部寄存器

图 5 Inter 8086/8088 CPU 内部寄存器

(一)通用寄存器

通用寄存器共有 8 个,它们的作用是存放参加操作的数据或程序运算的结果,它们的特点是具有良好的通用性。在大多数情况下,这些寄存器可以互换地进行各种操作。例如,在程序的一条指令中把一个数据保存在 BX 中或是其他任意一个通用寄存器中是没有区别的。但有少数指令又规定了某些寄存器具有特定的用法。例如,在循环指令(loop)中,循环次数必须放在 CX 中;两个字节相乘的指令中,其中一个数必须放入 AL 中,而结果积隐含在 AX 中。因此,习惯上把 CX 叫作计数器,把 AX 叫作累加器,这就是每个寄存器用途名称的由来。

8 个通用寄存器根据使用的情况可分为如下 3 种。

1. 数据寄存器

它包含 AX、BX、CX、DX 4 个寄存器,其特点是它们中的每一个,既可作为十六位寄存器来使用,也可作为两个 8 位寄存器单独使用。因此,这 4 个十六位寄存器也可以看成是 8 个独立的八位寄存器 AH、AL、BH、BL、CH、CL、DH、DL,这些寄存器的双重性使得程序很容易处理字节和字信息。

2. 间接寻址寄存器

间接寻址寄存器由 2 个基址寄存器 BX、BP 和 2 个变址寄存器 SI、DI 构成,它们都是 16 位寄存器。它们的特点是可以用来存放程序中要访问的内存单元的偏移地址,也可以作为通用寄存器使用,以存放操作数和运算结果,这一点和数据寄存器的作用是没有差别的。

3. 指针寄存器

指针寄存器包含堆栈指针 SP 和基指针 BP,当它们作为存放地址的寄存器使用时,特定地指向内存中的堆栈段。SP 的特殊性还在于调用和返回指令以及中断指令等操作都会引起 SP 中地址的自动改变。当然 SP 和 BP 同样可以作为数据寄存器使用。

(二)段寄存器

Intel 8086/8088 CPU 将存储器划分成若干段(如图 6 所示),把将要运行的程序各部分(代码、数据等)分别放在不同的存储段中。每个存储段用一个段寄存器来指示它的首地址(即段地址)。当 CPU 访问某存储单元(如取指令或数据存取操作数)时,就必须明确该存储单元在哪个段寄存器指向的存储段中,同时给出该存储单元在这个存储段内的偏移地址(即偏移量)。一个存储单元与它所在段的段基址之间的距离(以字节数计)叫该存储单元的偏移地址,也叫偏移量。

用段寄存器指明存储段

图 6 用段寄存器指明存储段

一个程序把存储器划分成多少个存储段可以是任意的,但用 CS、DS、ES、SS 段寄存器分别指明的段叫作当前段。在程序运行的任何时刻,最多只能有 4 个当前段。4 个段寄存器有各自的作用,不能互换。CS 一定是指向存放有指令代码的代码段,SS 指向被开辟为堆栈区的堆栈段,DS 和 ES 通常指向存放数据和工作单元的数据段。

(三)指令指针 IP

IP 是程序不能访问的寄存器,它与其他计算机和微处理器中程序计数器 PC 的作用类同,是指令的地址指针。在程序运行期间,CPU 自动修改 IP 的值,使它始终保持为正在执行指令的下一条指令代码的起始字节的偏移量。

用户编制的程序不能直接访问 IP,即不能用指令去取出 IP 的值或给 IP 设置给定值。但是某些指令的执行可以自动修改 IP 的内容。例如执行转移指令 JMP、JNE 等,把目的地址的偏移量送入 IP;执行调用子程序指令 CALL 时,IP 原有内容自动压入堆栈,把子程序入口地址偏移量自动送入 IP。当从子程序返回主程序时,返回指令 RET 又自动从堆栈中弹回原有 IP 的内容送回 IP。

(四)标志寄存器

8086/8088 CPU 设置了 1 个十六位标志寄存器,用来反映微处理器在程序运行时的状态。标志寄存器中定义了 9 个标志位,其中 6 个标志位(CF、PF、AF、ZF、SF、OF)作为状态标志,状态标志随指令的执行动态改变着,记载每一条指令刚执行完后的某些特征。另外 3 个标志位(TF、IF、DF)作为控制标志,在执行某些指令时起控制作用。图 7 中除指明控制标志位外,其余均为状态标志位。

标志寄存器

图 7 标志寄存器

1. 状态标志

(1)进位标志 CF(Carry Flag)。

当进行算术运算时,如最高位(对字操作是第 15 位,对字节操作是第 7 位)产生进位(加法运算)或借位(减法运算),则 CF 置 1,否则置 0。CF 也可在移位类指令中使用,用它保存从最高位(左移时)或最低位(右移时)移出的代码(0 或 1)。

(2)奇偶标志 PF(Parity Flag)。

若操作结果低八位中含有 1 的个数为偶数时,则 PF 置 1,否则 PF 置 0。PF 只检查操作结果的低八位,与该指令操作数的长度无关。

(3)辅助进位标志 AF(Auxiliary Carry Flag)。

当进行算术运算时,若低半字节向高半字节产生进位(加法)或借法(减法)时,则 AF 置 1,否则置 0。AF 只反映运算结果的低八位,与操作数长度无关,它是用于十进制运算的调整。

(4)零标志 ZF(Zero Flag)。

若运算结果各位全为 0 时,则 ZF 置 1,否则置 0。

(5)符号标志 SF(Sign Flag)。

把运算结果视为带符号数。当运算结果为负数时,则 SF 置 1,为正数时,则置 0。所以,SF 与运算结果的最高位(符号位)相一致。

(6)溢出标志 OF(Overflow Flag)。

当运算的结果超过机器用补码所能表示数的范围时,则 OF 置 1,否则置 0。产生溢出一定是同号数相加或异号数相减的情况。

2. 控制标志

以下 3 个标志为控制标志。

(1)陷阱标志(或单步标志)TF(Trap Flag)。

当 TF=1 时,在执行完一条指令后就停下来(产生单步中断),然后由单步中断处理程序把 TF 置 0。TF 供调试程序用,如在调试程序 debug 中,可以使用单步命令,在每条指令执行后就停下来进行检查。

(2)中断标志 IF(Interrupt Flag)。

当 IF=1 时,允许响应可屏蔽中断。相反,IF=0 时,则不允许响应可屏蔽中断。可用开中断指令 STI 和关中断指令 CLI 设置 IF 的状态。

(3)方向标志 DF(Direction Flag)。

DF 为串操作指令规定增减方向。当 DF=0 时,串操作指令自动地使变址寄存器(SI 和 DI)递增(即串操作是从低地址到高地址方向进行的)。当 DF=1 时,则自动地使变址寄存器递减(即串操作是从高地址到低地址方向进行的)。DF 的状态可用 STD 和 CLD 指令设置。

原文:Intel 8086/8088 CPU 结构与可编程寄存器

(完)

免责声明:文章转载自《Intel 8086/8088 CPU 结构与可编程寄存器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇亿级用户的新浪微博平台架构Mycat(水平拆分--分表 全局序列)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#堆和栈

堆和栈是两种可以分配的内存。 栈保存代码的运行路径。堆保存对象。 栈好比整齐摆放的盒子。堆则好比杂乱无章的盒子。 在堆中我们可以轻易找到需要的对象,而由于默认访问最顶端的栈,当栈中的方法执行完毕之后就会丢弃,然后继续查找最顶端的盒子,直到发现合适的。 借用其他博主的图片。左边是栈,右边是堆。 栈是内存自主维护的。而堆则需要垃圾回收机制 堆和栈主要存放了四...

Beaglebone Black – 连接 GY-91 MPU9250+BMP280 九轴传感器(1)

本篇内容为,通过 I2C 配置 GY-91 MPU9250+BMP280 里面的 MPU9250 连接 AK8963 磁感应。两个办法,1)MPU9250 设置 Master Mode 通过 AUX I2C 读写,2)Pass Through Mode 由 Host (单片机或者本文的 BBB)直接用 I2C 读写。本文两种方式都会操作一次。 最初看到淘宝...

使用函数指针调用C++虚函数

基本概念:   1. 函数指针,一个地址指针变量,其值指向代码区的某个函数首地址。   2. 虚函数,可以被子类覆写的C++成员函数。由虚函数表实现。   3. 虚函数表指针(vpt),指向虚函数表首地址的指针,一般放在类实例的首4字节(x86系统)。通过它能找的虚函数表,进而能找的某个虚函数。 函数调用:   1. C++函数的普通调用方式:      ...

定时器中断---那些年我们一起玩mini2440(arm9)裸机

(时钟体系)http://blog.sina.com.cn/s/blog_815420370101ni84.html 时钟概念: ★时钟脉冲:一个按一定电压幅度,一定时间间隔连续发出的脉冲信号;   ★时钟频率:在单位时间(如:1秒)内产生的时钟秒冲数; 时钟的作用: 时钟信号是时序逻辑的基础,它用于决定逻辑单元中的状态何时更新。数字芯片中众多的晶体管都工...

文件读写和文件指针的移动

read 函数 -#include <unistd.h> -ssize_t read(int fd, void *buf, size_t count); 从fd 所指的文件中读取count 个字节到buf 中。返回实际读取到的字节数,有错误发生则返回-1。读取文件时,文件读写指针会会随着读取到的字节数移动。 write 函数 -...

MODBUS-寄存器与功能码学习

分类 简称 起始地址 结束地址 能够使用的功能码 输出逻辑线圈/(可读写位)/(DI/O)(如继电器开关控制) 0x 00000 09999 0x01读一组逻辑线圈 0x05写单个线圈 0x0f写多个线圈 离散量触点/开关量输入/只读位(DI)如按键是否按下 1x 10000 19999 0x02读一组开关输入 输入寄存器(AI...