i8259A的初始化编程
--- 命令 ---
PICsInitializationString dw PIC1_PORT0 //主片 control port,,, +1 为data port
db ICW1_ICW + ICW1_EDGE_TRIG + ICW1_INTERVAL8 + ICW1_CASCADE + ICW1_ICW4_NEEDED // icw1 0001 1001
db PIC1_BASE // icw2
db 1 SHL PIC_SLAVE_IRQ // icw3 1 << 2 == 0000 0100
db ICW4_NOT_SPEC_FULLY_NESTED + ICW4_NON_BUF_MODE + ICW4_NORM_EOI + ICW4_8086_MODE // icw4 0000 0001
dw PIC2_PORT0 // 从片
db ICW1_ICW + ICW1_EDGE_TRIG + ICW1_INTERVAL8 + ICW1_CASCADE + ICW1_ICW4_NEEDED
db PIC2_BASE
db PIC_SLAVE_IRQ
db ICW4_NOT_SPEC_FULLY_NESTED + ICW4_NON_BUF_MODE + ICW4_NORM_EOI + ICW4_8086_MODE
dw 0 ; end of string
// 主片 从片
// icw1 = 0001 1001 icw1 = 0001 1001
// icw2 = 0x30 icw2 = 0x38
// icw3 = 0000 0100 icw3 = 2 // 主片的哪一位为1,从片为对应的数值,如主片第7位[1000 0000],那从片的值为 0000 0111
// icw4 = 0000 0001 icw4 = 0000 0001
--- 函数 ---
cPublicProc _HalpInitializePICs ,1
cPublicFpo 0, 0
push esi ; save caller‘s esi
pushfd
cli ; disable interrupt
lea esi, PICsInitializationString
lodsw ; (AX) = PIC port 0 address
Hip10: movzx edx, ax // 一个循环把 icw1输入到control_port , icw2,3,4 输入到data_port
outsb ; output ICW1
IODelay
inc edx ; (DX) = PIC port 1 address /// +1 变为对应的 data_port
outsb ; output ICW2
IODelay
outsb ; output ICW3
IODelay
outsb ; output ICW4
IODelay
mov al, 0FFH ; mask all 8259 irqs
out dx,al ; write mask to PIC
lodsw // 从片 control port
cmp ax, 0 ; end of init string?
jne short Hip10 ; go init next PIC
...
每一位的含义,http://blog.sina.com.cn/s/blog_70dd169101019wzw.html 说的很清楚
参照 https://www.cnblogs.com/xuanyuan/p/5506508.html
原文:https://www.cnblogs.com/asmalleyu/p/13932741.html