(一) 操作练习
设置8259A的IR0为60H中断,利用按键触发中断,使基本I/O驱动LED灯亮、灭。
CODE SEGMENT 'CODE'
ASSUME CS:CODE,DS:CODE
START: MOV AX,0
MOV DS,AX
MOV SI,60H*4
MOV AX,OFFSET INT0
MOV [SI],AX
MOV AX,SEG INT0
MOV [SI+2],AX
CLI
MOV AL, 13H ;设置ICW1,边沿触发
MOV DX,400H
OUT DX,AL
MOV AL, 60H ;设置ICW2
MOV DX,402H
OUT DX,AL
MOV AL, 05H ;设置ICW4,普通全嵌套方式,非缓冲,非自动中断结束
OUT DX,AL
MOV AL, 0FEH ;设置OCW1,只开放IRO中断
OUT DX,AL
MOV BL,20H
STI
JMP $
RET
INT0 PROC
SHL BL,1
MOV AL,BL
MOV DX, 0600H ;74LS373输出口地址
OUT DX,AL
MOV DX,400H
MOV AL,20H
OUT DX,AL
IRET
INT0 ENDP
CODE ENDS
END START
仿真结果(截图放在下面):
-
请回答:8259A初始化命令中,ICW2命令为60H,则可推断IR7线上的中断向量号为多少?说明原因。
ICW2的高五位作为中断类型号的高5位,中断类型号的低3位取决于IR0-IR7,依次是000-111。若写入ICW2的值是60H,则IR7线上的中断向量号=01100111=67H. -
IR0中断矢量地址是多少?
60H*4=0180H -
请简要回答:
(1) 如果将中断程序里面红色框起来的这两行代码删除,仿真运行会出现怎么样的情况?
只有D7会亮,无法改变其他LED灯的亮灭
(2) 这两行代码实现的什么功能?怎么判断它实现了该功能,是否是通过特征位来判断的?
实现的是结束中断
20H=0010 0000H
分别对应 D7 D6 D5 D4 D3 D2 D1 D0
所以D5为1 D4、D3 为0 ,为送中断结束
通过D4D3判断,所以为特征位判断
(3) 如果要实现LED灯一直循环亮,并且计算中断的次数,怎么修改下面的中断程序?(将修改的程序截图,并标注你修改的部分)
-
请简要回答:为什么下面截图里面的地址一个是400H,一个是402H?(请结合上面完整代码和原理图进行分析)
0400H是IO2的输出地址
因为ICW2对应的A0为1 A0对应地址总线的A1所以地址总线的A1=1
所以为0402H -
请简要回答:下面这段代码实现了什么功能?
设置中断入口的偏移地址和中断入口的段地址