目录
一、8088CPU的系统总线
1. 最小模式
2. 最大模式
二、8086/8088 CPU 的功能结构
1. 8086/8088 CPU 的内部结构
2. 8086/8088 CPU 的内部寄存器
1)通用寄存器
2)段寄存器
3)控制寄存器
三、8086/8088 CPU 的存储器组织
1. 物理地址
2. 逻辑地址
3. 8086/8088 堆栈的组织
一、8088CPU的系统总线
1. 最小模式
8282 是一个三态地址锁存器:
2. 最大模式
8286 是一个双向三态缓冲器:
二、8086/8088 CPU 的功能结构
1. 8086/8088 CPU 的内部结构
8086/8088 内部由两部分组成:
- 执行单元(EU)
- 总线接口单元(BIU)
8088 处理器内部结构图:
① 执行单元EU
主要功能:分析指令、执行指令、暂存中间运算结果、保留结果的特征。
EU 在工作时不断地从指令队列中取出指令代码,对其译码后产生完成指令所需要的控制信号(微命令)。数据在 ALU 中进行运算,运算结果的特征保留在标志寄存器 FLAGS 中。
② 总线接口单元 BIU
主要功能:负责 CPU 与存储器、I/O接口之间的信息传送。
8086/8088 CPU 中的寄存器均为 16 位,CPU 外部地址线位宽为 20 位。BIU 中使用地址加法器产生 20 位的物理地址,可以寻址的存储单元个数为 1M。
8088 的指令队列长度为 4 字节,8086 的指令队列长度为 6 字节。
2. 8086/8088 CPU 的内部寄存器
8086/8088 CPU 的内部共有 14 个 16 位寄存器,包括:
- 通用寄存器(8个)
- 段寄存器(4个)
- 控制寄存器(2个)
1)通用寄存器
通用寄存器包括:
- 数据寄存器(4个)
- 地址指针寄存器(2个)
- 变址寄存器(2个)
(1)数据寄存器:AX、BX、CX、DX
功能:常用于存放操作数或运算结果。
每个数据类寄存器分别可以作为两个独立的 8 位寄存器使用,从而可以方便地实现 8 位或 16 位的数据处理。
(2)地址指针寄存器:SP、BP
功能:
- 存放操作数;
- 作为地址指针,存放内存单元的偏移地址。
①SP:在堆栈操作中用来存放栈顶单元的偏移地址,永远指向堆栈的栈顶。
②BP:默认用于存放当前堆栈内某个单元的偏移地址,即可以对堆栈内任意单元的数据进行操作。
(3)变址寄存器:SI、DI
功能:
- 存放操作数;
- 作为地址指针;
- 分别固定应用于数据的串操作指令中,提供串操作数的索引地址。
数据寄存器的特殊用途:
①AX:累加器,乘除运算中的隐含操作数以及中间结果;I/O指令中也使用AX/AL进行数据传送。
②BX:基址寄存器,常用于存放被访问内存单元数据块的基地址,默认为 DS 数据段。
③CX:计数寄存器,在循环和串操作指令中用作计数器。
④DX:数据寄存器,用于存放I/O指令中的 16 位端口地址;存放 32 位乘除运算中的高 16 位(低 16 位于 AX 中),以及 32 位除法结果中的余数。
2)段寄存器
- CS:代码段寄存器,当前代码段的段地址。
- DS:数据段寄存器 ,当前数据段的段地址。
- SS:堆栈段寄存器, 当前堆栈段的段地址。
- ES:附加数据段寄存器,当前附加数据段的段地址。
段寄存器用于存放段基址,即段起始地址的高 16 位。
3)控制寄存器
(1)指令指针寄存器 IP
功能:用于存放预取指令的偏移地址。
CPU 取指令时总是以 以 CS 为段基址,IP 为段内偏移地址 。当 CPU 从 CS 段中偏移地址为 (IP) 的存储单元中取出 指令代码的一个字节 后,IP 自动加1,指向指令代码的下一个字节。用户程序不能直接访问IP寄存器。
(2)标志寄存器或程序状态字(PSW)FLAGS
① 算术或逻辑运算结果的特征位
CF(Carry Flag):进位标志位。
加/减法运算时,若最高位有进/借位则 CF=1 。
PF(Parity Flag):奇偶标志位。
运算结果的低 8 位中 1 的个数为偶数时 PF=1,为奇数时 PF=0 。
AF(Auxiliary Carry Flag):辅助进位标志位。
加/减运算中,低位从 Bit0 开始。若 Bit3 向 Bit4 有进/借位,则 AF=1 。
ZF(Zero Flag):零标志位。
当运算结果为零时 ZF=1 。
SF(Sign Flag):符号标志位。
当运算结果的最高位为 1 时 SF=1 。
因为没有考虑运算结果是无符号数还是有符号数,所以 SF 只是告诉我们它可能是个负数。至于它具体是不是负数,还需要我们自己去判断。
OF(Overflow Flag):溢出标志位。
当算术运算的结果超出了带符号数的表示范围时 OF=1 。
考虑两个 32 位数的加法运算。由于 8086/8088 寄存器位宽为 16 位,因此我们只能让低 16 位、高 16 位分别进行相加。其中,高 16 位要考虑由低 16 位传入的进位。
举例:
低 16 位进行运算时,有效数值部分无进位,符号位有进位。如果视作有符号数,那么就是发生了溢出,OF=1 。但实际上我们并没有计算完毕,这只是中间结果而不是最终结果,因此不能当作溢出处理。
因此在实际运算中,我们把低 16 位看作无符号数,把高 16 位看作有符号数。根据高 16 位的运算结果来判断实际运算结果是否溢出。
例、1011 0110 + 1111 0100 。
② 控制标志位
TF(Trap Flag):陷阱标志位,又称跟踪标志位。
TF=1 时,使 CPU 处于单步执行指令的工作方式。
IF(Interrupt Flag):中断允许标志位。
IF=1 使 CPU 可以响应可屏蔽中断请求。
DF(Direction Flag):方向标志位。
在数据串操作时确定操作的方向。
DF=1,地址指针按自减方式进行;DF=0,地址指针按自增方式进行。
三、8086/8088 CPU 的存储器组织
1. 物理地址
是指每个内存单元在整个内存空间中具有的唯一的地址。
8086/8088 CPU 有 20 根地址线,它可以产生 20 位的地址码,寻址范围为 1M。
同时,存储器按照字节进行编址,因此存储器最大容量为 1MB。
因为数据总线是 8 位,所以只能按照字节编址。
在源程序中常用 5 位十六进制数或一个符号来表示一个存储单元的地址。
(重点)
1、任何两个相邻字节单元就构成一个字单元;
2、字单元的地址为两个字节单元的低地址;
3、字数据的存放规则:低 8 位放在较低地址字节单元中,高 8 位放在较高地址字节单元中。
例如:将数据 3456H 放在地址为 09235H 的存储单元中的存储分配。
(计算)
示例:
段地址 = 段基地址 = 段基址
2. 逻辑地址
8086/8088 的存储器段结构的特点:
1、每个段最大长度为 64K(65536)个字节单元组成。
2、每个段的起始地址(段首地址)必须是一个小节的首址。
因为段首地址的低 4 位必为 0000 。
小节(Paragraph)的概念:
从 0 地址开始,每 16 个字节单元称为一个小节。1MB 内存可以划分为 64K 个小节。
段寄存器 CS、DS、ES、SS 均为 16 位,段地址为 16 位,因此分别可以代表 64K 个段。
段内偏移地址为 16 位,因此每个段里面可以有 64K 个存储单元。
逻辑地址通常写成:XXXXH:YYYYH
- XXXXH —— 段地址
- YYYYH —— 段内偏移地址
物理地址 = 段地址 × 16 + 段内偏移地址
例、设某操作数存放在数据段,DS = 250AH,数据所在单元的偏移地址 = 0204H。则该操作数所在单元的物理地址为:
250AH × 16 + 0204H = 252A4H
3、逻辑段在物理存储器中可以是邻接的、间隔的、部分重叠的和完全重叠的等 4 种情况。
说明:一个物理地址可以由多个逻辑地址来表示。
例、同一个物理地址 002D3H 被两个逻辑段中的逻辑地址映射的情况。
4、在任一时刻,一个程序只能访问 4 个当前段中的内容。
4 个当前段分别是代码段、数据段、堆栈段和附加段,它们分别由 4 个段寄存器 CS、DS、SS 和 ES 提供当前段的段地址。
3. 8086/8088 堆栈的组织
在 8086/8088 微机中堆栈是由堆栈段寄存器 SS 指示的一段存储区。
按字节编址,按字存取;长度用字节数表示,长度必为偶数。
特点:
1、数据在堆栈中以字为存取单位,低 8 位放在较低地址单元,高 8 位放在较高地址单元;
以字为存取单位:如果我们分配 91 个单元,那么编译器会自动修正为 92 个单位。
2、SP 的初始化值就是堆栈的长度。由于 SP 是 16 位寄存器,因此堆栈长度小于 64KB。
16 位的表示范围为 0 ~ 65535,若我们分配 65535 个单元,自动修正值不能取到 65536,故只能取为 65534。因此,堆栈的长度小于 64KB。
3、SP 始终表示堆栈段首地址与栈顶之间的距离(字节数)。
- 当 SP 为最大值/初始值时,表示堆栈为空;
-
当 SP 为 0 时,表示堆栈全满。
4、当用户程序中要求的堆栈长度超过一个堆栈段的最大长度 64KB 时,可以设置多个堆栈段。
在不同堆栈之间进行切换时,记得要修改 SS 段寄存器内容。