2.1 8086/88 CPU的编程结构
8086/88CPU内部结构是理解微机工作原理的重要部分,其寄存器构成及作用是编写汇编程序所必须掌握的。本节内容的掌握对后续章节的学习很重要。
2.1.1 8086/88 CPU的内部结构
在8086/88之前,微处理器执行指令的过程是串行的,即取出指令而后分析执行,再取下条指令分析执行。为了使取指和分析、执行指令可并行处理、提高CPU的执行效率,8086/88CPU由两大模块总线接口单元BIU(Bus Interface Unit)和执行单元EU(Execution Unit)组成,如图2.1所示。
图2.1 8086/88 CPU的两大模块
图中英文缩写说明如下。IP:指令指针(Instruction Pointer),SR:段寄存器(Segment Register),ID:指令译码器(Instruction Decoder),ALU:算术逻辑运算单元(Arithmetic Log-ic Unit),UR:通用寄存器(Universal Register),FR:标志寄存器(Flag Register),PSW:程序状态字(Program Status Word)。 8086/88 CPU的内部结构如图2.2所示。 8086/88之间的内部结构区别主要有一点:8086指令列队有6字节,而8088指令列队只有4字节。
图2.2 8086/88 CPU的内部结构图
2.1.2 8086/88 CPU内部的寄存器
汇编程序设计的要点之一是熟悉CPU的寄存器及它们的作用,本节仅对它们进行简单介绍,具体使用请参看3.3节。 8086/88 CPU中共有14个16位寄存器(R),其分类如图2.3所示。这14个寄存器均为16位二进制的寄存器,其中4个通用数据寄存器AX、BX、CX和DX可分为8个8位寄存器AH、BH、CH、DH和AL、BL、CL和DL使用。通用寄存器主要用于存放一般数据。
图2.3 8086/88 内部寄存器
AX(Accumulator)(AH、AL)累加器,它是汇编编程中最常用的一个寄存器,主要用于乘除运算、BCD运算、换码、I/O操作、串操作和中断调用等。
BX(Base)(BH、BL)基址寄存器,主要用于存放地址和基址(默认相对于DS段)等。
CX(Counter)(CH、CL)计数器,主要用于循环计数、串操作计数和移位计数(CL)等。
DX(Data)(DH、DL)数据寄存器,主要用于16位乘除、间接I/O和中断调用等。
BP(Base Pointer)基址指针,主要用于存放地址和基址(默认相对于SS段)等。
SP(Stack Pointer)堆栈指针(栈顶指针),主要用于存放栈顶地址。
SI(Source Index)源变址寄存器,用于存放地址、变址和串操作源变址。
DI(Destination Index)目的变址寄存器,用于存放地址、变址和串操作目的变址。
CS(Code Segment)代码段寄存器(代码段),用于存放正在或正待执行的程序段的起始地址的高16位二进制数据,即程序段的段地址。
DS(Data Segment)数据段寄存器(数据段),用于存放正在或正待处理的一般数据段的起始地址的高16位二进制数据,即一般数据段的段地址。
ES(Extra Segment)附加数据段寄存器(附加段),用于存放正在或正待处理的附加数据段的起始地址的高16位二进制数据,即附加数据段的段地址。
SS(Stack Segment)堆栈数据段寄存器(堆栈段),用于存放正在或正待处理的堆栈数据段的起始地址的高16位二进制数据,即堆栈数据段的段地址。
IP(Instruction Pointer)指令指针,它的内容始终是下一条待执行指令的起始偏移地址,与CS一起形成下一条待执行指令的起始物理地址。CS:IP的作用是控制程序的执行流程。IP一般会自动加1(逻辑加1、实际随指令长度变化)移向下一条指令实现顺序执行;若通过转移类指令修改CS或IP的值,则可实现程序的转移执行。
PSW(Program Status Word)程序状态字,它有3个控制标志(IF、DF、TF)和6个状态标志(SF、PF、ZF、OF、CF、AF)。控制标志是用于控制CPU某方面操作的标志,状态标志是部分指令执行结果的标志(下面介绍的是状态标志的通用填充方法,至于特定指令特定的填充方法将在指令系统中介绍)。
IF(Interrupt enable Flag)中断允许标志,用于控制CPU能否响应可屏蔽中断请求,IF=1能够响应,IF=0不能响应。
DF(Direction Flag)方向标志,用于指示串操作时源串的源变址和目的串的目的变址的变化方向,DF=1向减的方向变化,DF=0向加的方向变化。
TF(Trap Flag)陷阱标志(单步中断标志),TF=1程序执行当前指令后暂停,TF=0程序执行当前指令后不会暂停。
SF(Sign Flag)符号标志,指令执行结果的最高二进制位是0还是1,为0,则SF=0,代表正数;为1,则SF=1,代表负数。我们一般是用十六进制数表示,则可以看十六进制的最高位是落在0~7 还是落在8~F之间,若落在0~7 之间则SF=0,否则SF=1。
PF(Parity check Flag)奇偶校验标志,指令执行结果的低8位中1的个数是奇数个还是偶数个,若为奇数个则PF=0,若为偶数个则PF=1。
ZF(Zero Flag)零标志,指令执行结果是不是为0,若为0则ZF=1,否则ZF=0。
OF(Overflow Flag)有符号数的溢出标志,指令执行结果是否超出有符号数的表示范围,若超过则OF=1,否则OF=0。我们可以通过是否出现以下四种情况之一来判断:正加正得负,正减负得负,负加负得正,负减正得正。若出现则OF=1,否则OF=0。
CF(Carry Flag)进位/借位标志(无符号数的溢出标志),指令执行结果的最高位是否有向更高位进位或借位,若有则CF=1,同时也代表无符号数溢出;若无则CF=0,也代表无符号数未溢出。
AF(Auxiliary carry Flag)辅助进位/借位标志,低4位二进制是不是有向高位进位或借位,若有则AF=1,否则AF=0,其主要用于BCD修正运算。
例2.158H+3CH=94H SF=1,PF=0,ZF=0,OF=1,CF=0,AF=1
例2.2 0039H-FCE8H=0351HDW SF=0,PF=0,ZF=0,OF=0,CF=1,AF=0
例2.3 35H+CBH=00H SF=0,PF=1,ZF=1,OF=0,CF=1,AF=1