CODE SEGMENT
ASSUME CS:CODE
START:CLI ;关中断
MOV DS,AX ;给data段地址
MOV DX,200H ;ICW1是0端口
MOV AL,11H ;控制字11H 边沿触发00010001
OUT DX,AL ;设置ICW1
MOV DX,201H ;写ICW2,ICW2是1端口 中断向量
MOV AL,0DH ;设置主8259的中断类型号
OUT DX,AL ;设置ICW2
MOV AL,05H ;ICW3,IR5
OUT DX,AL
MOV AL,01H ;写ICW4 EOI结束中断
OUT DX,AL
;设置控制字223H
MOV DX,223H
MOV AL,0A0H
OUT DX,AL
MOV AL,0DH
OUT DX,AL
MOV DX,201H
IN AL,DX ;读IMR
AND AL,0DFH ;开放IR5中断 DFH(1101 1111B)
OUT DX,AL
MOV AX,0
MOV DS,AX ;中断向量码写入内存0段区域
LEA AX,INT_PROC ;转到中断命令 写中断向量
;写中断向量地址
MOV BX,5 ;IR5
MOV SI,08H ;BASE=08H
ADD SI,BX
;地址乘4 找段地址
ADD SI,SI
ADD SI,SI
MOV [SI],AX ;IP地址 置入中断服务程序入口地址的偏移量IP
MOV AX,CS
MOV [SI+2],AX ;CS设置中断向量地址,置入中断服务程序入口地址的段基地址CS
MOV BL,1
STI ;开中断
L: JMP L ;自身循环,主程序
INT_PROC:
;灯亮
MOV AL,BL ;中断处理程序
MOV DX,220H
OUT DX,AL ;A口输出
SHL BL,1 ;左移一位
MOV DX,200H
MOV AL,20H ;向8259发出EOI结束中断
OUT DX,AL
MOV DX,201H ;读IMR
JNC NEXT ;高位不为0时转移到NEXT
;中断结束
IN AL,DX
OR AL,20H ;屏蔽位 关闭IR5
OUT DX,AL
STI ;开中断 允许中断嵌套
MOV AH,4CH
INT 21H ;返回DOS
NEXT:
IRET ;中断返回
CODE ENDS
END START
电路图如下
备注:
利用SHL语句 将结果左移一位,判断最高位是否为1再进行是否循环的语句,完成逻辑开关的设计。