如何用x86汇编检测老式PC中的从属PIC以适配ISA卡驱动
检测从属8259A PIC是否存在的x86汇编实现
核心原理
PC兼容机中,主PIC(端口0x20/0x21)和从PIC(端口0xA0/0xA1)通过主PIC的IRQ2引脚级联。如果从PIC存在,对其端口的读写操作会有可预期的响应;若不存在,读写0xA1端口会返回不确定的随机值,且写入的值无法被保留。
汇编实现代码(实模式)
; 功能:检测从属8259A PIC是否存在 ; 返回:CF=0 表示存在,CF=1 表示不存在 ; 注意:执行前需确保中断已禁用(CLI),执行后恢复原中断状态 DetectSlavePIC: push ax push cx ; 保存当前主、从PIC的中断屏蔽寄存器(IMR)值 in al, 0x21 mov cl, al ; 主PIC IMR 暂存到CL in al, 0xA1 mov ch, al ; 从PIC IMR 暂存到CH ; 测试从PIC的读写有效性:先写入0x55,读取验证 mov al, 0x55 out 0xA1, al in al, 0xA1 cmp al, 0x55 jne .NoSlavePIC ; 再写入0xAA,读取验证(排除偶然匹配的可能) mov al, 0xAA out 0xA1, al in al, 0xA1 cmp al, 0xAA jne .NoSlavePIC ; 验证通过,从PIC存在 clc ; CF=0 jmp .RestoreIMR .NoSlavePIC: stc ; CF=1 .RestoreIMR: ; 恢复原主、从PIC的IMR值 mov al, ch out 0xA1, al mov al, cl out 0x21, al pop cx pop ax ret
补充说明
- 中断控制:执行检测前必须执行
CLI禁用中断,避免检测过程中系统中断干扰寄存器读写;检测完成后执行STI恢复中断(若之前为开启状态)。 - 适配逻辑:
- 检测到从PIC存在时:将ISA卡的中断处理程序挂接到IRQ9,无需额外转发IRQ2(系统级的IRQ2转发由BIOS/OS处理)。
- 未检测到从PIC时:直接将中断处理程序绑定到IRQ2即可。
内容的提问来源于stack exchange,提问作者Borg Drone
相关产品推荐
相关产品推荐

