简介:面向报考东南大学、准备微机原理复试的考生整理的 PDF 复习提纲,适合初试后进入面试准备阶段快速定位重点内容。文档覆盖原码、反码、补码转换,8086 中 EU 与 BIU 的分工及并行优势,FLAGS 标志位、最小与最大模式及 8288 总线控制器作用;指令部分梳理变址寻址、数据传送、输入输出、LEA 与逻辑运算指令,并对比 LOOP、REP 的执行顺序;存储器部分讲解 RAM 矩阵结构、DRAM 刷新、高速缓冲与虚拟存储;输入输出部分整理端口分类与编址方式、DMA 控制、INTR 与 NMI、中断响应流程与中断矢量表,以及 8259A、8255A、8253 编程要点、异步串行通信接口和 A/D、D/A 主要参数。资源包为单个 PDF 文件,约 1.73MB,已有 124 人学习。
1. 补码与总线周期:微机原理复试开场最容易被追问的两件事
东南大学微机原理复试的节奏通常是:先让你在纸上写一个 -128 的原码、反码、补码,接着问 8086 为什么要拆成 EU 和 BIU,然后顺着 I/O 接口一路问到 8259A 的初始化顺序。这份《东南大学微机原理复试重点总结.pdf》把六章内容压成了一页页速查清单,覆盖微型计算机基础、指令系统、汇编语言程序设计、半导体存储器、数字量输入与输出、模拟量输入输出,笔记里还标了电子书页码,比如变址寻址对应 P44~P49、I/O 接口功能的细节在 229 面。它适合三类人:跨专业备考的考生、只剩两周时间的复试突击者,以及工作几年后要给新人补「微机原理与接口技术」底层细节的工程师。
清单本身只是索引,互联网上流传的复试经验帖口径不一,真正拉开差距的是能不能当场写出控制字、算对计数初值、说清标志位的变化规则。后面几章按「总线与执行单元 → 指令与寻址 → 存储器层次 → I/O 与外设芯片 → 中断系统」的顺序展开,每一步都落到可复现的指令和参数上。
2. 8086 的 EU/BIU 并行机制与最小、最大模式的引脚取舍
背下「EU 负责执行、BIU 负责取指」只要十秒,但老师接着问「指令队列满了怎么办」「转移指令为什么拖慢流水」的时候,只背结论就露馅了。
2.1 指令队列:EU 与 BIU 的并行不是玄学
8086 内部把取指和执行拆成两条独立通路。BIU 管理一个 6 字节的指令队列(8088 是 4 字节),只要队列不满、EU 又没有发出总线请求,BIU 就按 CS:IP 顺序预取指令塞进队列。EU 从队列头部取指令译码执行,只有在遇到访存操作数、堆栈操作或者转移指令时才需要占用总线。
收益在于时间重叠:EU 执行一条纯寄存器运算的指令时根本不碰总线,BIU 正好用这几个时钟周期把后续指令取进来。队列空了 EU 停等,队列满了 BIU 停取,两者互为背压。转移指令的代价也在这里,JMP、CALL、RET 会改变 CS:IP,队列里已经预取的顺序指令全部作废,必须清空重新取,这就是流水线气泡的来源,也是当年 8086 相对 8080 提升吞吐量的关键设计。
; 顺序段:EU 做寄存器运算时,BIU 已经把下面两条取进队列 MOV AX, 0100H ADD AX, BX ; 纯寄存器运算,不产生总线周期 MOV [SI], AX ; 遇到访存写操作,EU 向 BIU 申请总线前两条指令在队列里只是数据搬运,真正让 EU 停等的只有第三条的写内存周期。想验证的话用 DEBUG 单步 T 命令逐条走,观察每次 T 之后 CS:IP 的跳变量是否等于上一条指令的长度,就能体会「预取」和「执行」不是同一条时间线。
2.2 FLAGS 九个标志位的判定规则
复试里问 FLAGS,基本是让你把「这个标志什么时候为 1」讲清楚,而不是背名字。
| 标志位 | 位置 | 置 1 条件 | 典型用途 |
|---|---|---|---|
| CF | D0 | 最高位产生进位或借位 | 无符号数比较、多字节加减 |
| PF | D2 | 结果的低 8 位中 1 的个数为偶数 | 串行通信校验 |
| AF | D4 | 低 4 位向高 4 位产生进位 | BCD 调整指令 |
| ZF | D6 | 运算结果为 0 | 条件转移 JE/JNE |
| SF | D7 | 结果最高位为 1 | 有符号数正负判断 |
| OF | D11 | 有符号数溢出 | 有符号比较 JG/JL |
| IF | D9 | 控制标志,决定 INTR 是否被响应 | 开中断 STI / 关中断 CLI |
| DF | D10 | 控制标志,串操作方向 | 地址递增/递减 CLD、STD |
| TF | D8 | 控制标志,单步陷阱 | DEBUG 单步跟踪 |
MOV AL, 7FH ADD AL, 01H ; AL=80H,SF=1 OF=1 CF=0 ZF=0 PF=0 SUB AL, AL ; AL=00H,ZF=1 CF=0 OF=0 PF=1 SF=0有符号溢出的判据是「两个操作数同号、结果异号」。7FH 加 01H 正好从 +127 越过 +128 变成 -128,所以 OF=1;切换到无符号视角,7FH+01H=80H 没有超过 FFH,没有向更高位进位,所以 CF=0。PF 只统计结果低 8 位中 1 的个数,80H 只有一个 1 属于奇数,PF=0;SUB AL,AL 得到 00H,零个 1 是偶数,PF=1。
注意:CF 和 OF 是两本账。看到「溢出」两个字先确认题目问的是无符号进位还是有符号溢出,这两个标志在复试里被混答的概率极高。
2.3 最小模式与最大模式:8288 换来了什么
笔记给的结论是「最大模式是多处理机模式,最小模式是单处理机模式,区别在控制电路」,这句话展开成表格才算答完整。
| 对比项 | 最小模式 | 最大模式 |
|---|---|---|
| MN/MX 引脚 | 接 +5V | 接地 |
| 控制总线来源 | 由 8086 引脚直接输出 | 经 8288 总线控制器译码产生 |
| 支持的处理机 | 单处理机 | 多处理机,可接 8087、8089 |
| 典型附加器件 | 8282/8283 地址锁存器 | 8288 + 8282 + 8286/8287 收发器 |
| 适用场景 | 小系统、教学实验板 | 负载重、需要总线仲裁的系统 |
最大模式下 8086 不再直接输出 RD、WR、M/IO,而是输出 S0、S1、S2 三个状态位,交给 8288 译码得到存储器读写、I/O 读写、中断响应、总线锁定等信号。原因是多个主控器件要共享总线,状态位比直接的控制电平更容易做仲裁和时序配合;同时负载较重,必须加双向总线收发器做驱动。
几个复试高频引脚:AD0~AD15 地址数据分时复用,靠 ALE 下降沿锁存地址;M/IO 区分访存和访端口;DEN、DT/R 控制数据收发方向;READY 用来插入等待周期配合慢速存储器;HOLD/HLDA 用于 DMA 请求与响应;INTR 和 NMI 是两类中断输入,其中 INTR 受 IF 控制;RESET 至少要维持 4 个时钟周期。
3. 寻址方式与传送类指令:从 EA 计算到 LOOP、REP 的执行次序
第二章和第三章在复试里被问到的概率不算大,但只要问到,基本都落在「有效地址怎么算」和「指令执行后指针怎么变」这两个点上。
3.1 变址寻址的 EA 计算与默认段寄存器
| 寻址方式 | 示例 | 有效地址 EA | 默认段 |
|---|---|---|---|
| 立即寻址 | MOV AX, 1234H | 无 | — |
| 寄存器寻址 | MOV AX, BX | 无 | — |
| 直接寻址 | MOV AX, [1234H] | 1234H | DS |
| 寄存器间接 | MOV AX, [BX] | BX | DS |
| 寄存器间接 | MOV AX, [BP] | BP | SS |
| 寄存器相对 | MOV AX, [SI+8] | SI+8 | DS |
| 相对基址变址 | MOV AX, [BX+SI+8] | BX+SI+8 | DS |
| 相对基址变址 | MOV AX, [BP+DI+8] | BP+DI+8 | SS |
规律只有一条:组合里只要出现 BP,默认就走 SS,其余一律走 DS。想跨段就显式加段超越前缀,比如 MOV AX, ES:[BX]。笔记里说后四种寻址方式要重点看默认寄存器,说的就是这个坑——写汇编时忘了 BP 默认指向堆栈段,取到的数据会莫名其妙。
3.2 堆栈类指令对 SP 的影响
PUSH AX ; SP = SP-2,再把 AX 写入 [SP],先减后写 POP BX ; 先读 [SP] 送 BX,再 SP = SP+2,先读后加 XCHG AX, BX ; 两操作数互换,不允许同时是内存 XLAT ; AL = DS:[BX+AL],查表用,BX 是表基址 LEA SI, [BX+DI+8] ; SI = BX+DI+8,只算地址,不访问内存PUSH 和 POP 的次序正好相反,这是子程序里两者成对出现才能保持堆栈平衡的根源。LEA 与 MOV 的区别在于 LEA 不产生数据总线周期,只让 EU 做一次地址加法,所以常被用来做地址运算而不是取数;在 8086 上 LEA 比用 ADD 加偏移更省指令长度。XLAT 是一条零操作数的隐式指令,执行后 AL 里的下标被表项内容覆盖。
3.3 LOOP 与 REP 的执行次序差在哪
; LOOP:先 CX-1,再判断 CX 是否为 0 MOV CX, 100 L1: INC AX LOOP L1 ; 每轮结束 CX 自减,非 0 就跳回 ; REP:先判断 CX,再执行串指令,指令结束后自动 CX-1 MOV CX, 100 REP MOVSB ; DS:[SI] → ES:[DI],之后 SI、DI 自增| 对比项 | LOOP | REP |
|---|---|---|
| 后接对象 | 标号,本质是转移 | 一条串指令前缀 |
| 计数次序 | 先 CX-1 再判条件 | 先判 CX,执行完再 CX-1 |
| 能否重复指令块 | 可以,整段循环体 | 只能跟一条 |
| CX=0 时行为 | 先减成 FFFFH,循环 65535 次 | 一次都不执行 |
这个次序差决定了初始化习惯:用 REP 之前 CX=0 是安全的,程序直接跳过;用 LOOP 时如果 CX 恰好为 0,会先减成 FFFFH 然后循环六万多次,程序当场跑飞。所以写 LOOP 之前先判一次 CX 是否为零,是比背定义更有用的肌肉记忆。
顺带把一般子程序和中断处理程序的区别过一遍:返回指令上一般子程序用 RET,中断处理程序用 IRET;触发来源上一般子程序由 CPU 执行 CALL 引起,中断处理程序由外部中断请求引起;保护内容上一般子程序只压入返回地址,中断处理程序还要保护 FLAGS 寄存器,所以 IRET 比 RET 多弹一次标志。
4. 半导体存储器的三个层次:矩阵译码、DRAM 刷新与 Cache/虚存的账
存储器这一章的分值通常集中在三个问答上:矩阵式的优点、DRAM 为什么要刷新、Cache 和虚拟存储各自解决什么问题。
4.1 矩阵式阵列省的到底是什么
一维译码的做法是用一个 n-2^n 的译码器驱动 2^n 条字线。矩阵式把地址线一分为二,行译码 2^(n/2) 条、列译码 2^(n/2) 条,译码输出总数从 2^n 降到 2×2^(n/2)。n=20 时前者是一百多万条输出,后者只有两千多条,量级差得很明显。笔记给的答案「节省存储单元、节省地址空间」是相对一维译码结构而言的结论,落到电路上真正省下来的是译码驱动电路和版图面积,复试追问时把 2^n 与 2×2^(n/2) 的对比摆出来就够格了。
4.2 DRAM 为什么要不停刷新
DRAM 每个存储位靠一个小电容保存信息:有电荷表示逻辑 1,无电荷表示逻辑 0。电容总有漏电,电荷会随时间流失,所以必须每隔一定时间把阵列按行读出来再写回去,这就是刷新。刷新按行进行,一次补一行,典型的做法有集中刷新、分散刷新和异步刷新三种。集中刷新会在一个时间段内整片不能访存,形成死区;异步刷新把刷新操作均匀摊进每个存取周期,既不长时间封锁访存,也不会漏掉任何一行,所以工程上最常见。
4.3 Cache 与虚拟存储:一个加快、一个变大
def amat(hit_rate, t_cache, t_mem): """平均访存时间:命中走 Cache,缺失回主存取""" return hit_rate * t_cache + (1 - hit_rate) * t_mem print(round(amat(0.90, 5, 60), 2)) # 0.9*5 + 0.1*60 = 10.5 ns print(round(amat(0.95, 5, 60), 2)) # 0.95*5 + 0.05*60 = 7.75 ns命中率从 90% 提到 95%,平均访存时间从 10.5ns 降到 7.75ns,降幅约 26%。t_cache 是 Cache 访问时间,t_mem 是主存访问时间,当两者差一个数量级时,命中率就是唯一值得优化的变量——这也是为什么 Cache 的替换策略和组相连度在硬件课上被反复算。
| 对比项 | Cache | 虚拟存储 |
|---|---|---|
| 解决的问题 | 速度不匹配 | 容量不够 |
| 位置 | CPU 与主存之间 | 主存与外存之间 |
| 交换单位 | 块/行,几十字节 | 页,几 KB |
| 地址转换 | 硬件直接映射或组相联 | 页表加地址转换部件 |
| 失败代价 | 几十纳秒 | 毫秒级,涉及外存读写 |
| 对程序员的可见性 | 完全透明 | 基本透明,页大小可观测 |
两者都押注在局部性原理上,区别是交换单位和缺失代价差了好几个数量级,所以 Cache 的判定必须用硬件在几个时钟周期内完成,虚拟存储则要靠页表加转换缓存兜住。
5. I/O 端口编址、8255A 方式 0 与 8253 计数初值的手算
笔记里写「I/O 端口的定义及分类我们每年都考几乎」,这一章的三个点基本可以按固定套路答:编址方式二选一、8255A 写方式字、8253 算初值并读当前值。
5.1 三类端口信息与两种编址方式
I/O 接口里流转三类信息:数据信息、状态信息、控制信息,对应到端口就是数据端口、状态端口、控制端口。数据端口是 CPU 和设备之间传数据的中转站,状态端口供 CPU 读设备当前状态,控制端口接收 CPU 下发的控制命令。
| 编址方式 | 地址空间 | 访问指令 | 特点 |
|---|---|---|---|
| 存储器映像编址 | 与主存共用同一空间 | MOV 等访存指令 | 指令种类丰富,但要占用主存地址 |
| I/O 单独编址 | 独立空间,8086 用低 16 位 | IN / OUT | 不占主存空间,指令种类少 |
注意:IN 和 OUT 只能用 AL、AX 作数据寄存器,端口地址超过 FFH 时必须先把地址送 DX,否则只能用 8 位直接地址。
5.2 8255A 方式 0 的控制字与初始化
方式 0 是基本输入输出方式,不需要任何联络信号,A 口、B 口、C 口高 4 位和低 4 位可以分别设成输入或输出。控制字位的含义是固定的:
| 位 | D7 | D6 D5 | D4 | D3 | D2 | D1 | D0 |
|---|---|---|---|---|---|---|---|
| 含义 | 标志位恒为 1 | A 组方式 | A 口方向 | C 口高 4 位方向 | B 组方式 | B 口方向 | C 口低 4 位方向 |
方向位写 1 表示输入,写 0 表示输出。
; 8255 基址 0060H:A 口 0060H、B 口 0061H、C 口 0062H、控制口 0063H MOV DX, 0063H MOV AL, 10000000B ; 方式 0;A、B、C 三组全部作输出 OUT DX, AL MOV DX, 0060H MOV AL, 55H OUT DX, AL ; A 口输出 55H10000000B 逐位拆开看:D7=1 是方式字标志,D6D5=00 表示 A 组方式 0,D4=0 表示 A 口输出,D3=0 表示 C 口高 4 位输出,D2=0 是 B 组方式 0,D1=0、D0=0 分别表示 B 口和 C 口低 4 位输出。老师如果让你现场写,一般就考方式 0,写完控制字直接读写端口,不需要额外握手,出错概率最低。
5.3 8253 的计数初值与锁存读
计数初值的算法是:N = 输入时钟频率 × 定时时间。取 CLK=2MHz、需要 1ms 定时,N = 2×10⁶ × 1×10⁻³ = 2000,也就是 07D0H。
; 计数器 0:先读写低字节、后高字节,方式 3 方波,二进制计数 MOV DX, 0043H ; 控制口 MOV AL, 00110110B ; 计数器0、先低后高、方式3、二进制计数 OUT DX, AL MOV DX, 0040H ; 计数器0 数据口 MOV AX, 2000 OUT DX, AL ; 低字节 D0H MOV AL, AH OUT DX, AL ; 高字节 07H ; 读当前计数值:先锁存,再先后读低、高字节 MOV DX, 0043H MOV AL, 00000000B ; D5D4=00,锁存计数器 0 当前值 OUT DX, AL MOV DX, 0040H IN AL, DX MOV BL, AL ; 低字节 IN AL, DX MOV BH, AL ; 高字节,BX 即锁存到的 16 位计数值控制字 00110110B 里,D7D6=00 选中计数器 0,D5D4=11 表示先低后高,D3D2D1=011 是方式 3 方波输出,D0=0 表示按二进制计数(写 1 则按 BCD 计数)。读当前值必须先锁存,原因在于计数器没有停止计数,如果直接读低字节再读高字节,两条 IN 指令之间计数值可能已经翻过一轮,拼出来的 16 位数就是错的。锁存之后输出锁存器的值不再随计数器变化,等两个字节都读完自动恢复跟随。
5.4 DMA 与中断:谁在搬数据
DMA 的思路是让外设和主存直接对话,CPU 只在一头一尾介入:DMA 控制器向 CPU 发 HOLD 请求,CPU 响应 HLDA 让出总线,随后 DMA 控制器输出地址和读写信号,DACK 高电平有效表示系统进入 DMA 模式,一批数据搬完再释放总线并申请中断通知 CPU。中断方式是每传一个字节都要进一次中断服务程序搬运,DMA 只在块级别打断 CPU,所以磁盘、网卡这类高速设备走 DMA,键盘、串口这类低速设备用中断就够。
6. 中断矢量表与 8259A 级联初始化:现场手写最稳的几条路径
6.1 矢量表定位:类型号乘 4
8086 能处理 256 种中断类型,每种类型对应一个 4 字节的中断矢量,低两字节是服务程序入口偏移 IP,高两字节是段基址 CS,所有矢量按类型号从小到大排放在内存最低的 1KB 里。CPU 响应中断后把类型号 n 乘 4 得到表内偏移,从 4n 处取 IP、4n+2 处取 CS 填进寄存器,随后跳转执行。
6.2 8259A 的 ICW 顺序不能颠倒
; 主片端口 20H/21H,从片挂在 IR2 上,从片端口 A0H/A1H MOV AL, 00010001B ; ICW1:边沿触发、级联、需要 ICW4 OUT 20H, AL MOV AL, 00001000B ; ICW2:主片中断类型基址为 08H OUT 21H, AL MOV AL, 00000100B ; ICW3:从片接在主片 IR2 上 OUT 21H, AL MOV AL, 00000001B ; ICW4:8086 模式、非自动 EOI、非缓冲 OUT 21H, ALICW1 的 D4 是特征位,必须为 1;D1 决定后面还要不要写 ICW3,D0 决定要不要写 ICW4。写初始化程序最容易错的地方是顺序:ICW1 必须写入偶地址端口,ICW2、ICW3、ICW4 依次写入奇地址端口,顺序颠倒后芯片会吞掉控制字,后续所有中断类型号都是错的。级联场景下主片和从片要各自跑一遍完整初始化,从片的 ICW3 填的是自己挂在哪一根 IR 上的编码,主片的 ICW3 则是位图,哪一位为 1 表示对应 IR 上接了从片。
6.3 异步串行通信帧格式与采样点
| 字段 | 位数 | 说明 |
|---|---|---|
| 起始位 | 1 | 与空闲态极性相反,用于帧同步 |
| 数据位 | 5~8 | 低位在前 |
| 校验位 | 0 或 1 | 奇校验/偶校验可选 |
| 停止位 | 1、1.5 或 2 | 与起始位极性相反 |
三条常被追问的设计理由:起始位和停止位采用相反极性,空闲态和帧起始能被电平直接区分;接收端在每位数码的中心采样,避开跳变沿附近的不确定区;接收时钟频率取波特率的 16 倍,用更高的分辨率细分采样点,抗干扰能力比 1 倍时钟强得多。
现场手写 8259A 初始化时最稳的做法是先默写控制字位表,再照着填:ICW1 的 D4 固定为 1、D0 决定要不要写 ICW4、D1 决定要不要写 ICW3,剩下三个字节的位序按手册顺序摆,基本不会翻车。
本文还有配套的精品资源,点击获取