4.1节对80868088CPU内部结构与工作原理的分析,集中介绍

在8086/8088CPU的指令集中,大部分指令都会用到CPU内部的寄存器,而这些寄存器各不相同,每个寄存器都有自己的特殊功能。因此,了解CPU中各个寄存器的作用是进一步学习指令系统的前提。本节将结合4.1节对80868088CPU的内部结构和工作原理进行分析,重点介绍这两款CPU芯片的寄存器组。看完这一节,读者可能会觉得对寄存器及其用途的理解还不够清楚。这是正常的,因为对寄存器功能的深入理解必须结合指令系统来学习,可以通过学习丰富的例子来实现。然而,通过这项研究,

首先要了解什么是数据寄存器组;数据寄存器是指用来实现指令功能的寄存器。换句话说,数据寄存器是机器指令在执行时使用的寄存器。从图4.1.可以看出,数据寄存器都连接在CPU内部的本地数据总线上,这样就可以为算子或者其他寄存器提供原始数据,即,提供源操作数;从本地数据总线接收并保存运算符的运算结果或从其他寄存器读取的数据,即保存目标操作数。物理上,有 4 个 16 位数据寄存器,分别是 AX、BX、CX、DX。AX的全称是累加器,BX是基址寄存器,CX是计数寄存器,DX是数据寄存器。这些名字看起来很奇怪,等我们以后学习指令系统的时候,就会逐渐明白这些名字的含义。请注意,这些寄存器的名称是我们将来在汇编指令中使用的名称。在机器指令中,我们应该知道它们只是二进制地址编码。从逻辑上讲,每个 16 位数据寄存器可以拆分为高位 8 位寄存器和低位 8 位寄存器分别使用,但需要注意的是,这些 8 位寄存器与物理 16 位寄存器重叠. 数据寄存器的名称和彼此的名称。在编程中应该注意,逻辑上不同的寄存器可能会在物理上相互覆盖。例如,我们在修改 AL 寄存器的内容时​​,也同时修改了 AX 寄存器的低 8 位。这里需要注意的是,同一个寄存器可能属于不同的寄存器组,比如BX寄存器,它既属于数据寄存器组改变工作寄存器组的方法是,也属于地址指针寄存器组。稍后我还将介绍它作为地址指针寄存器的用途。

一、段寄存器组 在8086/8088 CPU中,共有4个16位的段寄存器,用于保存4个段的段基值,为生成物理地址提供必要条件的内存单元。通常,这 4 个段寄存器应该在程序操作开始时进行初始化,之后只有在某些情况下才会更改。CPU 中只有 4 个段寄存器,这意味着在任何时候,CPU 可以立即访问的当前段只有 4 个。这4个段寄存器分别是CS、DS、SS、ES,它们的全称是代码段、数据段、堆栈段和ExtraSegment,即代码段寄存器、数据段寄存器、堆栈段寄存器和附加段寄存器。在汇编语言编程中,源程序以段的形式组织,最多有4种段,分别是代码段、数据段、堆栈段和附加段。4 个段寄存器用于指示 4 个段。该段在内存中的起始地址,一个段对应于内存中的一个连续存储区域。代码段用于存放由机器指令组成的程序;数据段通常用于存储可变数据;栈段用于存放中断断点、子程序返回点以及用户使用栈临时保存的数据;附加段通常用于字符串数据。操作,也可以根据程序员的设计,具有其他功能。虽然在源程序中可以定义多种类型的段,CPU在任何时候只能访问每种类型的一个段,即在相应段寄存器中保存段基值的当前段。段基地址是逻辑地址的组成部分。逻辑地址到物理地址的转换方法请参考4.1小节地址加法器的介绍。

二、地址指针寄存器组 地址指针寄存器用于提供内存单元逻辑地址中的偏移量或构成偏移量的元件。偏移量是如何形成的将在第 5 章介绍寻址方式时详细解释。这里只对地址指针寄存器的一般功能和用法进行说明。地址指针寄存器共包含5个16位寄存器,分别是BX、SP、BP、SI、D。它们的全称是基地址寄存器、堆栈指针寄存器、基地址指针寄存器、源变址寄存器、目的变址寄存器. . 这里我们暂时不解释这些名称的含义,等我们学习指令系统后会逐渐理解它们的含义。偏移量是逻辑地址的一个组成部分。逻辑地址到物理地址的转换方法请参考4.1小节地址加法器的介绍。由于地址指针寄存器提供偏移量或其组成部分,因此它们必须使用段寄存器,因为只有这样才能形成完整的逻辑地址。在这种搭配关系中,有些是固定搭配,有些是默认搭配。读者应该在学习中记住它们。表4.2.1 给出了这些地址指针寄存器和段寄存器的配置关系。表4.2.1 地址指针寄存器与段寄存器的搭配关系地址指针在识别和搭配时注册,但在编程时可以修改,并且可以和任意一个段寄存器搭配以及段寄存器的搭配关系 BXSP 只能搭配SS,即默认搭配SS,但是可以在编程的时候修改,可以搭配任意段寄存器默认为 DS,但可在编程过程中修改,默认可与任何寄存器匹配。,但可在编程时修改,可与任何段寄存器匹配;在字符串操作指令中,只能匹配8086/8088CPU中的ES。数据寄存器和地址指针寄存器称为通用寄存器。,第三个输出为否,控制寄存器 但可以在编程时修改,与DS默认匹配任何段寄存器,但在编程时可以修改,默认匹配任何寄存器。,但可在编程时修改,可与任何段寄存器匹配;在字符串操作指令中,只能匹配8086/8088CPU中的ES。数据寄存器和地址指针寄存器称为通用寄存器。,第三个输出为否,控制寄存器 但可以在编程时修改,与DS默认匹配任何段寄存器,但在编程时可以修改,默认匹配任何寄存器。,但可在编程时修改,可与任何段寄存器匹配;在字符串操作指令中,只能匹配8086/8088CPU中的ES。数据寄存器和地址指针寄存器称为通用寄存器。,第三个输出为否,控制寄存器 只能搭配8086/8088CPU中的ES。数据寄存器和地址指针寄存器称为通用寄存器。,第三个输出为否,控制寄存器 只能搭配8086/8088CPU中的ES。数据寄存器和地址指针寄存器称为通用寄存器。,第三个输出为否,控制寄存器

8086/8088CPU中的控制寄存器包括指令指针寄存器IP和标志寄存器FR。控制寄存器是指可以直接或间接控制程序执行流程的寄存器。IP寄存器英文全称是InstructionPointer,即指令指针。它的含义很明确,因为寄存器中存放的是CPU将从内存中读取的下一条指令的第一个字节在当前代码段(CS所指向的段)中。偏移量,其中第一个字节是指多字节指令的第一个字节。IP pinning 与 CS 一起使用,以形成下一条要读取的指令的逻辑地址。CPU中的BIU模块每次从内存中读取一条机器指令,它会自动修改 IP 中的偏移量以指向下一条机器指令的第一个字节。也就是说改变工作寄存器组的方法是,当某条机器指令执行时,P中的偏移量已经指向下一条指令。从以上分析可知,P寄存器的属性原本更接近地址指针寄存器,但传输指令、循环控制指令、子程序调用和返回指令都是通过修改IP中的偏移量来达到控制程序流程的目的. ,以实现程序中的分支、循环结构以及子程序调用和返回的功能。因此,由于修改指令指针可以控制程序流程,这里将其归类为控制寄存器。接下来,我们将介绍最重要的寄存器,最复杂的寄存器,而初学者最难理解的就是标志寄存器FR(或PSW),其英文全称是Flag register(或Program Status Word)。这是 80868088CPU 中唯一的按位操作寄存器。该寄存器是一个 16 位寄存器。标志寄存器中有 9 个有效标志位,这 9 个标志位中的每一个都有唯一的含义。其中CF、PF、AF、ZF、SF、OF为643

一个状态标志位,用于反映8086/8088汇编语言编程特性的运算过程和最后一次算术或逻辑运算中的运算结果影响标志位:TF、F、DF为3个控制标志位,用于控制CPU 如何处理一些特定的事件和控制 CPU 的工作模式。大多数条件分支指令和一些循环控制指令会根据一些状态标志的值来决定是否改变程序的执行流程。换句话说,FR的状态标志可以间接影响程序执行的流程。因此,FR被归类为控制寄存器。. 状态标志位根据运算过程和结果,通过特定的逻辑电路,通过运算指令间接影响过程,并根据一定的生成规则;而控制标志位没有特定的逻辑电路来生成,程序员可以根据需要使用。指令直接置1或清0,达到控制的目的。标志寄存器中每个标志位的位置如图4.2.2 所示。下面我们将一一介绍各个标志位的含义。过去,这里指出的只是每个标志的主要含义,而不是其全部含义。由于每条指令对标志位的解释可能不同,这里不可能一一列举。1.进位标志(CF)执行加减算术运算指令时,如果最高位(字节为第7位,字为第15位)产生进位或借位,则 CF 标志置 1 ,否则 CF 标志清零。 CF 标志的这个属性可以用来判断无符号数编码的加减运算是否溢出。假设操作数被解释为无符号数编码,执行加减指令后,如果CF为0,则运算不会溢出;如果 CF 为 1,则操作溢出。另外,更重要的是,使用CF标志位可以实现高低字操作之间的连接,从而实现长操作数操作,突破机器字长的限制。这一点我们在分析加减法指令时会详细说明。执行移位指令时,依次移出的最后一位存入CF;当执行某些逻辑运算指令时,CF 标志位会被强制为 0。需要注意的是,某些算术运算指令不影响 CF 标志位。2.对奇偶校验位(PF)进行算术或逻辑运算后,如果运算结果的低8位包含偶数个“1”数据位,则PF置1;如果它包含奇数个“1”位,PF 将被清除为 0。PF 标志可用于编码奇偶校验,奇偶校验可用于检测网络中的数据传输错误。3.辅助进位标志(AF)执行加减算术运算指令时,如果第3位(最低位为第0位)产生进位或借位,AF标志置1,否则 AF 标志清 0。AF标志的生成规则与CF相同,只是判断的进位借位位置不同。AF标志主要用在BCD码运算调整指令中,将在数值运算编程介绍章节中详细说明。需要注意的是,一些逻辑操作指令会影响AF标志,但它们的影响是没有意义的。

4.零值标志(ZF) 执行算术运算或逻辑运算指令时,如果运算结果为0,则ZF标志置1,否则ZF标志置0。 ZF标志非常广泛,例如比较两个代码是否相等,判断计数是否为0,判断存储单元中指定位的值等等。我们在学习的时候会逐渐意识到ZF标志的重要性指令系统和编程。5.符号标志位(SF) 执行算术运算或逻辑运算指令时,SF标志位与运算结果的最高位一致。当程序员将参与运算的操作数解释为补码时,可以看到 SF 运算结果的符号位。但需要注意的是,当程序员不将操作数解释为补码时,SF是没有意义的;而当补码运算溢出时,运算结果的符号位会出错,SF是运算结果符号位的直接反映,所以也会报错。SF标志通常与条件分支指令中的OF标志一起使用,以确定两个补码之间的大小关系。变量将6.溢出标志(OF) 当算术运算指令执行时,如果根据补码解释的运算有溢出,则OF标志置1;如果根据补码解释的运算没有溢出,则 OF 标志清零。只有当程序员将算术指令的操作数解释为二进制补码时,OF 标志才有意义。OF标志可以用来判断补码运算是否溢出,也可以和SF、ZF结合使用,判断两个补码的大小关系。在一些逻辑运算指令中,OF 标志位会被强制设置为 07. 单步跟踪标志位(TF) TF 标志位是控制标志位。清0时,CPU工作在连续执行指令。在工作模式下,它会不断地从内存中读取机器指令,并不断地解释和执行它们;当 TF 标志设置为 1 时,CPU 工作在单步模式。产生单步中断,当前CPU中的寄存器和标志位的值显示在屏幕上,暂停执行。正是因为TF标志可以触发单步中断,我们才能单步调试由机器指令(或汇编指令)组成的程序。因此,我们可以称TF标志为单步调试的硬件基础。这种单步工作模式不仅存在于8086/8088 CPU中,在其他类型的CPU中也有类似的工作模式。8. 中断使能标志位 (IF) IF 标志位是一个控制标志位。清0时,CPU不会响应任何可屏蔽的中断,但仍会响应不可屏蔽的中断;当设置为 1 时,CPU 将响应所有可屏蔽和不可屏蔽中断。

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论