当前位置: 代码迷 >> 汇编语言 >> 8259A设置有关问题
  详细解决方案

8259A设置有关问题

热度:7072   发布时间:2013-02-26 00:00:00.0
8259A设置问题
本帖最后由 pang68599 于 2012-11-08 14:34:39 编辑


ORG 7c00h
START:


       ;把我自己的键盘处理程序写入中断向量表
mov AX , KEYBOARD 
MOV [ES:0024H], AX
MOV AX , CS
MOV [ES:0026H] , AX


;master

MOV AL , 0x11 ;ICW1 必须设置成0x11 ,设置成0x13不级联会报错
OUT 0x20 , AL

MOV AL , 0x08 ;ICW2
OUT 0x21 , AL

MOV AL , 0x04 ;ICW3
OUT 0x21 , AL

MOV AL , 0x01 ;ICW4
OUT 0x21 , AL

MOV AL , 0xFD ;OCW1 打开键盘中断IMR
OUT 0x21 , AL


JMP $
;设置的中断
KEYBOARD:
sti
MOV AX , 0B800H
MOV DS , AX
MOV DI , 2
MOV AX , 97
MOV [DS:DI] , AX
MOV AX , 34H
INC DI
MOV [DS:DI] , AX

MOV AL , 20H
OUT 20H , AL
iret
times 510 - ($ - START) DB 0
DW 0AA55H



在实模式下面,修改8259A为什么不能响应中断,ICW1 必须设置成0x11 ,设置成0x13不级联会报错,不会响应中断。
------解决方案--------------------------------------------------------

ORG 7c00h
START:
mov ax , 0000h
mov ss , ax
mov sp , 0400h
MOV AX , 0B800H
MOV GS , AX
MOV DI , 0
MOV AX , 97
MOV [GS:DI] , AX
MOV AX , 34H
INC DI
MOV [GS:DI] , AX
mov ax , 0000h
mov es , ax
mov AX , CLOCK 
MOV [ES:0080H], AX
MOV AX , CS
MOV [ES:0082H] , AX
mov AX , KEYBOARD 
MOV [ES:0084H], AX
MOV AX , CS
MOV [ES:0086H] , AX
MOV AL , 0x15;ICW1 , master
OUT 0x20 , AL
CALL DELAY
OUT 0xA0 , AL;ICW1 , slave
CALL DELAY
MOV AL , 0x20;ICW2 , master
OUT 0x21 , AL
CALL DELAY
MOV AL , 0x28;ICW2 , slave
OUT 0xA1 , AL
CALL DELAY
MOV AL , 0x04;ICW3 , master
OUT 0x21 , AL
CALL DELAY
MOV AL , 0x03;ICW3 , slave
OUT 0xA1 , AL
CALL DELAY
MOV AL , 0x01;ICW4 MASTER
OUT 0x21 , AL
CALL DELAY
OUT 0xA1 , AL;ICW4 SLAVE
CALL DELAY
MOV AL , 0xFD;OCW1
OUT 0x21 , AL
CALL DELAY
MOV AL , 0xFF
OUT 0xA1 , AL
CALL DELAY
MOV AL , 20h;OCW2
OUT 0x20 , AL
CALL DELAY
OUT 0xA0 , AL
CALL DELAY
MOV DI , 4
MOV AX , 98
MOV [GS:DI] , AX
MOV AX , 35H
INC DI
MOV [GS:DI] , AX
int 0x20
int 0x21
JMP $
DELAY:
nop
nop
nop
nop
ret
CLOCK:
push ax
inc byte [gs:0006h]
mov al , 20h
out 20h , al
pop ax
iret
KEYBOARD: