Intel 8086是一个由Intel于1978年所设计的16位 微处理器芯片,是x86架构的鼻祖。不久,Intel 8088就推出了,拥有一个外部的8位 数据总线,允许便宜的芯片用途。它是以8080和8085的设计为基础,拥有类似的 寄存器组,但是数据总线扩充为16位。总线界面单元(Bus Interface Unit)透过6字节预存(prefecth) 的队列(queue)位指令给执行单元(Execution Unit),所以取指令和执行是同步的,8086 CPU有20条 地址线,可 直接寻址1MB的存储空间,每一个 存储单元可以存放一个字节(8位)二进制信息。
Intel 8086拥有四个16位的 通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了 堆栈指标)。资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。它提供64K 8 位元的输出输入(或32K 16 位元),以及固定的 向量中断。大部分的指令只能够存取一个内存位址,所以其中一个 操作数必须是一个寄存器。运算结果会储存在操作数中的一个寄存器。
Intel 8086有四个 内存区段(segment) 寄存器,可以从索引寄存器来设定。区 段寄存器可以让 CPU 利用特殊的方式存取1 MB内存。8086 把 段地址左移 4 位然后把它加上 偏移地址。大部分的人都认为这是一个很不好的设计,因为这样的结果是会让各分段有重叠。尽管这样对组合语言而言大部分被接受(也甚至有用),可以完全地控制分段,使在编程中使用 指针(如C编程语言) 变得困难。它导致指针的高效率表示变得困难,且有可能产生两个指向同一个地方的指针拥有不同的地址。更坏的是,这种方式产生要让 内存扩充到大于 1 MB 的困难。而 8086 的 寻址方式改变让内存扩充较有效率。
8086处理器的 时钟频率介于4.77MHz(在原先的IBM PC频率)和10 MHz之间。8086 没有包含浮点指令部分(FPU),但是可以通过外接数学辅助处理器来增强浮点计算能力。Intel 8087 是标准版本。
2.微处理器
8086是Intel系列的16位微处理器,芯片上有4万个晶体管,采用 HMOS工艺制造,用单一的+5V电源, 时钟频率为4.77MHz~10MHz。
8086有16根数据线和20根 地址线,它既能处理16位数据,也能处理8位数据。可寻址的内存空间为1MB。
在取得IBM个人电脑部门敲定的重要销售合约之后,Intel 8088处理器不仅成为了IBM个人电脑的大脑,而且还让IBM个人电脑成为新款畅销产品。为此,Intel 8088处理器的成功,也将英特尔进入“财富杂志500大企业排行榜”, 《财富》杂志将英特尔评为 “70年代最成功的企业”之一。Intel 8088晶体管数目约为2.9万颗。
1978年英特尔公司生产的8086是第一个16位的微处理器。很快Zilog公司和摩托罗拉公司也宣布计划生产Z8000和68000。这就是第三代微处理器的起点。
8086微处理器最高主频速度为8MHz,具有16位数据通道, 内存寻址能力为1MB。同时,英特尔还生产出与之相配合的 数学协处理器i8087,这两种芯片使用相互兼容的 指令集,但intel8087指令集中增加了一些专门用于对数、指数和三角函数等数学计算的指令。人们将这些指令集统一称之为 x86指令集。虽然以后英特尔又陆续生产出第二代、第三代等更先进和更快的新型CPU,但都仍然兼容原来的x86指令,而且英特尔在后续CPU的命名上沿用了原先的x86序列,直到后来因商标注册问题,才放弃了继续用阿拉伯数字命名。
1979年, 英特尔公司又开发出了8088。8086和8088在芯片内部均采用16位数据传输,所以都称为16位微处理器,但8086每周期能传送或接收16位数据,而8088每周期只能传输8位。因为最初的大部分设备和芯片是8位的,而8088的外部8位的 数据传送、接收能与这些设备相兼容。8088采用40针的 DIP封装, 工作频率为6.66MHz、7.16MHz或8MHz,微处理器集成了大约29000个晶体管。
8086和8088问世后不久,英特尔公司就开始对他们进行改进。他们将更多功能集成在芯片上,这样就诞生了80186和80188。这两款 微处理器内部均以16位工作,在外部输入输出上80186采用16位,而80188和8088一样是采用8位工作。
1981年,IBM公司将 8088芯片用于其研制的PC机中,从而开创了全新的 微机时代。也正是从8088开始,个人电脑(PC)的概念开始在全世界范围内发展起来。从8088应用到IBM PC机上开始,个人电脑真正走进了人们的工作和生活之中,它也标志着一个新时代的开始
3.结构
总线接口单元 (BIU bus interface unit)
总线接口部件由下列各部分组成:
⑴4个段 地址寄存器:
CS(code segment)——16位的代码 段寄存器;
DS(data segment)——16位的数据段寄存器;
ES(extra segment)——16位的扩展段寄存器;
SS(stack segment)——16位的堆栈段寄存器;
⑵16位的指令指针寄存器IP;
⑶20位的地址 加法器;
⑷6字节的 指令队列缓冲器
。
执行单元
执行部件由下列几个部分组成:
⑴8个 通用寄存器:即AX、BX、CX、DX,BP,SP,SI,DI ;
其中,4个 数据寄存器:AX、BX、CX、DX;
2个地址指针 寄存器:BP(base pointer),SP(stack pointer);
2个变址寄存器:SI(source index),DI(destination index) ;
⑵ 标志寄存器FR(flags register);
⑶ 算术逻辑单元ALU(arithmetic logic unit)。
EU负责全部指令的执行,同时向BIU输出数据(操作结果),并对寄存器和标志寄存器进行管理。在ALU中进行16位运算,数据传送和处理均在EU控制下执行。
BIU和EU的管理
⑴BIU和EU可以并行工作,提高CPU效率。BIU监视着指令队列。当指令队列中有2个空字节时,就自动把指令取到队列中。
⑵ EU执行指令时,从指令队列头部取指令,然后执行。如需访问 存储器,则EU向BIU发出请求,由BIU访问存储器。
⑶ 在执行转移、调用、返回指令时,需改变队列中的指令,要等新指令装入队列中后,EU才继续执行指令。
4.引脚
概念
在学习8086 CPU的引脚信号前,必须弄清CPU最小模式和最大模式的概念。所谓最小模式,就是在系统中只有一个8086 微处理器,所有的总线 控制信号都直接由8086 CPU产生,因此,系统中的总线控制电路被减到最少。最大模式是相对最小模式而言的。在最大模式系统中,总是包含两个或多个微处理器,其中一个主处理器就是8086,其他的处理器称为协处理器,它们是协助主处理器工作的。如数学运算协处理器8087,输入/输出协处理器8089。8086 CPU到底工作在最大模式还是最小模式,完全由硬件决定。
当CPU处于不同工作模式时,其部分 引脚的功能是不同的。
与之功能相同的
⑴AD15 ~AD0(address data bus):地址/ 数据总线,双向,三态。
这是一组采用分时的方法传送地址或数据的复用 引脚。根据不同 时钟周期的要求,决定当前是传送要访问的 存储单元或I/O端口的低16位地址,还是传送16位数据,或是处于 高阻状态。
⑵A19/S6~A16/S3(address/status):地址/状态信号,输出,三态。
这是采用分时的方法传送地址或状态的复用引脚。其中A19~A16为20位 地址总线的高4位地址,S6~S3是状态信号。S6表示CPU与总线连接的情况,S5指示当前中断允许标志IF的状态。S4,S3的代码组合用来指明当前正在使用的 段寄存器。S4,S3的代码组合及对应段寄存器的情况。
⑶BHE(低)/S7(bus high enable/status):允许总线高8位数据传送/状态信号,输出,三态。
为总线高8位数据允许信号,当低电平有效时,表明在高8位 数据总线D15 ~D8上传送1个字节的数据。S7为设备的状态信号。
⑷RD/(read):读信号,输出,三态,低电平有效。
信号低电平有效时,表示CPU正在进行读 存储器或读I/O端口的操作。
⑸READY(ready):准备就绪信号,输入,高电平有效。
READY信号用来实现CPU与存储器或I/O端口之间的时序匹配。当READY信号高电平有效时,表示CPU要访问的存储器或I/O端口已经作好了输入/输出数据的准备工作,CPU可以进行读/写操作。当READY信号为低电平时,则表示存储器或I/O端口还未准备就绪,CPU需要插入若干个“TW状态”进行等待。
⑹INTR(interrupt request):可屏蔽中断请求信号,输入,高电平有效。
8086 CPU在每条指令执行到最后一个 时钟周期时,都要检测INTR引脚信号。INTR为高电平时,表明有I/O设备向CPU申请中断,若IF=1,CPU则会响应中断,停止当前的操作,为申请中断的I/O设备服务。
⑺TEST/(test):等待测试 控制信号,输入,低电平有效。
信号用来支持构成 多处理器系统,实现8086 CPU与 协处理器之间同步协调的功能,只有当CPU执行WAIT指令时才使用。
⑻NMI(non-maskable interrupt):非屏蔽 中断请求信号,输入,高电平有效。
当NMI引脚上有一个上升沿有效的触发信号时,表明CPU内部或I/O设备提出了非屏蔽的中断请求,CPU会在结束当前所执行的指令后,立即响应中断请求。
⑼RESET(reset): 复位信号,输入,高电平有效。
RESET信号有效时,CPU立即结束现行操作,处于复位状态,初始化所有的内部寄存器。复位后各内部寄存器的状态,当RESET信号由高电平变为低电平时,CPU从FFFF0H地址开始重新启动执行程序。
⑽CLK(clock): 时钟信号,输入。
CLK为CPU提供基本的定时脉冲信号。8086 CPU一般使用时钟发生器8284A来产生时钟信号, 时钟频率为5MHz~8MHz,占空比为1:3。
⑾VCC电源输入 引脚。
8086 CPU采用单一+5V电源供电。
⑿GND:接地引脚。
⒀MN/MX/(minimum/maximum):最小/最大模式输入 控制信号。
引脚用来设置8086 CPU的工作模式。当为高电平(接+5V)时,CPU工作在最小模式;当为低电平(接地)时,CPU工作在最大模式。
CPU工作于最小模式时使用的引脚信号
当引脚接高电平时,CPU工作于最小模式。此时,引脚信号24~31的含义及其功能如下。
⑴IO/M/(memory I/O select): 存储器、I/O端口选择控制信号。
信号指明当前CPU是选择访问存储器还是访问I/O端口。为高电平时,访问存储器,表示当前要进行CPU与存储器之间的 数据传送。为低电平时,访问I/O端口,表示当前要进行CPU与I/O端口之间的数据传送。
⑵WR/(write):写信号,输出,低电平有效。
信号有效时,表明CPU正在执行写 总线周期,同时由信号决定是对存储器还是对I/O端口执行写操作。
⑶INTA/(interrupt acknowledge): 可屏蔽中断响应信号,输出,低电平有效。
CPU通过信号对 外设提出的可屏蔽中断请求做出响应。为低电平时,表示CPU已经响应外设的 中断请求,即将执行 中断服务程序。
⑷ALE(address lock enable): 地址锁存允许信号,输出,高电平有效。
CPU利用ALE信号可以把AD15 ~AD0地址/数据、A19/S6~A16/S3地址/状态线上的地址信息锁存在 地址锁存器中。
⑸DT/(data transmit or receive):数据发送/接收信号,输出,三态。
DT/信号用来控制 数据传送的方向。DT/为高电平时,CPU发送数据到 存储器或I/O端口;DT/为低电平时,CPU接收来自存储器或I/O端口的数据。
⑹ DEN/(data enable):数据允许 控制信号,输出,三态,低电平有效。
信号用作总线收发器的选通控制信号。当为低电平时,表明CPU进行数据的读/写操作。
⑺HOLD(bus hold request):总线保持请求信号,输入,高电平有效。
在DMA数据传送方式中,由总线控制器8237A发出一个高电平有效的总线请求信号,通过HOLD引脚输入到CPU,请求CPU让出总线控制权。
⑻ HLDA(hold acknowledge):总线 保持响应信号,输出,高电平有效。
HLDA是与HOLD配合使用的联络信号。在HLDA有效期间,HLDA引脚输出一个高电平有效的响应信号,同时总线将处于浮空状态,CPU让出对总线的控制权,将其交付给申请使用总线的8237A控制器使用,总线使用完后,会使HOLD信号变为低电平,CPU又重新获得对总线的控制权。
CPU工作于最大模式时使用的引脚信号
当引脚接低电平时,CPU工作于最大模式。此时,引脚信号24~31的含义及其功能如下。
⑴S2,S1,S0(status signals): 总线周期状态信号,输出,低电平有效。
它们表明当前总线周期所进行的操作类型。,,代码组合及其对应操作见表2.3。
表2.3,,代码组合及对应操作表
⑵RQ/,GT/ (request/grant):总线请求允许信号输入/总线请求允许输出信号,双向,低电平有效。
该信号用以取代最小模式时的HOLD/ HLDA两个信号的功能,是特意为 多处理器系统而设计的。当系统中某一部件要求获得总线控制权时,就通过此信号线向8086 CPU发出总线请求信号,若CPU响应总线请求,就通过同一引脚发回响应信号,允许总线请求,表明8086 CPU已放弃对总线的控制权,将总线控制权交给提出总线请求的部件使用。RQ/GT0优先级高于RQ/GT1。
⑶LOCK/(lock)总线封锁信号,输出,低电平有效。
信号有效时,表示此时8086 CPU不允许其他总线部件占用总线。
⑷QS1,QS0(queue status):指令队列状态信号,输出。
QS1和QS0信号的组合可以指示 总线接口部件BIU中指令队列的状态,以便其他处理器监视、跟踪指令队列的状态。
5.指令集
数据传送指令
MOV
功能: 把源 操作数送给目的操作数
语法: MOV 目的操作数,源操作数
格式: MOV r1,r2
MOV r,m
MOV m,r
MOV r,data
XCHG
功能: 交换两个操作数的数据
语法: XCHG
格式: XCHG r1,r2 XCHG m,r XCHG r,m
PUSH,POP
功能: 把操作数压入或取出 堆栈
语法: PUSH 操作数POP 操作数
格式: PUSH r PUSH M PUSH data POP r POP m
PUSHF,POPF,PUSHA,POPA
功能: 堆栈指令群
格式: PUSHF POPF PUSHA POPA
LEA,LDS,LES
功能: 取地址至寄存器
语法: LEA r,m LDS r,m LES r,m
XLAT(XLATB)
功能: 查表指令
语法: XLAT XLAT m
算数运算指令
ADD,ADC
功能: 加法指令
语法: ADD OP1,OP2 ADC OP1,OP2
格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data
影响标志: C,P,A,Z,S,O
SUB,SBB
功能:减法指令
语法: SUB OP1,OP2 SBB OP1,OP2
格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data
影响标志: C,P,A,Z,S,O
INC,DEC
功能: 把OP的值加一或减一
语法: INC OP DEC OP
格式: INC r/m DEC r/m
影响标志: P,A,Z,S,O
MUL,IMUL
功能: 乘法指令
语法: MUL OP IMUL OP
格式: MUL r/m IMUL r/m
影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)
DⅣ,IDⅣ
功能:除法指令
语法: DⅣ OP IDⅣ OP
格式: DⅣ r/m IDⅣ r/m
逻辑运算指令
NEG
功能: 将OP的符号反相(取二进制补码)
语法: NEG OP
格式: NEG r/m
影响标志: C,P,A,Z,S,O
CBW,CWD
功能: 有符号数扩展指令
语法: CBW CWD
AAA,AAS,AAM,AAD
功能: 非压BCD码运算调整指令
语法: AAA AAS AAM AAD
影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)
DAA,DAS
功能: 压缩BCD码调整指令
语法: DAA DAS
影响标志: C,P,A,Z,S
位运算集
AND,OR,XOR,NOT,TEST
功能: 执行BIT与BIT之间的逻辑运算
语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m
影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位
SHR,SHL,SAR,SAL
功能: 移位指令
语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL
影响标志: C,P,Z,S,O
ROR,ROL,RCR,RCL
功能: 循环移位指令
语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL
影响标志: C,P,Z,S,O
程序流程控制集
CLC,STC,CMC
功能: 设定进位标志
语法: CLC STC CMC
标志位: C
CLD,STD
功能: 设定方向标志
语法: CLD STD
标志位: D
CLI,STI
功能: 设定中断标志
语法: CLI STI
标志位: I
CMP
功能: 比较OP1与OP2的值
语法: CMP r/m,r/m/data
标志位: C,P,A,Z,O
JMP
功能: 跳往指定地址执行
语法: JMP 地址
JXX
功能: 当特定条件成立则跳往指定地址执行
语法: JXX 地址
注:
A: ABOVE,当C=0,Z=0时成立
B: BELOW,当C=1时成立
C: CARRY,当弁时成立 CXZ: CX寄存器的值为0(ZERO)时成立
E: EQUAL,当Z=1时成立
G: GREATER(大于),当Z=0且S=0时成立
L: LESS(小于),当S不为零时成立
N: NOT(相反条件),需和其它符号配合使用
O: OVERFLOW,O=1时成立
P: PARITY,P=1时成立
PE: PARITY EVEN,P=1时成立
PO: PARITY ODD,P=0时成立
S: SIGN,S=1时成立
Z: ZERO,Z=1时成立
LOOP
功能: 循环指令集
语法: LOOP 地址
LOOPE(Z)
地址 LOOPNE(Z) 地址
标志位: 无
CALL,RET
功能: 子程序调用,返回指令
语法: CALL 地址 RET RET n
标志位: 无
INT,IRET
功能: 中断调用及返回指令
语法: INT n IRET
标志位: 在执行INT时,CPU会自动将 标志寄存器的值入栈,在执行IRET时则会将 堆栈中的标志值弹回寄存器
串操作集
MOVSB,MOVSW,MOVSD
功能: 字符串传送指令
语法: MOVSB MOVSW MOVSD
标志位: 无
CMPSB,CMPSW,CMPSD
功能: 字符串比较指令
语法: CMPSB CMPSW CMPSD
标志位: C,P,Z,S,O
SCASB,SCASW
功能: 字符串搜索指令
语法: SCASBSCASW
标志位: C,P,Z,S,O
LODSB,LODSW,STOSB,STOSW
功能: 字符串载入或存贮指令
语法: LODSBLODSW STOSBSTOSW
标志位: 无
REP,REPE,REPNE
功能: 重复前缀指令集
语法: REP 指令S REPE 指令S REPNE 指令S
标志位: 依指令S而定