news 2026/2/3 1:46:22

汇编:外设连接与中断

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编:外设连接与中断

一、外设连接基础(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. 外部中断处理流程

  1. 外设向 CPU 发送INTR(可屏蔽中断)或NMI(不可屏蔽中断)信号;
  2. CPU 响应INTR需满足:IF=1(开中断)、当前指令执行完毕;
  3. CPU 读取中断类型号 n;
  4. 保护现场:压栈 FLAGS、CS、IP;
  5. 关中断(IF=0),防止嵌套;
  6. 从 IVT 读取中断服务程序(ISR)的段地址和偏移(IP)=(N*4),CS=(n*4+2),跳转到 ISR;
  7. ISR 执行:处理外设请求、恢复现场;
  8. 开中断(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 号中断的服务程序入口,执行键盘中断处理逻辑,步骤如下:

  1. 中断响应条件:CPU 的中断标志位IF=1(开中断),否则忽略中断请求。
  2. 保存现场:CPU 自动保存当前CSIPFLAGS寄存器值到栈中,保护程序执行上下文。
  3. 读取扫描码:中断服务程序从60H端口读取扫描码,区分通码 / 断码。
  4. 键盘应答:向61H端口写入控制信号,告知键盘已接收扫描码(先置最高位为 1,再复位为 0)。
  5. 扫描码转 ASCII 码:通过 BIOS 内置的扫描码 - ASCII 码映射表(如scantab),将字符键的扫描码转换为 ASCII 码;功能键(如 Shift、Ctrl)则更新键盘状态字(存储在40:17H内存单元)。

三、BIOS 键盘缓冲区的管理

8086 将处理后的键盘数据存入BIOS 键盘缓冲区(位于40:1EH,共 15 个输入项,每项 2 字节):

  • 高位字节存储扫描码,低位字节存储 ASCII 码。
  • 缓冲区采用循环队列结构,通过bufpt1(读指针)和bufpt2(写指针)管理读写,满时丢弃新输入,空时等待按键。

四、应用程序读取键盘输入

程序通过BIOS 16H 中断DOS 21H 中断从缓冲区读取输入,常见方式:

  1. BIOS 16H 中断(00H 号功能):阻塞等待按键,返回时AL=ASCII码AH=扫描码

    asm

  • mov ah, 00H int 16H ; AL=字符,AH=扫描码
  • DOS 21H 中断(07H/08H 号功能):读取字符但不回显,08H 还会检测 Ctrl+C。
  • 直接访问缓冲区:通过操作40:1EH的缓冲区指针,直接读取未处理的键盘数据。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!