【微机原理】8088/8086微处理器

news2024/11/23 13:28:07

目录

一、8088/8086的功能结构

1.总线接口部件(BIU)

2.执行部件(EU)

二、8088/8086的寄存器结构(14个)

溢出标志的概念

溢出和进位的区别


 

  8086CPU是Intel系列的16位微处理器,他有16根数据线和20根地址线,所以可寻址的地址空间是2^20 = 1MB

  8088CPU是准16位微处理器,有20根地址线,它的内部寄存器、内部运算部件以及内部操作都是按16位设计的,但对外的数据总线只有8,在处理一个16位数据时,8088需要两步操作,因而称8088是准十六位微处理器。(继8086之后推出)

8088一次只能拉一个字节,八位数据线,而8086既可以拉一个字节也可以拉两个字节(并行拉)。

一、8088/8086的功能结构

8088/8086CPU的内部结构从功能上分成两个单元。如图

  总线接口单元BIU(Bus Interface Unit)

  执行单元EU(Execution Unit)

  二个单元协同工作

 

流水线技术:两个功能部件并行工作,减少CPU为取指令而等待的时间,提高CPU的利用率和系统运行速度。

88/86两个单元的功能:

1.总线接口部件(BIU)

(1)功能:

  • 从内存取指令送到指令队列
  • CPU执行指令时,总线接口部件(BIU)要配合执行部件(EU)从指定的内存单元或者外设端口取数据,或将数据送到指定的内存单元或者外设的端口。

(2)组成:

  • 4个段地址寄存器
    • CS:16位代码段寄存器
    • DS:16位数据段寄存器
    • ES:16位附加段寄存器
    • SS:16位堆栈段寄存器
  • 16位指令指针寄存器:IP
  • 20位的地址加法器
  • 4/6字节的指令队列缓冲器(8086为6个,8088是4个)
  • I/O总线控制电路

(3)8086/8088的BIU指令队列和20位地址加法器的作用:

  指令队列(缓冲器): 8086的指令队列缓冲器为6个字节,8088的指令队列缓冲器为4个字节。无论8086还是8088.都会在执行指令的同时,从内存中取下一条指令或者几条指令,取来的指令就放在指令队列缓冲器中。这样,一般情况下,CPU执行完一条指令就可以立即执行下一条指令,称为流水线技术,减少了CPU为取指令而等待的时间,从而提高了CPU的效率。

  • 采用“先进先出”的原则
  • 减少了CPU为取指令而等待的时间
  • 降低了对存储器存取速度的要求。

BIU从存储器中读出指令送入指令队列,一旦指令队列中空出2个字节,BIU将自动进行读指令的操作以将填满指令队列,只要收到EU送来的操作数地址,BIU将立即形成这个操作数的物理地址,完成读/写操作。遇到转移类指令,BIU将指令队列中剩余的指令作废,重新从存储器新的单元地址取指令并送入指令队列。

  地址加法器:用来产生20位地址。上面已提到8086可用20位地址寻址1MB的内存空间,8086内部所有的寄存器都是16位的,所以需要一个附加的机构来根据16位寄存器提供的信息计算出20位的物理地址,这个机构就是20位的地址加法器。

2.执行部件(EU)

(1)功能:

  • 从指令队列中取出指令
  • 对指令进行译码,发出相应的传送数据或算数运算的控制信号
  • 接收由总线接口部件传送来的数据,或把数据传送到总线接口部件
  • 进行算数运算

(2)组成:

  • 4个通用寄存器:AX,BX,CX,DX

   4个通用寄存器既可以作为16位寄存器用,也可以作为8位寄存器用。分别为:AH,AL,BH,BL,CH,CL,DH,DL。其中AX寄存器又称为累加器,8086指令系统中有许多指令通过累加器的动作来执行,AX16位累加器,AL8位累加器。

  • 4个专用寄存器:BP、SP、SI、DI
    • 基质指针寄存器BP
    • 堆栈指针寄存器SP
    • 源变址寄存器SI
    • 目的变址寄存器DI

  • 标志寄存器FR:
    • 标志寄存器共有16位,就用了9位,其中7位未用
    • 其中6个标志位反映CPU指令运行后的运行状态信息,分别为SFZFPFCFAFOF。这些标志位用于根据指令执行后的操作结果进行判断转移。
    • 3个控制标志,分别为DFIFTF。控制标志可由编程员通过指令进行设置,有专门的指令对控制标志置0或置1。

  • 算数逻辑单元ALU:它是16位的运算器,可用于8位或16位二进制算术和逻辑运算,也可按指令的寻址方式计算寻址存储器所需的16位偏移量。

  • 数据暂存寄存器:它协助ALU完成运算,暂存参加运算的数据

  • EU控制电路:从总线接口的指令队列取出指令操作码,通过译码电路分析,发出相应的控制命令,控制ALU数据总线送到相应的寄存器。同时标志寄存器(PSW)根据运算结果改变状态。

