8259A PIC编程异常:写入0x11到端口0x20后值不符
问题分析与解决
核心原因
你写入的0x11是PIC的初始化命令字ICW1,PIC收到这个命令后会立刻进入初始化流程,不会将该值保留在命令寄存器中。通过QEMU的i/i 0x20读取的并非你写入的ICW1,而是主PIC的中断请求寄存器(IRR)——默认情况下IR0(定时器中断)是开启的,所以返回0x1是正常状态。
正确的PIC初始化汇编流程
单独发送ICW1是不完整的,必须完成整个PIC初始化序列(主、从PIC都要配置)。以下是x86环境下的完整汇编代码:
; 发送ICW1:触发初始化,边缘触发,级联模式 mov al, 0x11 out 0x20, al ; 主PIC命令端口 out 0xA0, al ; 从PIC命令端口 ; 发送ICW2:设置中断向量偏移(主PIC从0x20开始,从PIC从0x28开始) mov al, 0x20 out 0x21, al ; 主PIC数据端口 mov al, 0x28 out 0xA1, al ; 从PIC数据端口 ; 发送ICW3:级联配置(主PIC的IR2连接从PIC) mov al, 0x04 out 0x21, al ; 主PIC:IR2对应从PIC mov al, 0x02 out 0xA1, al ; 从PIC:对应主PIC的IR2 ; 发送ICW4:设置8086模式,自动EOI mov al, 0x01 out 0x21, al out 0xA1, al ; 可选:屏蔽所有中断(按需调整掩码) mov al, 0xFF out 0x21, al out 0xA1, al
验证初始化是否成功
不要通过读命令端口验证ICW1,而是通过以下方式确认:
- 读取主PIC的数据端口
0x21,查看中断掩码是否符合你设置的值(比如上述代码最后设置0xFF,读取应返回0xFF) - 测试键盘中断:取消键盘中断的掩码(主PIC的IR1,即执行
out 0x21, 0xFD),编写对应中断处理程序,检查是否能响应键盘输入
内容的提问来源于stack exchange,提问作者Max Herrmann
相关产品推荐
相关产品推荐

