You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

补充说明

  1. 中断控制:执行检测前必须执行CLI禁用中断,避免检测过程中系统中断干扰寄存器读写;检测完成后执行STI恢复中断(若之前为开启状态)。
  2. 适配逻辑:
    • 检测到从PIC存在时:将ISA卡的中断处理程序挂接到IRQ9,无需额外转发IRQ2(系统级的IRQ2转发由BIOS/OS处理)。
    • 未检测到从PIC时:直接将中断处理程序绑定到IRQ2即可。

内容的提问来源于stack exchange,提问作者Borg Drone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 12:12:09