实验三 中断
一、实验目的
1.掌握PC机中断处理系统的基本原理。 2.学会编写中断服务程序。
三、 实验内容
PC机用户可使用的硬件中断只有可屏蔽中断,由8259中断控制器管理。中断控制器用于接收外部的中断请求信号,经过优先级判别等处理后向CPU发出可屏蔽中断请求。IBMPC、PC/XT机内有一片8259中断控制器对外可以提供8个中断源:
中断源 中断类型号 中断功能 IRQ0 08H 时钟 IRQ1 09H 键盘 IRQ2 0AH 保留 IRQ3 OBH 串行口2 IRQ4 0CH 串行口1 IRQ5 0DH 硬盘 IRQ6 0EH 软盘 IRQ7 0FH 并行打印机
8个中断源的中断请求信号线IRQ0~IRQ7在主机的62线ISA总线插座中可以引出,系统已设定中断请求信号为“边沿触发”,普通结束方式。对于PC/AT及286以上微机内又扩展了一片8259中断控制,IRQ2用于两片8259之间级连,对外可以提供16个中断源:
中断源 中断类型号 中断功能 IRQ8 070H 实时时钟 IRQ9 071H 用户中断 IRQ10 072H 保留 IRQ11 073H 保留 IRQ12 074H 保留
9
IRQ13 075H 协处理器 IRQ14 076H 硬盘 IRQ15 077H 保留
PCI总线中的中断线只有四根,INTA#、INTB#、INTC#、INTD#,它们需要通过P&P的设置来和某一根中断相连接才能进行中断申请。
IRQ+5 图7
实验电路如图7,直接用手动产单脉冲作为中断请求信号(只需连接一根导线)。要求每按一次开关产生一次中断,在屏幕上显示一次“TPC pci card Interrupt”,中断10次后程序退出。
三、参考流程图
10
开始关中断设置TPC卡中断使能保存原中断向量设置新中断向量设置中断掩码显示提示信息开中断Y计数器为0?N中断开始Y按任意键?N关中断计数器减一显示提示信息发出EOI结束中断开中断中断返回
恢复中断掩码恢复原中断向量设置TPC卡中断关闭结束返回图8 图9
四、源程序及注释
源程序 : data segment
int_vect EQU 073H ;中断0-7的向量为:08h-0fh,中断8-15的向量为:70h-77h
irq_mask_2_7 equ 11111011b ;中断掩码,中断0-7时从低至高相应位为零,中断8-15时第
2位为零
11
irq_mask_9_15 equ 11110111b ;中断0-7时全一,中断8-15时从低至高相应位为零 ioport_cent equ 0E800h ;tpc 卡中9054芯片的io地址 csreg dw ?
ipreg dw ? ;旧中断向量保存空间 irq_times dw 00h ;中断计数
msg1 db 0dh,0ah,'TPC pci card Interrupt',0dh,0ah,'$' msg2 db 0dh,0ah,'Press any key to exit!',0dh,0ah,'$'
msg3 db 0dh,0ah,'Press DMC to interrupt 10 times and exit!',0dh,0ah,'$' data ends
stack segment stack
db 100 dup (?) stack ends
code segment assume cs:code,ds:data,ss:stack,es:data start:
;Enable Local Interrupt Input .386 cli mov ax,data
mov ds,ax mov es,ax mov ax,stack mov ss,ax
mov dx,ioport_cent+68h ;设置 tpc 卡中9054芯片io口,使能中断 in ax,dx or ax,0900h out dx,ax
mov al,int_vect ;保存原中断向量 mov ah,35h int 21h mov ax,es mov csreg,ax mov ipreg,bx
mov ax,seg int_proc ;设置新中断向量 mov ds,ax
mov dx,offset int_proc mov al,int_vect mov ah,25h int 21h
in al, 21h ;设置中断掩码
12
and al, irq_mask_2_7 out 21h, al in al, 0a1h
and al, irq_mask_9_15 out 0a1h, al mov ax,data mov ds,ax
mov dx,offset msg2 mov ah,09h int 21h
mov dx,offset msg3 mov ah,09h int 21h
mov irq_times,0ah sti
loop1: cmp irq_times,0 ;等待中断并判断中断10次后退出
jz exit mov ah,1
int 16h
jnz exit ;按任意键退出 jmp loop1
exit: cli mov bl, irq_mask_2_7 ;恢复中断掩码
not bl in al, 21h or al, bl
out 21h, al
mov bl, irq_mask_9_15 not bl
in al, 0a1h or al, bl out 0a1h, al
mov dx,ipreg ;恢复原中断向量 mov ax,csreg mov ds,ax mov ah,25h mov al,int_vect int 21h
13