.
源程序代码:
;***************************************************************** ; 8259中断查询方式应用实验
;请根据所学原理推断横线处需填写的源代码
;***************************************************************** I8259_1 EQU 2B0H ; 8259的ICW1端口地址 I8259_2 EQU 2B1H ; 8259的ICW2端口地址
I8259_3 EQU 2B1H ; 8259的ICW3端口地址 (奇地址) I8259_4 EQU 2B1H ; 8259的ICW4端口地址 (奇地址) O8259_1 EQU 2B1H ; 8259的OCW1端口地址 (奇地址) O8259_2 EQU 2B0H ; 8259的OCW2端口地址 (偶地址) O8259_3 EQU 2B0H ; 8259的OCW3端口地址 (偶地址)
DATA SEGMENT
MES1 DB 'YOU CAN PLAY A KEY ON THE KEYBOARD!',0DH, 0AH, 24H ;24H='$'
MES2 DD MES1
MESS1 DB 'HELLO! THIS IS INTERRUPT * 0 *!',0DH,0AH,'$' MESS2 DB 'HELLO! THIS IS INTERRUPT * 1 *!',0DH,0AH,'$' MESS3 DB 'HELLO! THIS IS INTERRUPT * 2 *!',0DH,0AH,'$' MESS4 DB 'HELLO! THIS IS INTERRUPT * 3 *!',0DH,0AH,'$' MESS5 DB 'HELLO! THIS IS INTERRUPT * 4 *!',0DH,0AH,'$' MESS6 DB 'HELLO! THIS IS INTERRUPT * 5 *!',0DH,0AH,'$' MESS7 DB 'HELLO! THIS IS INTERRUPT * 6 *!',0DH,0AH,'$' MESS8 DB 'HELLO! THIS IS INTERRUPT * 7 *!',0DH,0AH,'$' DATA ENDS
STACKS SEGMENT
DB 100 DUP(?)
.
.
STACKS ENDS
STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:STACKS, ES:DATA .386
START: MOV MOV MOV MOV MOV
MOV MOV OUT MOV MOV OUT MOV OUT
MOV MOV OUT
QUERY: MOV INT JNZ
MOV MOV OUT IN .
AX,DATA DS, AX
ES, AX ;DS,ES段基址都设为DATA AX, STACKS
SS, AX ;SS段基址都设为STACKS DX, I8259_1 ;初始化8259的ICW1
AL, 13H ; 0001:ICW1 0011:边沿触发、单片8259、需要ICW4
;0001 0011 (IR7-3=000:无意义;IR4=1:ICW1标识位;IR3=0:边沿;IR2=0:无意义;IR1=1:单片8259;IR0=1:需要ICW4)
DX,AL
DX,I8259_2 ;初始化8259的ICW2 AL,0B0H ;1011 0000 DX,AL
AL,03H ;ICW4 0000 0011 DX,AL DX, O8259_1 ;初始化8259的中断屏蔽操作命令字 AL, 00H ;打开屏蔽位 DX,AL
;写OCW1,打开屏蔽位
AH,1 ;判断是否有按键按下 16H
QUIT ;有按键则退出 DX,O8259_3 ;向8259发送查询命令 AL, 0CH ;0000 1100 DX,AL
;先向8259发送一个OCW3,其中查询位P为1,则下一条指令中可以从同样的地址中取得一个查询字,得到的查询字中最高位(D7)为1代表有中断请求,第三位为请求的来源。
AL,DX ;读出查询字
.
TEST AL,80H ;判断中断是否已响应
;若最高位为1,则有中断请求
JZ QUERY ;没有响应则继续查询
AND AL,07H
CMP AL,00H
JE IR0ISR ;若为IR0请求,跳到IR0处理程序 CMP AL,01H
JE IR1ISR ;若为IR1请求,跳到IR1处理程序 CMP JE CMP JE CMP JE CMP JE CMP JE CMP JE
JMP
IR0ISR: MOV MOV MOV MOV INT JMP IR1ISR: MOV MOV MOV MOV INT JMP IR2ISR: MOV MOV MOV MOV INT JMP IR3ISR: MOV MOV .
AL,02H
IR2ISR ;若为IR2请求,跳到IR2处理程序 AL,03H
IR3ISR ;若为IR3请求,跳到IR3处理程序 AL,04H
IR4ISR ;若为IR4请求,跳到IR4处理程序 AL,05H
IR5ISR ;若为IR5请求,跳到IR5处理程序 AL,06H
IR6ISR ;若为IR6请求,跳到IR6处理程序 AL,07H
IR7ISR ;若为IR7请求,跳到IR7处理程序 QUERY
AX,DATA DS,AX
DX,OFFSET MESS1 ;显示提示信息 AH,09 21H EOI
AX,DATA DS,AX
DX,OFFSET MESS2 ;显示提示信息 AH,09 21H EOI
AX,DATA DS,AX
DX,OFFSET MESS3 ;显示提示信息 AH,09 21H EOI
AX,DATA DS,AX
.
MOV DX,OFFSET MESS4 ;显示提示信息 MOV AH,09 INT 21H JMP EOI
IR4ISR: MOV AX,DATA MOV DS,AX
MOV DX,OFFSET MESS5 ;显示提示信息 MOV AH,09 INT 21H JMP IR5ISR: MOV MOV MOV MOV INT JMP IR6ISR: MOV MOV MOV MOV INT JMP IR7ISR: MOV MOV MOV MOV INT EOI:
MOV MOV OUT JMP
QUIT: MOV INT
CODE ENDS
END
.
EOI
AX,DATA DS,AX
DX,OFFSET MESS6 ;显示提示信息 AH,09 21H EOI
AX,DATA DS,AX
DX,OFFSET MESS7 ;显示提示信息 AH,09 21H EOI
AX,DATA DS,AX
DX,OFFSET MESS8 ;显示提示信息 AH,09 21H DX,O8259_2 ;向8259发送中断结束命令
;向8259发OCW2,D5位为EOI中断结束命令位,20H表示清除当前中断服务寄存器的ISn位,在非自动结束中断方式中使用。
AL,20H DX,AL QUERY AX,4C00H ;结束程序退出 21H START
相关推荐: