本文主要是介绍【个人回顾】西安电子科技大学-周佳社-微机原理与接口设计-2,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
写在开头:本文不以分享为目的,只是记录自己课程学习过程中觉得重要的部分知识点或者知识体系,以及可能存在的没有解决的问题,欢迎大家来进行交流和指正,其中ps部分为个人将其他学科与其构建联系的个人理解,因此也欢迎您能花费一部分时间帮我进行查漏补缺或者进行指点,学生拜谢。Orz
·本章内容同步于学习通课程微机原理与接口设计8086CPU中的结构与功能(一)至(十一),包括课后习题中本人错误点的回顾,将放在最后。因为视频中并未出现老师布置的课后习题,因此所有都做了。
2.1微处理器的外部结构(宏观)
微处理器的外部结构表现为数量有限的输入输出引脚,进而构成微处理器级总线。微处理器的封装方式主要有两种,分别是双列直插式和扁平式,目前的微处理器扁平式的较多,而本书中主要研究的8086系列CPU为双列直插式封装。8086为16位寄存器,16位的原因是寄存器和ALU是16位的。在8086CPU中,一共有20根地址总线,其中有16根复用为地址总线A0~A15。地址总线的作用是CPU用来给外部存储器提供地址,因为计算机中的存储器是按字节组织的,因此20根外部总线可以提供个可寻址的外部存储器空间。同时16根内部总线为外部I/O提供个可寻址的I/O空间,通过引脚的状态来判断寻址对象。
微处理器中存在着一定的端口,端口实际上就是一个寄存器,可以实现CPU与设备间的信息交换。如I/O端口即为一个传递信息的通道。 一个I/O端口至少要占用一个I/O(端口)地址,这些地址是上文提到的64KB地址中的一个。在电路设计过程中,设计输入端口器件要具备三态功能,使不发生总线竞争。总线竞争会产生很严重的后果,轻则系统瘫痪,重则处理器短路。同时,输入端口必须具备锁存功能,使设备响应时能够解放CPU。我们注意到,在CPU未发送数据时,输出端口并非没有数据而是存在一定的无效数据。
在给端口编码时,有统一编码和独立编码两种方式。
统一编码要求当一个地址码给存储器单元编码时,该地址码就不可以给I/O进行编码了。反之亦然。51类型的处理器广泛应用统一编码的格式。统一编码的优点:因为将I/O端口视为存储器单元进行操作,因此对存储器进行读写的所有操作同样适用于I/O端口。因此程序设计简单,编写灵活。统一编码的缺点:浪费了存储器的地址空间,没有专用的I/O操作指令。
独立编码是8086系列微处理器使用的编码方式。独立编码的优点是节约了存储器的地址空间,缺点是指令记忆复杂,I/O程序设计不够灵活。
寻址方式有两种,分别是直接寻址和间接寻址。寻址方式越多,程序就会越灵活。
2.2微处理器的内部结构
本章节的要求是了解微处理器的工作原理,逐步掌握汇编语言程序设计编程模型。
微处理器内部存在四大部件,分别是①算术逻辑单元ALU,②工作寄存器——分为数据寄存器和地址寄存器,其中地址寄存器可以充当数据寄存器进行暂存操作。③充当中央指挥机关的控制器,可以取指令给指令寄存器并进行译码和分析,④I/O控制逻辑。
控制器的控制流程为程序计数器通过AB取指令,指令通过DB传输到指令寄存器中,再进入指令译码器中,最后通过控制逻辑部件实现相应的功能。同时地址➕2再次取指令,循环往复。
在存取指令过程中,我们往往会使用堆栈操作。堆栈指的是由先进后出原则组织的一段存储器区域(Ps.针对先进后出原则,我们可以将之看做弹夹,先塞入的子弹会被压在下层,然后在射击或者弹出时后被弹出。)。对于这样的堆栈区域,我们用栈顶和栈底来圈定堆栈的范围。栈底即入栈单元的地址,栈顶为PUSH后SD处指向的位置。我们需要注意的是栈底是固定的,而栈顶会随着数据的压入活动。
对于8086而言,堆栈必须按字操作。堆栈单元地址由堆栈指针SP提供,指向栈底➕1单元的地址。 在进行堆栈操作时,如果SP超过范围,会导致堆栈溢出。此时会造成系统死机。因此在定义堆栈区域的时候,除了按要求定义以外,还应同时留出30%富余量,有便于程序的更新与维护。
操作解释:入栈时 PUSH AX ;①sp→sp-2;②两个字节按规则入栈。
出栈时 POP AX;①把sp指针内容指向栈顶地址,弹出两个字节内容给目 的操作数。②sp→sp+2
为了防止堆栈溢出,push 和 pop 的数量应配对。
2.3 8086/8088的内部结构
8086/8088微处理器内部可以分为两大部分,分别是①总线接口单元BIU和②执行单元EU。在BIU中有四个段寄存器分别为①代码段寄存器CS(存放代码段段基址)②数据段寄存器DS(存放数据段段基址)③附加数据段寄存器ES(存放数据段的段基址)和④堆栈段段基址SS(指明堆栈段所在位置)。同时BIU内部还存在指令指针寄存器IP(等效于PC,他提供所在段内的地址)。
8086微处理器的指令队列寄存器有6个字节,有6个指令寄存器。而8088微处理器中只有4个字节。
BIU主要负责从外部存储器中取指令,并将取回的指令放入到指令队列中。EU主要负责从指令队列中根据先进先出原则来获取指令,并对该指令加以执行。
对BIU而言
通常我们将编程时就会创造,编程时需要使用的寄存器称为通用寄存器。它可以组成80886汇编语言程序设计的编程模型。
2.4 8086CPU的寄存器组织
在8086微处理器中一共有14个寄存器。分别是8个通用寄存器,4个段寄存器和2个控制寄存器
1、通用寄存器
通用寄存器中包含四个数据寄存器,分别为AX—累加器,BX—基址寄存器,CX—计数器和DX—数据寄存器(在I/O中做地址寄存器)。两个地址指针寄存器,分别是SP—堆栈指针寄存器,指向段内16位偏移地址。和BP—地址指针寄存器,类似于BX,充当段基址寄存器。和2个变址寄存器。分别为SI—源变址寄存器和DI—目的变址寄存器。
2、段寄存器
段寄存器只有四个,即为上文提到的BIU中的四个寄存器。代码段寄存器CS、数据段寄存器DS、附加数据段寄存器ES、堆栈段段基址SS。其中 CS无法初始化,由处理器自行决定。DS、ES和SS在使用时要先进行初始化,指向定义逻辑段的段地址。
3、控制寄存器
指令指针寄存器IP为16位寄存器,用来提供CS的IP地址,等效于8位的PC,二者均不可以做目的操作数。
处理器状态字寄存器PSW为16位寄存器,但是实际有用的部分只有九位,并分为两类。一类为状态标志,如ZF、CF、PF、OF、SF和AF,反映ALU运算后结果的状态。另一类为控制标志,包括方向控制标志DF,中断允许标志IF和陷阱标志TF,用于控制CPU的运行状态。中断指某个特殊事件发生时,CPU转去从事此事件,事件完成后,CPU接着执行本身任务的过程。
2.5 8086CPU的存储器和I/O组织
1、存储器地址空间与数据存放格式
上文我们提到了,8086外部地址空间由20根地址总线决定,因此有个可寻址的外部地址空间,I/O地址空间由16根地址总线决定,因此有个可寻址的I/O地址空间。但是在IBM、PC机中,我们只用D0~D9给I/O分配地址。因此有个可寻址的I/O地址空间。
在存储器中的数据存放格式主要有字节型、字形、双字型,部分情况下可能用到四字型,一般我们将一个字节存放在一个地质单元,存放时存放补码,上述各个类型均在DS段有定义。这里我们用汇编语言代码来理解
①字节型:一般我们用 DB 来充当字节型数据的伪指令。
②字型:一般我们用 DW 来充当字型数据的伪指令。当数据存储过程中,我们将低地址单元地址称为字的地址。当地址为奇数时称为奇地址,地址为偶数时称为偶地址。当字单元的地址为奇地址时我们称为对准了的字单元,为奇地址时称为未对准的字单元。当CPU在进行读写操作时,对对准了的字操作时只需要花费一个总线周期,对未对准的字操作时需要花费两个总线周期。因此地址定义时尽量在偶地址定义,以加快传输速度。
③双字型数据:一般我们用 DD 来充当双字型数据的伪指令。
2、存储器的分段和物理地址(PA)的行程
在学习该章节时,需要理解两个问题。
①为什么要分段?答:为了把20根地址总线可以寻址的1MB地址空间能够被16位寄存器寻址完。
②怎么分段?答:每个逻辑段最大为64KB,按需求进行分段,每个逻辑段的起始地址必须可以被16整除,因此最多可以分出64KB个段。
分段后,我们用逻辑地址来表示不同分段的某个可寻址单元,逻辑地址由段地址(通常用CS)和段内偏移地址(通常用IP)组成,不同的逻辑地址可能会指向相同的物理地址,因此物理地址唯一,逻辑地址不唯一。
3、物理地址(PA)的形成
物理地址的计算方式是 物理地址=段基址*16+偏移地址,即PA=CS*16+IP。
计算流程为①BIU把CS的内容送至加法器。②加法器将CS内容*16.③BIU把IP内容送至加法器。④加法器对两个内容进行相加。⑤构成取指令所需要的PA。
数据传送操作为
MOV 【BX】,AX; (DS:(BX))←(AX)
堆栈的方式为①暂停总线。②BIU传送DS至加法器并*16.③EU传送BX至加法器④加法器对两个内容进行相加构成PA⑤将PA的值赋值给AX
ps.BIU传送SS的内容至加法器并*16,EU把SP-2的值送至加法器
堆栈操作
PUSH AX;
4、各类指令的地址信息(表2)
理论上分段时,段与段间互相重叠,相邻两个段间最小间隔16字节。当程序初始化时,段寄存器的值对应的段称为当前段。运行期间,更改段寄存器的值可以改变当前段。
这篇关于【个人回顾】西安电子科技大学-周佳社-微机原理与接口设计-2的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!