1、8086 内部结构
8086 由执行单元EU 和 总线结构单元BIU 两大部分构成。
-
执行单元EU
主要功能是:执行指令、分析指令、暂存中间运算结果并保留结果的特征。它由算术逻辑单元(ALU)、通用寄存器、标志寄存器、EU控制电路组成。EU在工作时不断地从指令队列中取出指令代码,对其译码后产生完成指令所需要的控制信息。数据在 ALU 中进行运算,运算结果的特征保留在标志寄存器 FLAGS中。 -
总线接口单元 BIU
主要功能是:负责CPU与存储器、I/O接口之间的信息传送。它由段寄存器、指令指针寄存器、指针队列、地址加法器、总线控制逻辑组成。
当EU从指令队列中取走指令,指令队列出现空字节时,BIU 就自动执行一次取指令周期,从内存中取出后续的指令代码放入队列中。当EU需要数据时,BIU根据EU给出的地址从指定的内存单元或外设中取出数据供EU使用。在运算结果时,BIU将运算结果送入指定的内存单元或外设。
如果指令队列为空,EU就等待,直到有指令为止。若BIU正在取指令,EU发出访问总线的请求,则必须等BIU取指令完毕后该请求才能得到响应。一般情况下,程序顺序执行,当遇到跳转指令时,BIU就使指令队列复位,从新地址取出指令,并立即传给EU去执行。
指令队列的存在使 8086的EU和BIU并行工作,从而减少了CPU为取指令而等待的实践,提高了CPU的利用率,加快了整机的运行速度,另外也降低了对存储器存取速度的要求。
# 物理地址 & 逻辑地址
因为 8086是16位处理器,即8086的寄存器均为16位数据,但是8086的地址总线为20位,因此代码中出现的地址均为逻辑地址,并非实际的物理地址,因此逻辑地址需要转换为物理地址;
2、控制寄存器
FLAGS 标志寄存器
FLAGS 标志寄存器是一个 16位寄存器,但只使用其中的 9位,包括 6个状态标志 和 3个控制标志;
1、状态标志
状态标志位记录了算术和逻辑运算结果的一些特征;
-
0_CF:进位标志位
当进行 加 / 减 运算时,若最高位向前有 进位 / 借位,则 CF =1,否则 CF=0; -
2_PF:奇偶标志位
当运算结果的低8位中 1的个数 为偶数时 PF=1,为奇数时 PF=0; -
4_AF:辅助进位标志位
在 加/减 法操作中,D3 向 D4有进位/借位 发生时,AF=1,否则 AF=0. -
6_ZF:零标志位
当运算结果为零时 ZF=1,否则 ZF=0; -
7_SF:符号标志位
当运算结果的最高位为1时 SF=1,否则 SF=0; -
11_OF:溢出标志位
当算术运算的结果超出了带符号数的范围,即溢出时 OF=1,否则 OF=0;
2、控制标志
控制标志位用于设置控制条件,控制标志被设置后便对其后的操作产生控制作用;
-
8_TF:陷阱标志位
当 TF=1 时,激活处理器的调试特性,使 CPU 处于单步执行指令的工作方式,每执行一条指令后,自动产生一次单步中断,从而使用户能逐步指令地检查程序; -
9_IF:中断允许标志位
IF=1 使 CPU 可以响应可屏蔽中断请求;IF=0 使 CPU 禁止响应可屏蔽中断请求;IF 的状态对不可屏蔽中断及内部中断没有影响; -
10_DF:方向标志位
方向标志位在执行串操作指令时控制操作的方向。DF=1 时按 减地址 方式进行,即从高地址开始,没进行一次操作,地址指针自动减1/2;DF=0 时,则按 增地址 方式进行;
IP 指令指针寄存器
用以存放预取指令的偏移地址。CPU 取指令时总是以 CS为段基址,以 IP 为段内偏移地址。
当CPU 从 CS段中偏移地址为(IP)的内存单元中取出指令代码的一个字节后,IP 自动加1,指向指令代码的下一个字节。
注:
用户程序不能直接访问IP。
3、通用寄存器
数据寄存器
-
AX :累加器
常用于存放算术、逻辑运算中的操作数,另外所有的 I/O 指令都使用累加器与外设接口传送信息; -
BX :基址寄存器
存放访问内存的基地址;BX 通常与DS 寄存器配对使用; -
CX :计数寄存器
在循环中、串操作中用作计数器使用; -
DX :数据寄存器
在寄存器间接寻址的 I/O指令中存放 I/O端口的地址;
另外,在做双字节乘除法运算时,DX与AX 合起来存放一个双字节,其中AX存放低16位,DX存放高16位;
基址寄存器
-
BP :基址指针寄存器
一般也常用来存放内存时的基地址,但它通常与 SS寄存器配对使用。 -
SP :堆栈指针寄存器
它在堆栈操作中用来存放栈顶偏移地址,永远指向堆栈的栈顶;
作为通用寄存器,BP和SP 也可以存放数据,但实际上,它们更经常更重要的用途是存放内存单元的偏移地址,特别是SP在访问堆栈时作为指向堆栈栈顶的指针。
变址寄存器
- SI :源变址寄存器
- DI :目的变址寄存器
它们常常在变址寻址方式中作为索引指针。
4、段寄存器
段寄存器用于存放段基址,即段起始地址的高16位;
- CS :代码段寄存器;
- DS :数据段寄存器;
- SS:堆栈段寄存器;
- ES:附加数据段寄存器;
转载:https://blog.csdn.net/ViatorSun/article/details/105713031