3、实验台上单脉冲输出端连接总线的IRQ, 以手动产生单个中断请求信号, 每次中断在屏幕上显示一次“THIS IS AN IRQ7 INTERRUPT!”、中断10 次后返回到DOS。实验代码如下:
DATA SEGMENT
MESS DB 'THIS IS AN IRQ INTERRUPT!', 0AH, 0DH, '$' OLDOFF DW ? OLDSEG DW ? INTFLAG DB ? DATA ENDS CODE SEGMENT
ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX
MOV AX, 350EH ; AH=35H 读取中断向量 INT 21H
MOV OLDSEG, ES ; 保存旧向量段地址 MOV OLDOFF, BX ; 保存旧向量偏移地址 MOV AX, CODE
MOV DS, AX ; DS中断服务程序段地址
MOV DX, OFFSET IRQ ; DX中断服务程序偏移地址 MOV AX, 250EH ; AH=25H置中断向量
INT 21H CLI
MOV DX, 0EC4CH ; PCI9052 中断状态、控制寄存器地址低位 MOV AL, 43H ; 最低为1,开中断 OUT DX, AL
INC DX ; PCI9052 中断状态、控制寄存器地址高位 MOV AL, 1DH ; 清除可能的中断标志 OUT DX, AL IN AL, 21H
AND AL, 10111111B ; D6=0、开放IRQ6中断 OUT 21H, AL MOV AX, DATA MOV DS, AX
MOV CX, 10 ; 设置中断循环次数 STI
NEXT: MOV INTFLAG, 1
LL: CMP INTFLAG, 0 ; 进入中断服务程序的标志 JNE LL
CALL DISPMSG LOOP NEXT CLI IN AL, 21H
OR AL, 40H ; 关闭IRQ6中断 OUT 21H, AL MOV DX, 0EC4CH MOV AL, 42H
OUT DX, AL ; 关闭PCI 9052中断 MOV DX, OLDOFF MOV DS, OLDSEG
MOV AX, 250EH ; AH=25H 恢复原中断向量 INT 21H STI
MOV AH, 4CH INT 21H
DISPMSG PROC MOV DX, OFFSET MESS MOV AH, 09 INT 21H RET
DISPMSG ENDP
4、用实验台上的8253 作为定时器时钟源,使其每秒产生一个脉冲连至总线的IRQ 作为中断请求信号。由于微机内部也配备了一片8253,其GATE2 由微机内部所配备的8255A 芯片的PB0 控制、CLK2 的输入时钟频率为1.19MHz、
OUT2 输出和8255A 芯片的PB1 相“与”后经过驱动连接到了微机的扬声器上,试利用这一资源,编程设置微机8253 使其通道2 输出1KHz 的音频信号,在中断发生时驱动扬声器发声。实验代码如下:
DATA SEGMENT DATA ENDS
STACK SEGMENT PARA STACK DW 128H DUP(0) STACK ENDS CODE SEGMENT
ASSUME CS:CODE, DS:DATA START: MOV AX, CS MOV DS, AX
MOV DX, OFFSET IRQ MOV AX, 250EH INT 21H CLI
MOV DX, 0EC4CH MOV AL, 43H OUT DX, AL INC DX
MOV AL, 1DH OUT DX, AL IN AL, 21H
AND AL, 10111111B OUT 21H, AL MOV AX, DATA MOV DS, AX //不变
MOV AL, 037H //写控制字 和初值 MOV DX, 0E483H OUT DX, AL MOV AX, 077H MOV DX, 0E483H OUT DX, AL
MOV DX, 0E480H 计数器1的初值 MOV AX, 01000H //频率1KHz OUT DX, AL MOV AL, AH OUT DX, AL MOV AX, 02000H MOV DX, 0E481H// OUT DX, AL MOV AL, AH