一、外设连接基础(8086 体系)
1. 外设与 CPU 的连接方式
CPU 通过地址总线、数据总线、控制总线与外设交互,核心方式有两种:
- 端口映射(I/O 映射):外设占用独立的 I/O 地址空间(8086 为 0000H~FFFFH),通过
IN/OUT指令访问; - 内存映射:外设寄存器映射到内存地址,通过内存访问指令(
MOV)操作。
8086 中主流采用端口映射,例如:
- 输入指令:
IN AL, 端口号(8 位端口)、IN AX, 端口号(16 位端口); - 输出指令:
OUT 端口号, AL(8 位)、OUT 端口号, AX(16 位)。
2. 外设的编址方式
| 编址方式 | 特点 | 指令 |
|---|---|---|
| 独立编址(I/O 映射) | 地址空间与内存分离,专用指令 | IN/OUT |
| 统一编址(内存映射) | 外设 = 内存单元,通用内存指令 | MOV |
二、中断机制核心
中断是外设主动向 CPU 发起的 “请求”,让 CPU 暂停当前程序,优先处理外设任务(如键盘输入、串口数据接收)。
1. 中断分类(8086)
| 类型 | 触发方式 | 例子 |
|---|---|---|
| 内部中断(软中断) | 指令触发(如 INT n)或 CPU 异常 | 除法错误(0 号)、INT 21H(DOS 功能调用) |
| 外部中断(硬中断) | 外设硬件信号触发 | 键盘中断(IRQ1)、定时器中断(IRQ0) |
2. 中断向量表(IVT)
8086 在内存 00000H~003FFH(共 1KB)建立中断向量表,每个中断占 4 字节(2 字节偏移 + 2 字节段地址),对应中断号 0~255。
中断号 n 的向量地址:n × 4(偏移)、n × 4 + 2(段地址)。
3. 外部中断处理流程
- 外设向 CPU 发送
INTR(可屏蔽中断)或NMI(不可屏蔽中断)信号; - CPU 响应
INTR需满足:IF=1(开中断)、当前指令执行完毕; - CPU 读取中断类型号 n;
- 保护现场:压栈 FLAGS、CS、IP;
- 关中断(IF=0),防止嵌套;
- 从 IVT 读取中断服务程序(ISR)的段地址和偏移(IP)=(N*4),CS=(n*4+2),跳转到 ISR;
- ISR 执行:处理外设请求、恢复现场;
- 开中断(STI),执行
IRET(恢复 FLAGS、CS、IP),返回原程序。
8086CPU,PC机键盘的处理过程
8086CPU 对 PC 机键盘的处理是一个从硬件触发到软件解析的分层过程,核心依赖扫描码生成、9 号硬件中断响应、BIOS 中断处理和缓冲区管理四大环节,最终将键盘输入转化为程序可识别的 ASCII 码或控制信号。
一、扫描码的生成与传输
键盘内部的扫描芯片会实时检测按键的按下 / 松开状态,生成扫描码(1 字节)并通过 I/O 端口60H传输给 8086CPU。
- 通码:按键按下时生成,最高位为 0(如按下
A键的通码是1EH)。 - 断码:按键松开时生成,最高位为 1(如松开
A键的断码是9EH,由通码1EH | 0x80得到)。 - 扫描码通过键盘控制器写入 8086 的
60H端口后,键盘会向 CPU 发送9 号可屏蔽中断请求,触发后续处理。
二、9 号硬件中断的响应与处理
8086CPU 通过中断向量表找到 9 号中断的服务程序入口,执行键盘中断处理逻辑,步骤如下:
- 中断响应条件:CPU 的中断标志位
IF=1(开中断),否则忽略中断请求。 - 保存现场:CPU 自动保存当前
CS、IP、FLAGS寄存器值到栈中,保护程序执行上下文。 - 读取扫描码:中断服务程序从
60H端口读取扫描码,区分通码 / 断码。 - 键盘应答:向
61H端口写入控制信号,告知键盘已接收扫描码(先置最高位为 1,再复位为 0)。 - 扫描码转 ASCII 码:通过 BIOS 内置的扫描码 - ASCII 码映射表(如
scantab),将字符键的扫描码转换为 ASCII 码;功能键(如 Shift、Ctrl)则更新键盘状态字(存储在40:17H内存单元)。
三、BIOS 键盘缓冲区的管理
8086 将处理后的键盘数据存入BIOS 键盘缓冲区(位于40:1EH,共 15 个输入项,每项 2 字节):
- 高位字节存储扫描码,低位字节存储 ASCII 码。
- 缓冲区采用循环队列结构,通过
bufpt1(读指针)和bufpt2(写指针)管理读写,满时丢弃新输入,空时等待按键。
四、应用程序读取键盘输入
程序通过BIOS 16H 中断或DOS 21H 中断从缓冲区读取输入,常见方式:
- BIOS 16H 中断(00H 号功能):阻塞等待按键,返回时
AL=ASCII码,AH=扫描码。asm
mov ah, 00H int 16H ; AL=字符,AH=扫描码- DOS 21H 中断(07H/08H 号功能):读取字符但不回显,08H 还会检测 Ctrl+C。
- 直接访问缓冲区:通过操作
40:1EH的缓冲区指针,直接读取未处理的键盘数据。