8088/8086两个单元的协同功能:

1.BIU(总线接口单元):负责CPU对主存和外设接口进行访问(取、送)

(1)从内存取指令送指令队列

(4)从内存或I/O接口取操作数

(7)从BIU送结果送到内存/外存

2.EU(执行部件):负责指令的译码、执行和数据的运算

(2)从指令队列取指令送控制器:分析、译码。

(3)在运算器处理加工

(5)操作数送ALU,在ALU处理

(6)送结果到BIU

二、8088/8086的寄存器结构(14个)

  8088/8086微处理器包含8个通用寄存器(4个通用数据寄存器、4个指针和变址寄存器)、1个指令指针寄存器、4个段寄存器和1个标志寄存器。

 

1.通用寄存器

  88/86有8个通用的16位寄存器(在EU)。

  • 数据寄存器:AX、BX、CX、DX
  • 变址寄存器:SI、DI
  • 指针寄存器:SP、BP

(1)数据寄存器

  通用数据寄存器包括416位的寄存器AXBXCXDX,他们即可以作为16位寄存器使用,也可以分为两个8位寄存器使用,即高8位寄存器AHBHCHDX的低8位寄存器ALBLCLDL。这些寄存器既可以作为算术、逻辑运算的源操作数,向ALU提供参与运算的原始数据,也可以作为目标操作数,保存运算的中间结果或最后结果。

【注意】:8086/8088CPU的14个寄存器中除了这416位寄存器能分别当作两个8位寄存器来用之外,其他寄存器都不能这样使用。

  • AX:累加器(Accumulator):用该寄存器存放运算结果,可提高指令的执行速度。此外,所有的I/O指令都使用该寄存器与外设端口交换信息。
  • BX:基址寄存器(Base address Register):8086/8088CPU中有两个基址寄存器BX和BP。BX用来存放操作数在内存中数据段内的偏移地址,BP用来存放操作数在堆栈段内的偏移地址。
  • CX:计数寄存器(Counter):在设计循环程序时,使用该寄存器存放循环次数,可使程序指令简化,有利于提高程序的运行速度。
  • DX:数据寄存器(Data register):在寄存器间接寻址的I/O指令中存放I/O端口地址;在做双字长乘除法运算时,DX与AX一起存放一个双字长操作数,其中DX存放高16位数。

(2)指针及变址寄存器

指针及变址寄存器分为两个指针寄存器SP(stack pointer)、BP(base pointer)和两个变址寄存器SI(source index)、DI(destination index),这组寄存器通常用来存放存储器单元的16位偏移地址(即相对于段起始地址的距离,简称编译地址)

指针及变址寄存器都是16位,编码范围仅为 0000H~FFFFH。

指针寄存器

在进行堆栈操作的过程中,SP用来指示堆栈栈顶的偏移地址,称为堆栈指针;而BP则用来存放位于堆栈段中的一个数据区的“基址”的偏移量,称为基址指针。

  • SP:堆栈指针(Stack Pointer):在使用堆栈操作指令(PUSH 或 POP)对堆栈进行操作时,每执行一次进栈或出栈操作,系统会自动将SP的内容减2或加2,以使其始终指向栈顶
  • BP:基址指针(Base Pointer):作为通用寄存器,它可以用来存放数据,但更经常更重要的用途是存放操作数在堆栈段内的偏移地址。

变址寄存器

  SI、DI用来存放当前数据所在存储单元的偏移地址。在串操作指令中,SI用来存放源操作数地址的偏移量,称为源变址寄存器,DI用来存放目标操作数地址的偏移量,称为目标变址寄存器。

  • SI:源地址寄存器(Source Index)
  • DI:目的地址寄存器(Destination Index)

  这两个寄存器通常用在字符串操作时存放操作数的偏移地址,其中SI存放源串在数据段内的偏移地址,DI存放目的串在附加数据段内的偏移地址。

 

