8086中断向量表 256个入口配置:从DOS功能调用到自定义中断的2种编程方法
8086中断向量表深度解析从DOS功能调用到自定义中断的实战指南1. 中断向量表架构与内存布局中断向量表是8086系统中至关重要的数据结构它位于内存最低端的1KB空间00000H-003FFH以四字节为一组的形式存储256个中断服务程序入口地址。每个中断类型号对应一个中断向量包含低地址字中断服务程序的偏移地址IP值高地址字中断服务程序的段基址CS值; 中断向量表内存布局示例类型号N 0000:N*4 - ISR_OFFSET_LOW 0000:N*42 - ISR_OFFSET_HIGH 0000:N*44 - ISR_SEGMENT_LOW 0000:N*46 - ISR_SEGMENT_HIGH关键特性对比表特性系统保留中断(0-31)用户自定义中断(32-255)中断类型号分配Intel预定义开发者自由选择典型用途系统异常/BIOS调用设备驱动/应用程序扩展修改风险可能导致系统崩溃相对安全是否需要恢复原始向量必须可选重要提示修改中断向量前务必保存原向量值特别是系统中断。不当修改可能导致系统不稳定。2. DOS功能调用法配置中断向量DOS通过INT 21H的25H功能提供了标准化的中断向量设置接口相比直接内存写入具有更好的兼容性。完整流程包括2.1 设置中断向量; 输入参数 ; AL 中断类型号 ; DS:DX 中断服务程序入口地址 MOV AH, 25H ; 功能号 MOV AL, 60H ; 示例设置类型号60H MOV DX, SEG ISR ; 获取ISR段地址 MOV DS, DX MOV DX, OFFSET ISR ; 获取ISR偏移地址 INT 21H2.2 获取中断向量备份原向量; 输入参数 ; AL 中断类型号 ; 返回 ; ES:BX 原中断向量 MOV AH, 35H ; 功能号 MOV AL, 60H ; 查询类型号60H INT 21H ; 此时ES:BX保存原向量可压栈保存 PUSH ES PUSH BX2.3 实战案例键盘中断增强以下代码演示如何扩展原键盘中断INT 09H实现按键记录; 数据段 OLD_INT9 DD ? ; 保存原中断向量 BUFFER DB 100 DUP(0) ; 按键缓冲区 INDEX DW 0 ; 缓冲区索引 ; 代码段 SETUP_INT: MOV AH, 35H ; 获取原INT9向量 MOV AL, 09H INT 21H MOV WORD PTR OLD_INT9, BX ; 保存偏移 MOV WORD PTR OLD_INT92, ES ; 保存段址 MOV AH, 25H ; 设置新向量 MOV AL, 09H MOV DX, SEG NEW_INT9 MOV DS, DX MOV DX, OFFSET NEW_INT9 INT 21H RET NEW_INT9 PROC FAR ; 新中断服务程序 PUSH AX PUSH BX PUSH DS MOV AX, DATA MOV DS, AX IN AL, 60H ; 读取键盘扫描码 MOV BX, INDEX MOV [BUFFERBX], AL INC INDEX CMP INDEX, 100 JB EXIT_INT CALL PROCESS_BUFFER ; 缓冲区满时处理 EXIT_INT: POP DS POP BX POP AX JMP CS:OLD_INT9 ; 跳转到原处理程序 NEW_INT9 ENDP3. 直接内存写入法配置中断向量对于需要极致性能或脱离DOS环境的场景可直接操作内存中的中断向量表。这种方法需要特别注意在实模式下操作关闭中断期间进行写操作确保地址计算准确标准操作流程CLI ; 关中断 MOV AX, 0 ; 中断向量表段地址 MOV ES, AX MOV DI, N*4 ; 类型号N的向量位置 MOV AX, OFFSET ISR MOV ES:[DI], AX ; 写入偏移地址 MOV AX, SEG ISR MOV ES:[DI2], AX ; 写入段地址 STI ; 开中断内存写入 vs DOS功能调用对比特性直接内存写入DOS功能调用执行速度更快无软件中断开销较慢需INT 21H调用系统兼容性依赖硬件平台标准DOS环境通用安全性风险较高相对安全是否需要关中断必须不需要适用场景裸机编程/引导程序标准DOS应用程序4. 自定义中断实战硬件定时器中断以下完整示例展示如何利用8253/8254定时器芯片创建精确时钟中断4.1 硬件初始化; 初始化8253定时器0 ; 模式3方波发生器计数器值11932100Hz MOV AL, 00110110B ; 控制字通道0读写双字节模式3 OUT 43H, AL ; 写入控制寄存器 MOV AX, 11932 ; 计数器初值 OUT 40H, AL ; 写入低字节 MOV AL, AH OUT 40H, AL ; 写入高字节4.2 中断服务程序TIMER_ISR PROC FAR PUSH AX PUSH DS MOV AX, DATA MOV DS, AX INC [TICK_COUNT] ; 全局计时变量 ; 发送EOI命令到8259A MOV AL, 20H OUT 20H, AL POP DS POP AX IRET TIMER_ISR ENDP4.3 中断向量设置; 使用类型号08H系统保留的IRQ0 CLI MOV AX, 0 MOV ES, AX MOV DI, 8*4 MOV AX, OFFSET TIMER_ISR MOV ES:[DI], AX MOV AX, SEG TIMER_ISR MOV ES:[DI2], AX STI关键注意事项定时器中断属于硬件中断需要发送EOI中断服务程序应尽可能简短共享变量如TICK_COUNT需考虑原子操作在程序退出前恢复原中断向量5. 高级技巧与疑难解答5.1 中断共享技术当多个设备需要共用同一中断线时可采用链式处理SHARED_ISR PROC FAR PUSH AX PUSH DX ; 检查设备1中断 MOV DX, 300H IN AL, DX TEST AL, 80H JZ CHECK_DEV2 CALL DEV1_HANDLER CHECK_DEV2: MOV DX, 310H IN AL, DX TEST AL, 40H JZ ISR_EXIT CALL DEV2_HANDLER ISR_EXIT: MOV AL, 20H OUT 20H, AL ; 发送EOI POP DX POP AX IRET SHARED_ISR ENDP5.2 常见问题排查中断不触发检查清单确认中断控制器8259A正确初始化检查中断屏蔽寄存器IMR设置验证中断服务程序地址是否正确写入向量表确保CPU中断标志位已开启STI硬件中断需要发送EOI调试技巧在ISR开始处设置断点使用端口监视工具检查硬件信号添加调试输出到串口或视频内存逐步验证中断触发条件6. 性能优化与最佳实践中断嵌套控制关键代码段使用CLI/STI保护避免在中断中调用可能阻塞的函数快速中断处理FAST_ISR PROC FAR PUSH AX ; 仅保存必要寄存器 ; 最小化处理逻辑 MOV AL, [PORT_ADDR] MOV [BUFFER], AL MOV AL, 20H OUT 20H, AL ; 快速EOI POP AX IRET FAST_ISR ENDP中断与主程序通信使用环形缓冲区减少冲突关键数据采用原子操作通过标志变量实现安全状态检查对于需要处理大量数据的场景建议采用双缓冲技术中断服务程序填充一个缓冲区而主程序处理另一个缓冲区通过指针交换实现高效数据传输。
