标题：8086
简介
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 是标准版本。
1978年：8086/8088微处理器
  i8086处理器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机上开始，个人电脑真正走进了人们的工作和生活之中，它也标志着一个新时代的开始
8086微处理器结构
1．总线接口单元 (BIU bus interface unit)  总线接口单元BIU[1]总线接口部件由下列各部分组成：
⑴4个段地址寄存器：
CS(code segment)——16位的代码段寄存器； 
DS(data segment)——16位的数据段寄存器； 
ES(extra segment)——16位的扩展段寄存器； 
SS(stack segment)——16位的堆栈段寄存器； 
⑵16位的指令指针寄存器IP； 
⑶20位的地址加法器； 
⑷6字节的指令队列缓冲器。2．执行单元 (EU execution unit)执行部件由下列几个部分组成：
⑴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)[2]；
⑵标志寄存器FR(flags register)； 
⑶算术逻辑单元ALU(arithmetic logic unit)。
EU负责全部指令的执行，同时向BIU输出数据（操作结果），并对寄存器和标志寄存器进行管理。在ALU中进行16位运算，数据传送和处理均在EU控制下执行。[3]3、BIU和EU的管理⑴BIU和EU可以并行工作，提高CPU效率。BIU监视着指令队列。当指令队列中有2个空字节时，就自动把指令取到队列中。  8086cpu结构图
⑵ EU执行指令时，从指令队列头部取指令，然后执行。如需访问存储器，则EU向BIU发出请求，由BIU访问存储器。
⑶ 在执行转移、调用、返回指令时，需改变队列中的指令，要等新指令装入队列中后，EU才继续执行指令。
8086引脚
概念  8086CPU引脚图在学习8086 CPU的引脚信号前，必须弄清CPU最小模式和最大模式的概念。所谓最小模式，就是在系统中只有一个8086微处理器，所有的总线控制信号都直接由8086 CPU产生，因此，系统中的总线控制电路被减到最少。最大模式是相对最小模式而言的。在最大模式系统中，总是包含两个或多个微处理器，其中一个主处理器就是8086，其他的处理器称为协处理器，它们是协助主处理器工作的。如数学运算协处理器8087，输入/输出协处理器8089。8086 CPU到底工作在最大模式还是最小模式，完全由硬件决定。
当CPU处于不同工作模式时，其部分引脚的功能是不同的。1．两种工作方式功能相同的引脚⑴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工作在最大模式。2．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又重新获得对总线的控制权。3．CPU工作于最大模式时使用的引脚信号当引脚接低电平时，CPU工作于最大模式。此时，引脚信号24～31的含义及其功能如下。
⑴S2,S1,S0（status signals）：总线周期状态信号，输出，低电平有效。
它们表明当前总线周期所进行的操作类型。，，代码组合及其对应操作见表2.3。
表2.3，，代码组合及对应操作表 
⑵RQ/,GT/ （request/grant）：总线请求允许信号输入/总线请求允许输出信号，双向，低电平有效。
该信号用以取代最小模式时的HOLD/HLDA两个信号的功能，是特意为多处理器系统而设计的。当系统中某一部件要求获得总线控制权时，就通过此信号线向8086 CPU发出总线请求信号，若CPU响应总线请求，就通过同一引脚发回响应信号，允许总线请求，表明8086 CPU已放弃对总线的控制权，将总线控制权交给提出总线请求的部件使用。引脚的优先级高于。
⑶LOCK/（lock）总线封锁信号，输出，低电平有效。
信号有效时，表示此时8086 CPU不允许其他总线部件占用总线。
⑷QS1,QS0（queue status）：指令队列状态信号，输出。
QS1和QS0信号的组合可以指示总线接口部件BIU中指令队列的状态，以便其他处理器监视、跟踪指令队列的状态。
指令集
MOV功能： 把源操作数送给目的操作数
语法： MOV 目的操作数，源操作数
格式： MOV r1,r2
MOV r,m
MOV m,r
MOV r,dataXCHG功能： 交换两个操作数的数据
语法： XCHG
格式： XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能： 把操作数压入或取出堆栈
语法： PUSH 操作数 POP 操作数
格式： PUSH r PUSH M PUSH data POP r POP m
PUSHF,POPF,PUSHA,POPA
功能： 堆栈指令群
格式： PUSHF POPF PUSHA POPALEA,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,OSUB,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,ONEG功能： 将OP的符号反相（取二进制补码）
语法： NEG OP
格式： NEG r/m
影响标志： C,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/mCBW,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
标志位： CCLD,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,OSCASB,SCASW功能： 字符串搜索指令
语法： SCASB SCASW
标志位： C,P,Z,S,O
LODSB,LODSW,STOSB,STOSW
功能： 字符串载入或存贮指令
语法： LODSB LODSW STOSB STOSW
标志位： 无
REP,REPE,REPNE
功能： 重复前缀指令集
语法： REP 指令S REPE 指令S REPNE 指令S
标志位： 依指令S而定