2.段寄存器(在BIU)

  在8086CPU中有4个16位的段寄存器。这些寄存器指令了一个特定的现行段,用来存放各段的段基址

  8086/8088CPU中,内存空间是1MB(20位地址线),但寄存器只有16位,因此1MB被分成若干逻辑段,最长是64KB(因为8088/8086中寄存器是16位的)。这些逻辑段是动态的。

  • CS:代码段寄存器(Code Segment)
  • SS:堆栈段寄存器(Stack Segment)
  • DS:数据段寄存器(Data Segment)
  • ES:附加段寄存器(Extra Segment)(在串指令中,目的操作数指明必须在现行附加段中)

当用户用指令设定了他们的初值后,实际上已经确定了一个64KB的存储区段。

其中代码段寄存器CS用来存放当前使用的代码段的段基址,用户变址的程序必须存放在代码段中,CPU将会依次从代码段中取出指令代码并执行。

数据段寄存器DS用来存放当前使用的数据段的段基址,程序运行所需的原始数据以及运算的结果应存放在数据段中。

附加段寄存器ES用来存放当前使用的附加段的段基址,它通常也用来存放数据,但在数据串操作时,用来存放目标数据串(此时DS用来存放源数据串)。

堆栈段寄存器SS用来存放当前使用的堆栈段的段基址,所有的堆栈操作的数据均保存在这个段中。

3.指令指针寄存器(IP)

  IP16位指令指针,IP的内容总是指向BIU将要取的下一条指令代码的16偏移地址当取出1个字节指令代码后,IP自动加1并指向下一条指令代码的偏移地址。它的内容是由BIU来修改的,用户不能通过指令预置或修改IP的内容,但有些指令的执行可以修改它的内容,也可以将其内容压入堆栈或由堆栈中弹出。

 IP:指令指针寄存器(Intsruction Pointer)

IP寄存器是一个专用寄存器(CPU专用)

由CS(代码段寄存器):IP(指令指针寄存器)确定 下一条指令的地址。

4.标志寄存器FR(在EU中)

  8086CPU中有一个16位的状态标志寄存器FRflag registr,用来存放下一条要读取的指令在代码段内的偏移地址。用户程序不能直接访问IP。但是只使用了9位。其中6位为状态标志位,用来反映算数运算或逻辑运算结果的状态;3位为控制位,用来控制CPU的操作。

 这种特殊的寄存器在8086CPU中,被称为标志寄存器flag。8086CPU的标志寄存器有16位,其中存储的信息通常又被称为程序状态字(PSW)。

 

(1)状态标志位

名称

描述

CF(Carry Flag)进位标志位

当进行加减运算时 ,若最高位发生进位或借位,则CF1,否则为0。该标志位通常用于判断无符号数运算结果是否超出了计算机所能表示的无符号数的范围

PF(Parity Flag)奇偶标志位        

当指令执行结果的8中含有偶数个1时,PF1,否则为0

AF(Auxiliary Flag)辅助进位标志位

当执行一条加法或减法运算指令时,若结果的低字节的低4位向高4位有进位或借位,则AF=1,否则为0

ZF(Zero Flag)零标志位

当前的运算结果为0,则ZF=1,否则为0

SF(Sign Flag)符号标志位

运算结果的最高位为1SF=1,否则为0

OF(Overflow Flag)溢出标志位

(根据最高位的进位和次高位的进位是否相同来确定。两者不同为1,否则为0)

当运算结果超出了带符号数所能表示的数值范围,即溢出时,OF=1,否则为0该标志通常用来判断有符号数运算结果是否溢出

溢出标志的概念

  • 研究处理器内部以补码表示有符号数
  • 8位整数范围是:-128~+127
  • 16位整数范围是:-32768~+32767
  • 如果运算结果超出这个范围,就产生了溢出
  • 有溢出,说明有符号数的运算结果不正确

溢出判断规则:

  • 真值超范围
  • 同号相加(异号相减):正 + 正 —> 负   负 + 负 -> 正
  • 双进位

注意:默认运算是补码的运算,一定要变成真值再运算。(补码变成原码的方式是:正数的补码与原码一致,负数的补码:符号位不变,其他位按位取反加1)

溢出和进位的区别

  • OF(溢出)和CF(进位):意义不同
  • 溢出标志:表示有符号数运算结果是否超出范围,运算结果已经不正确
  • 进位标志:标志无符号数运算结果是否超出范围,运算结果仍然正确

