实验内容
用8259A的输出作为中断请求信号使8259A产生中断,进入中断后显示一个字符串。中断请求通过8259的IRQ3端输入,中断源要求是8253定时器输出的脉冲,并把8253的OUT0和总线槽IRQ3连接好.
编写程序,要求每次主机响应外部中断IRQ3时,显示字符串“THIS IS A 8259A INTERRUPT!”(或其它串),中断十次后,程序退出。
data segment
io8253a equ 280h
io8253b equ 281h
io8253c equ 283h
mess db 'THIS IS A 8259A INTERRUPT!',0dh,0ah,'$'
data ends
code segment
assume cs:code,ds:data
start:
mov ax,cs
mov ds,ax
;此处输入代码段代码
mov dx,io8253c ;向8253写控制字
mov al,36h ;使0通道为工作方式3
out dx,al
mov ax,1000 ;写入循环计数初值1000
mov dx,io8253a
out dx,al ;先写入低字节
mov al,ah
out dx,al ;后写入高字节
mov dx,offset int3 ;设置0BH号中断向量
mov ax,250bh
int 21h
cli ;关中断
in al,21h ;读中断屏蔽寄存器
and al,0f7h
out 21h,al ;写IMR,开放IRQ3中断
mov cx,10 ;记中断循环次数为10次
sti ;开中断
ll: jmp ll
int3 proc ;中断服务程序
mov ax,data
mov ds,ax
mov dx,offset mess
mov ah,09 ;显示每次中断的提示信息
int 21h
mov al,20h ;发出EOI结束中断(写入ocw2)
out 20h,al
sub cx,1 ;计数器减1
jnz next ;转去执行中断返回
in al,21h
or al,08h ;关闭IRQ3中断
out 21h,al
sti ;开中断
MOV AH,4CH
INT 21H
next: iret
int3 endp
CODE ENDS
END START