
简介这份PDF文档是Intel 8086 16位微处理器的官方技术手册1990年9月版Order Number 231455-005面向计算机体系结构学习者、汇编语言开发者与嵌入式硬件工程师用于系统理解8086的架构、引脚定义与工作模式。手册完整覆盖8086/8086-2/8086-1三种时钟频率版本5、8、10MHz阐述HMOS-III工艺、40引脚CERDIP与塑料封装、1MB直接寻址能力、14个16位寄存器组、24种操作数寻址模式以及位、字节、字与块操作和二进制/十进制有符号无符号乘除运算。引脚章节逐一说明AD15-AD0地址数据复用总线、BHE/S7、A19/S6-A16/S3状态线在T1至T4各时钟周期的功能与时序并讲解最小模式与最大模式下的局部总线连接、中断应答与保持应答期间的三态关闭行为以及MULTIBUS系统兼容接口和标准/扩展温度范围版本差异。资源为单个PDF文件约629KB轻量易存已有630人学习下载适合作为查阅指令时序、设计总线接口或复习微机原理的案头参考。1. 8086 手册为什么一条 16 位总线能同时装下地址和数据翻到 8086 手册的引脚表第一眼最容易让人愣住的不是那 40 个引脚而是 AD15–AD0 这组名字——地址和数据居然共用同一批引脚。一颗 16 位 CPU 要访问 1MB 内存地址线本该有 20 根可封装只有 40 脚引脚不够用于是设计者把地址总线和数据总线在时间上错开T1 周期送地址T2 之后同一批线改送数据。这个“时间复用”的决定是理解 8086 整份手册的钥匙也是后来无数总线设计反复借鉴的底层思路。搞懂它你才知道为什么 8086 系统里必须外挂地址锁存器为什么 ALE 信号不能省为什么读周期里 RD 要等到 T2 才拉低。这份 1990 年的手册把这些时序约束一条条写进了引脚描述里读它不是为了背引脚而是为了看清一颗 CPU 如何在物理资源受限时做取舍。2. 总线复用20 根地址线怎么塞进 16 个引脚8086 的物理封装是 40 脚 CERDIP 或塑料封装扣掉电源、地、时钟和一堆控制信号留给地址和数据的引脚根本不够 2016。手册给出的答案是分时复用AD15–AD0 在 T1 周期作为地址总线的低 16 位在 T2、T3、TW、T4 周期转为数据总线A19/S6–A16/S3 这四根线在 T1 送地址高 4 位之后改送状态信息。这样 20 位地址和 16 位数据就压缩进了 20 根物理线里。2.1 T1 与 T2 的分工地址锁存器为什么是必需品复用带来的直接后果是地址只在 T1 周期有效一个时钟周期后就消失。内存和 I/O 设备不可能在这么短的时间里完成译码和片选所以系统必须用一个外部锁存器把 T1 的地址“抓”下来。手册在 ALE 引脚描述里写得很直白ALE 是 T1 期间的高脉冲专门提供给 8282/8283 地址锁存器使用而且 ALE 永远不会被浮空。这句话背后是一条硬约束——只要用 8086ALE 就必须接到锁存器的锁存使能端否则地址会在 T2 消失整个总线直接翻车。常见的实现思路是ALE 上升沿之后地址稳定下降沿把地址锁进 8282之后整个总线周期里锁存器输出一直保持有效地址内存侧看到的就是一根“静态”地址总线。这也是为什么 8086 最小系统的原理图上地址锁存器几乎和 CPU 一样不可省略。# 典型 8086 最小系统地址锁存连接示意 # 8086 ALE - 8282 STB锁存使能 # 8086 AD15-AD0 - 8282 D 输入 # 8282 Q 输出 - 系统地址总线 A15-A0 # 8086 A19/S6-A16/S3 - 另一片 8282只锁 4 位上面这段连接示意说明了一个关键点锁存器不是“可选优化”而是复用总线的必要配套。ALE 的时序特性决定了锁存动作必须发生在 T1 内晚一个周期地址就已经变成数据了。2.2 BHE 与 A0一个字节到底落在高半还是低半复用总线还带来一个字节粒度的问题。8086 的数据总线是 16 位的但程序经常只读写一个字节。手册用 BHE 和 A0 两根信号组合出四种情况BHE 低、A0 低表示整字传输BHE 低、A0 高表示高字节到奇地址BHE 高、A0 低表示低字节到偶地址两者都高表示不传输。这张真值表在手册里以表格形式给出是理解 8086 字节寻址的入口。我一般会这么理解A0 管低半总线D7–D0BHE 管高半总线D15–D8两者互为镜像。接在低半总线上的 8 位设备用 A0 做片选条件接在高半总线上的设备用 BHE 做片选条件。这样设计的好处是一个 16 位字无论落在偶地址还是奇地址都能一次传完代价是奇地址字要跨两个总线周期——手册明确说字操作数可以位于奇地址边界不像很多 16 位机那样强制偶对齐灵活性换来的就是奇地址访问多花一个周期。2.3 三态浮空hold acknowledge 期间总线为什么必须“放手”手册在 AD15–AD0、A19/S6–A16/S3、RD、BHE/S7 等多处反复提到“float to 3-state OFF during hold acknowledge”。这不是重复啰嗦而是多处理器系统的基础。当另一个总线主控通过 HOLD 或 RQ/GT 请求总线时8086 必须把自己的输出置为高阻否则两个主控同时驱动总线就会冲突。手册规定 HLDA 在 T4 或 Ti 的中段发出同时浮空局部总线和控制线等 HOLD 变低后再重新驱动。这里有个容易忽略的细节ALE 是唯一“never floated”的信号。原因是 ALE 只在本处理器内部时序里起作用不参与多主控的总线仲裁浮空它没有意义。理解哪些信号浮空、哪些不浮空是读懂 8086 多处理器配置的起点。3. BIU 与 EU取指和执行为什么要拆成两个单元手册的功能描述开篇就把 8086 内部逻辑分成两个单元总线接口单元 BIU 和执行单元 EU。这两个单元“大部分时间作为独立的异步处理器运行”BIU 负责取指、排队、取操作数和地址重定位EU 负责从队列取指令并执行。这个拆分是 8086 性能设计的核心也是它区别于早期 8 位 CPU 的关键。3.1 6 字节指令队列FIFO 如何吃掉内存总线的死时间BIU 内部有一个最多 6 字节的指令队列按先进先出方式工作。手册的描述是只要队列里还有至少 2 字节空间BIU 就会尝试发起一次字取指内存周期。这个“至少 2 字节”的门槛不是随便定的——8086 的数据总线是 16 位一次字取指正好填 2 字节所以队列剩余空间小于 2 字节时再取就会溢出。队列的价值在于把取指和執行重叠起来。EU 执行一条指令时BIU 可以同时在总线上取后续指令内存总线的空闲时间被大幅压缩。手册用“greatly reduces dead time on the memory bus”来描述这个效果。遇到跳转指令时队列会被清空此时第一个进入队列的字节立即对 EU 可用这就是分支指令后那段“等指令”的来源。# 指令队列状态编码QS1、QS0 # 00 - 无操作 # 01 - 队列中取出操作码首字节 # 10 - 清空队列 # 11 - 取出后续字节QS1、QS0 这两根引脚把队列的内部状态暴露到芯片外部外部逻辑可以据此跟踪 8086 的取指进度。这个设计在当年是为了配合协处理器和调试硬件今天看则是一个很早期的“内部状态可观测”思路。3.2 段寄存器与 20 位地址16 位寄存器怎么拼出 1MB8086 的寄存器是 16 位的但地址总线是 20 位的1MB 空间靠段机制拼出来。手册写得很清楚内存被逻辑划分为代码段、数据段、附加数据段和堆栈段每段最大 64KB段基址落在 16 字节边界上。物理地址的计算方式是段寄存器左移 4 位再加上偏移量这个“左移 4 位”等价于乘以 16所以段边界天然是 16 字节对齐。段寄存器的自动选择规则是手册里另一处值得细读的地方取指用 CS堆栈操作用 SS串操作的目的地址用 ES一般数据访问用 DS。手册的解释是“按程序的寻址需求选择段类型”让同类信息共享同一组逻辑属性程序因此更短、更快、更有结构。这套机制后来被诟病为“分段模型的包袱”但在 1978 年的工艺条件下用 16 位寄存器覆盖 1MB 空间段机制是成本最低的方案。3.3 24 种寻址模式操作数地址在 EU 里怎么算出来手册在特性列表里写了“24 Operand Addressing Modes”这个数字来自基址、变址、位移量的组合。EU 负责计算未重定位的操作数地址然后交给 BIU 去访问内存。这里的分工很关键EU 只算偏移段基址的叠加和物理地址生成由 BIU 完成。所以 EU 看到的是逻辑地址BIU 看到的是段寄存器加偏移。这种拆分让 EU 不必关心当前用的是哪个段指令编码里只需要指定寻址方式和偏移段选择由指令语义自动决定。代价是程序员要时刻记住当前 DS、ES、SS 指向哪里稍不留神就会踩到段越界的坑——这也是后来保护模式引入描述符表的动机之一。4. 最小模式与最大模式同一颗芯片的两套总线人格8086 的第 33 脚 MN/MX 决定了芯片工作在最小模式还是最大模式。手册把两种模式的引脚功能分开描述最小模式下 8086 自己产生 M/IO、WR、INTA、ALE、DT/R、DEN 等控制信号最大模式下这些引脚改作 S2、S1、S0 状态输出由 8288 总线控制器译码生成实际控制信号。同一颗芯片两套总线人格。4.1 S2/S1/S0 状态编码8288 如何把状态翻译成控制信号最大模式下S2、S1、S0 在 T4、T1、T2 有效T3 或 TW 且 READY 为高时回到被动态 111。手册给出的编码表覆盖了中断应答、读 I/O、写 I/O、暂停、取指、读内存、写内存七种总线周期。8288 拿到这三根状态线后译码出 MRDC、MWTC、IORC、IOWC、INTA 等具体控制信号。这个设计的动机是解耦8086 只负责“宣布要做什么”具体时序由总线控制器实现。好处是总线控制器可以针对不同系统做优化坏处是最大模式的最小系统反而比最小模式更复杂。手册没有明说哪种模式更好但从引脚描述的顺序看最小模式先讲、最大模式后讲暗示了最小模式是默认起点。4.2 RQ/GT 三脉冲握手总线主控权怎么交接最大模式下的 RQ/GT0 和 RQ/GT1 是双向引脚用三脉冲完成一次总线交接。手册把流程写得很细请求方发一个 1 CLK 宽的脉冲脉冲 18086 在 T4 或 T1 回一个 1 CLK 宽的脉冲脉冲 2表示总线已浮空、下个时钟进入 hold acknowledge请求方再发一个脉冲脉冲 3表示请求即将结束、8086 可以在下个时钟收回总线。每次交接后必须有一个死时钟周期。这套握手的精妙之处在于用最少的引脚完成了双向仲裁RQ/GT0 优先级高于 RQ/GT1内部还有上拉电阻可以悬空。手册还列出了 8086 在当前内存周期中释放总线的四个条件请求发生在 T2 或之前、当前周期不是奇地址字的低字节、当前周期不是中断应答序列的第一次应答、当前没有执行锁定指令。这四条规则是理解 8086 多主控系统时序的关键任何一条不满足8086 都会把当前周期做完再放手。4.3 LOCK 与 TEST两条容易被忽略的同步信号LOCK 输出在锁定前缀指令执行期间保持有效告诉其他总线主控不要抢总线。手册说 LOCK 由 LOCK 前缀指令激活并保持到下一指令完成。这条信号在多处理器系统里是原子操作的硬件基础没有它读-改-写序列中间就可能被别的主控插进来。TEST 输入则配合 WAIT 指令使用TEST 为低时继续执行否则处理器进入空闲等待。手册强调 TEST 在每个时钟周期的 CLK 上升沿被内部同步。这个信号在当年常用来等协处理器完成计算是 CPU 与外部慢速设备同步的一种低成本手段。5. 避坑读 8086 手册时最容易翻车的几个地方5.1 把 AD 总线当纯地址线用现象照着引脚名画原理图把 AD15–AD0 直接接到内存地址输入结果系统上电后地址乱跳。原因AD 线是复用的T1 之后变成数据线地址只在 T1 有效。解决必须经 8282 锁存ALE 接锁存使能锁存器输出才是稳定地址。5.2 忽略 READY 的同步要求现象慢速内存接上后偶尔读写错误换内存就好了以为是内存质量问题。原因手册明确写 8086 的 READY 输入“is not synchronized”建立和保持时间不满足时正确操作无法保证。解决READY 必须经 8284A 时钟发生器同步后再送入 8086不能直接把内存的应答信号接上去。5.3 奇地址字访问少算一个周期现象按偶地址对齐写的代码跑得好好的换到奇地址边界就变慢甚至时序对不上。原因手册说字操作数可以在奇地址边界但奇地址字要跨两个总线周期BHE 和 A0 的组合决定了高低字节分两次传。解决性能敏感的代码尽量让字操作数偶对齐或者接受奇地址访问多一个周期的代价。5.4 在 hold acknowledge 期间还驱动总线现象多主控系统里两个主控同时输出总线电平打架。原因手册多处写明 AD、A19/S6–A16/S3、RD、BHE/S7 等在 hold acknowledge 期间浮空到三态关闭但外部缓冲器如果没有跟着关断就会继续驱动。解决外部总线缓冲器的使能要跟 HLDA 联动HLDA 有效时关断本主控的驱动。5.5 把 ALE 也做成可浮空现象多主控切换后锁存器偶尔锁到错误地址。原因手册特别注明 ALE“is never floated”它不参与总线仲裁。解决ALE 始终由 8086 驱动不要试图在 hold acknowledge 期间关断它锁存器的使能逻辑要按这个前提设计。6. 从 40 个引脚看设计取舍复用是妥协还是远见8086 的手册读到最后会发现几乎每一处设计都在回答同一个问题引脚不够、工艺有限、又要覆盖 1MB 空间和 16 位运算怎么办。总线复用是妥协因为它逼着系统外挂锁存器、逼着时序里插入 T1 专门送地址但它也是远见因为它用 20 根线同时承载了地址和数据把 40 脚封装的可能性榨到了极限。段机制同样是妥协16 位寄存器拼 20 位地址段边界强制 16 字节对齐程序员要记四个段寄存器但它让 1978 年的芯片用最低成本摸到了 1MB 的门槛。BIU 和 EU 的拆分则是另一种取舍两个单元异步运行指令队列做缓冲取指和执行重叠代价是分支指令要清空队列、EU 要等 BIU 填满。手册没有回避这些代价它把队列状态用 QS1、QS0 引出来把总线释放的四个条件一条条列清楚把 READY 不同步的风险写在引脚描述里。这种“把约束写在明面上”的文档风格恰恰是读老手册最有价值的地方——它不粉饰设计而是让你看到每个信号背后的权衡。验证这些机制最直接的办法是对着时序图数时钟周期T1 送地址、T2 数据有效、TW 插等待、T4 结束再对照 BHE 和 A0 的真值表看字节落在哪半总线。我一般会建议先拿一个最小模式的读周期把 ALE、RD、AD 三根线的波形对一遍再去看最大模式下 S2/S1/S0 怎么被 8288 翻译成 MRDC。手册里的引脚表和状态编码表不是用来背的是用来在波形对不上时回头查的。从那以后我每次碰复用总线的东西都会先把“地址什么时候有效、谁负责锁存、浮空期间谁在驱动”这三个问题过一遍再动手画连接。8086 手册把这三个问题的答案拆散在几十页引脚描述里读的时候慢一点后面踩坑就少一点。希望帮到你。本文还有配套的精品资源点击获取