(2)三位控制位

控制标志位有三个,用于控制CPU的操作,由程序设置或清除

名称

描述

作用

TF(Trap Flag)跟踪(陷阱)标志位

是为测试程序的方便而设置。若将TF = 1CPU处于单步工作方式

单步标志(没有对应指令)

处理器在每条指令执行结束时,产生一个编号为1的内部中断

TF=1,单步中断

逐条指令调试程序的方法就是单步调试

IF(Interrupt Flag)中断允许标志位

是用来控制可屏蔽中断的控制标志位。IF = 1,表示允许CPU接受外部从INTR(可屏蔽中断请求信号引脚上发来的可屏蔽中断请求;若用CLI指令IF = 0,则禁止CPU接受可屏蔽中断请求信号

控制可屏蔽中断是否响应:

CLI:IF = 0,禁止中断

STI:IF = 1,允许中断

DF(Direction Flag)方向标志位

若将DF= 1,串操作按减地址方式进行,也就是说,从高地址开始,每操作一次地址自动递减;若DF = 0否则按增地址方式进行。

串操作指令,控制地址的变化方向:CLD:DF = 0,地址自动增加

STD:DF = 1,地址自动减少

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/479628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

框架学习之KOCA框架简介

KOCA框架简介 什么是KOCA术语定义发展历史 KOCA的总体架构产品优势开放性敏捷性(一体化解决方案)融合性安全性接入网关- KOCA Gateway KOCA DevOps流水线 KOCA技术栈 金证开发者社区:http://koca.szkingdom.com/ 什么是KOCA KOCA是金证基于…

LC-1376. 通知所有员工所需的时间(DFS:自上而下、自下而上)

1376. 通知所有员工所需的时间 难度中等125 公司里有 n 名员工,每个员工的 ID 都是独一无二的,编号从 0 到 n - 1。公司的总负责人通过 headID 进行标识。 在 manager 数组中,每个员工都有一个直属负责人,其中 manager[i] 是第…

JavaScript常用数组方法-汇总

快速检索 方法解析 1:concat(); 功能:合并数组,可以合并一个或多个数组,会返回合并数组之后的数据,不会改变原来的数组; var str1 [12,2,"hello"];var str2 ["world"]; console.lo…

简单毛概刷题网页制作 2.0(拖欠近一年版)

原因是大概一年之前学校的毛概期末刷题网站突然崩了,但是一直没有修复。当时眼看着复习时间逐渐被压缩,自己啥也做不了,遂自学前端完成毛概刷题网页一枚。 最早的毛概刷题网站仅仅是 1.0 版本(传送门),功能…

Excel技能之对齐,你可能都没想到

Excel表格,既然要做得漂漂亮亮,一定离不开对齐。拍照需要美颜,表格需要对齐。 内容全部挤到一边去。 有些靠左,有些靠右。 加上空格,感觉对齐。如果数据特别多,又逃不过加班的命运。 实在是混乱不堪。审美…

Linux常用命令——iostat命令

在线Linux命令查询工具 iostat 监视系统输入输出设备和CPU的使用情况 补充说明 iostat命令被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就…

Linux安装MongoDB数据库,并内网穿透远程连接

文章目录 前言1. 配置Mongodb源2. 安装MongoDB3. 局域网连接测试4. 安装cpolar内网穿透5. 配置公网访问地址6. 公网远程连接7. 固定连接公网地址8. 使用固定地址连接 转载自Cpolar Lisa文章:Linux服务器安装部署MongoDB数据库 - 无公网IP远程连接「内网穿透」 前言 …

Qt中QDebug的使用

QDebug类为调试信息(debugging information)提供输出流。它的声明在<QDebug>中&#xff0c;实现在Core模块中。将调试或跟踪信息(debugging or tracing information)写出到device, file, string or console时都会使用QDebug。 此类的成员函数参考&#xff1a;https://doc…

C语言—指针的进阶

指针的进阶 字符指针指针数组数组指针数组指针的定义区分&数组名以及数组名数组指针的使用 数组参数、指针参数一维数组传参二维数组传参一级指针传参二级指针传参 函数指针函数指针数组指向函数指针数组的指针回调函数指针和数组相关笔试题和面试题指针笔试题 指针的相关概…

C++ Boost.Reflection库(现在是Boost.PFR)的下载、安装、使用详细教程

这里写目录标题 一、Boost.Reflection简介二、Boost.Reflection&#xff08;现在是Boost.PFR&#xff09;库的下载和安装2.1、下载编译Boost2.2、使用Boost.Reflection&#xff08;现在是Boost.PFR&#xff09; 小结 一、Boost.Reflection简介 ​ Boost.Reflection&#xff0…

【C++】-关于类和对象的默认成员函数(中)-构造函数和析构函数

&#x1f496;作者&#xff1a;小树苗渴望变成参天大树 ❤️‍&#x1fa79;作者宣言&#xff1a;认真写好每一篇博客 &#x1f4a8;作者gitee:gitee &#x1f49e;作者专栏&#xff1a;C语言,数据结构初阶,Linux,C 如 果 你 喜 欢 作 者 的 文 章 &#xff0c;就 给 作 者 点…

Cadence(2):向导制作PCB封装

前提&#xff1a;软件版本 焊盘设计 &#xff1a;Pad Designer16.6PCB设计 &#xff1a;PCB Editor16.6 文章目录 LQFP64向导封装制作封装信息SMD焊盘制作添加焊盘库到PCB Editor新建工程LQFP64向导制作流程后续处理修改栅格大小。贴加1脚标识修改丝印线 总结 LQFP64向导封装制…

获取代码量(针对Pycharm IDEA)

Statistic 这是个一劳永逸&#xff0c;获取代码量的方法。 Beginning!&#xff08;安装到使用可能都不需要5分钟&#xff09; 附上Statistic的官网下载URL&#xff1a;Statistic - IntelliJ IDEs Plugin | Marketplacehttps://plugins.jetbrains.com/plugin/4509-statistic/v…

clion + opencv环境搭建

clion是一个jetbrains提供的c开发环境&#xff0c;和idea,pycharm等开发工具类似&#xff0c;界面有很多相似的地方。 clion内置了一个mingw的编译环境&#xff0c;自带了gcc,g等命令&#xff0c;安装完clion之后&#xff0c;我们新建项目&#xff0c;它会使用内置的mingw环境。…

在KylinV10上使用DTS进行mysql8迁移至DM8

前言&#xff1a; MySQL 到 DM 的移植主要有以下几个方面的工作&#xff1a; 1&#xff0e;分析待移植系统&#xff0c;确定移植对象。2&#xff0e;通过数据迁移工具 DTS 完成常规数据库对象及数据的迁移。3&#xff0e;通过人工完成 MSQL 的移植。4&#xff0e;移植完成后对移…

从设计到产品

从设计到产品 最近上的一些课的笔记&#xff0c;从 0 开始设计项目的角度去看产品。 设计系统 设计系统(design system) 不是 系统设计(system design)&#xff0c;前者更偏向于 UI/UX 设计部分&#xff0c;后者更偏向于实现部分。 个人觉得&#xff0c;前端开发与 UI/UX 设…

使用 ESP32 设计智能手表 – 第 1 部分制作表盘

相关设计资料下载ESP32 智能手表带心率、指南针设计资料(包含Arduino源码+原理图+Gerber+3D文件).zip 人们可以使用智能手表轻松快速地访问消息、警报、健康信息和其他高级信息。虽然智能手表作为独立设备在形式上是革命性的,但当与人们携带的其他设备(例如智能手机或平板…

作为一个大学生你应该知道的事情

作为一个大学生你应该知道的事情 大学生毕业去向 今天&#xff0c;我们不写技术&#xff0c;来谈一谈大学生的毕业现状&#xff1a; 以下内容为本人的一些观点和看法&#xff0c;仅限于沟通交流。 大学生毕业去向 大学生的毕业去向大致可以分为&#xff1a;就业、自由职业、慢…

Python之常用设计模式

1、 设计模式 2、接口 interface.py #! /usr/bin/env python # -*- coding: utf-8 -*- # Date: 2018/12/1# class Payment: # def pay(self, money): # raise NotImplementedErrorfrom abc import ABCMeta, abstractmethod# 接口 # class Payment(metaclassABCMet…

低频量化之 可转债 配债数据及策略 - 全网独家

目录 历史文章可转债配债数据 待发转债&#xff08;进展统计&#xff09;待发转债&#xff08;行业统计&#xff09;待发转债&#xff08;5证监会通过&#xff0c;PE排序&#xff09;待发转债&#xff08;5证监会通过&#xff0c;安全垫排序&#xff09;待发转债&#xff08;5证…