zl程序教程

您现在的位置是:首页 >  其它

当前栏目

汇编与接口技术实验5——8259中断实验

实验 中断 汇编
2023-09-11 14:22:52 时间

一、 实验目的

该实验使学生掌握8259向量中断方式的硬件连接和软件编程的方法,同时使同学掌握中断和其它接口芯片配合来完成某一特定任务的方法。

二、 实验内容

1、手动产生单脉冲作为中断请求信号连接到MIRQ3(对应中断号0BH)上和SIRQ10(对应中断号72H)上。每按一次开关产生一次中断,某LED灯就亮或灭一次(上次亮,当前就灭;上次灭,当前就亮),中断10次后程序退出。其中,主8259的端口地址为20H,从片8259的端口地址为0A0H.
在这里插入图片描述

连线:
总线/MIRQx 接 单脉冲1/正脉冲
总线/SIRQx 接 单脉冲2/正脉冲

编程提示
(1) MIRQ3和SIRQ10是接到PC的标准中断8259,其初始化工作已由系统的BIOS完成,因此不需要再对主和从8259A初始化(ICW1-ICW4),但要进行设置中断矢量和打开中断(包括CPU中断和8259A中断)等操作;注意:微机中采用的是非自动结束,则需要在中断结束前(中断服务程序的最后)发中断结束命令。另外、写入中断屏蔽字应采用“读—修改—写”过程,如下所述:

IN	AL,21H
AND	AL,0DFH
OUT	21H,AL

(2) 系统中断主中断MIRQ3
在这里插入图片描述

(3) 系统中断从中断SIRQ10。
在这里插入图片描述

2、8255的PC6作为中断源连接到MIRQ3上,每向8259A发出中断请求,使LED指示等交替点亮和熄灭。中断5次后程序退出.

编程提示

(1)中断服务程序的主要功能是交替点亮和熄灭LED指示灯(即第1次进中断点亮LED,
第2次进中断则熄灭LED)。8255使用前需要在主程序中初始化。
(2) 8255的PC6作为中断源,应采用上升沿触发方式(由低到高的变化),为了能够进行下次中断,PC6必须变为低点平。
(3) 为了能使LED的闪烁可见,在中断各申请之间加入延迟程序。

实验1程序的流程图如下:
在这里插入图片描述

实验2的流程图如下:
在这里插入图片描述

三、 实验步骤
1、 根据原理图自行连接实验线路(需要连接红线)。
实验1接线图如下:
在这里插入图片描述

实验2接线图如下:
在这里插入图片描述

2、 正确理解实验原理。
3、 编写实验程序,并上机调试,观察实验结果。
答: 实验1:主片和从片分别对应一个LED灯,通过脉冲触发中断,每触发一次,对应LED灯交替点亮或熄灭,在10次之后程序退出。

实验1的代码如下:
SSEG SEGMENT
    DW 100 DUP(?)
SSEG ENDS

;设置保存中断向量地址的变量
DSEG SEGMENT
    OLD1_OFF DW ?
    OLD1_SEG DW ?
    OLD2_OFF DW ?
    OLD2_SEG DW ?
;题目要求中断10次,设置变量用于对比
    N DW 10
;通过8255设置LED灯打开位置
    LED1 DW 00000100B
    LED2 DW 00100000B
DSEG ENDS

CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START:
    MOV AX,DSEG
    MOV DS,AX

;开放主片的中断屏蔽
    CLI
    IN AL,21H
    AND AL,0F3H	;11110011
    OUT 21H,AL

;开放从片的中断屏蔽
    IN AL,0A1H
    AND AL,0FBH	;11111011
    OUT 0A1H,AL

;中断主程序
    CALL SET_TABLE
;对要用到的8255进行初始化
    MOV DX,283H		;8255的命令口地址
    MOV AL,90H		;使用0方式
    OUT DX,AL		;送入命令口
;中断程序
    XOR CX,CX
;统计中断次数,超过10次则退出
S1:
    STI
    HLT		
    CMP CX,N
    JNZ S1
;中断结束,恢复中断向量
    CLI
    CALL RECOVER_TABLE
;中断结束恢复屏蔽
    IN AL,21H
    OR AL,0CH		;00001100
    OUT 21H,AL
    IN AL,0A1H
    OR AL,04H		;00000100
    OUT 0A1H,AL
    STI
    MOV AH,4CH		;程序结束
    INT 21H
    
;修改中断向量
SET_TABLE PROC
    PUSH DS
    PUSH DI
    PUSH BX
    
    MOV AX,0;
    MOV DS,AX
    MOV DI,4*0BH
    ;获取原中断向量
    MOV BX,[DI]
    MOV OLD1_OFF,BX
    MOV BX,[DI+2]
    MOV OLD1_SEG,BX
    ;设置新的中断向量
    MOV BX,OFFSET SW1_INT
    MOV [DI],BX
    MOV BX,SEG SW1_INT
    MOV [DI+2],BX
    
    MOV DI,4*72H
    ;获取原中断向量
    MOV BX,[DI]
    MOV OLD2_OFF,BX
    MOV BX,[DI+2]
    MOV OLD2_SEG,BX
    ;设置新的中断向量
    MOV BX,OFFSET SW2_INT
    MOV [DI],BX
    MOV BX,SEG SW2_INT
    MOV [DI+2],BX
    
    POP BX
    POP DI
    POP DS
    RET
SET_TABLE ENDP

;中断向量恢复
RECOVER_TABLE PROC
    PUSH DS
    PUSH DI
    PUSH BX
    
    MOV AX,0;
    MOV DS,AX
    MOV DI,4*0BH
    ;实现中断向量恢复语句
    MOV BX,OLD1_OFF
    MOV [DI],BX
    MOV BX,OLD1_SEG
    MOV [DI+2],BX
    
    MOV DI,4*72H
    ;实现中断向量恢复语句
    MOV BX,OLD2_OFF
    MOV [DI],BX
    MOV BX,OLD2_SEG
    MOV [DI+2],BX
    
    POP BX
    POP DI
    POP DS
    RET
RECOVER_TABLE ENDP

;中断服务程序
SW1_INT PROC
    PUSH AX
    PUSH DX
    CLI
    INC CX			;统计中断次数,如果超过10次则程序退出
    MOV AX,LED1
    MOV DX,281H		;8255的B口地址
    OUT DX,AX		;送到命令口
    XOR AX,00000100B	;异或语句实现指定LED对应输出电平转换
    MOV LED1,AX
    MOV AL,20H		
    OUT 20H,AL
    POP DX
    POP AX
    STI
    IRET
SW1_INT ENDP

;另一个中断服务程序
SW2_INT PROC
    PUSH AX
    PUSH DX
    CLI
    INC CX			;统计中断次数
    MOV AX,LED2
    MOV DX,281H		;8255的B口地址
    OUT DX,AX		;送到命令口
    XOR AX,00100000B	;异或语句实现指定LED对应输出电平转换
    MOV LED2,AX
    MOV AL,20H
    OUT 20H,AL
    MOV AL,20H;?
    OUT 0A0H,AL;?
    POP DX
    POP AX
    STI
    IRET
SW2_INT ENDP
CSEG ENDS
END START

实验2:程序中对8255的PC6进行控制,由程序自发的触发中断。可以看到的结果是8个LED灯一起亮灭五次。

实验2的代码如下:
SSEG SEGMENT
    DW 100 DUP(?)
SSEG ENDS

;数据段,存储LED操作,中断向量以及中断次数标准
DSEG SEGMENT
    OLD_OFF DW ?
    OLD_SEG DW ?
    N DW 5
    LED DB 0FFH
DSEG ENDS

CSEG SEGMENT
    ASSUME CS:CSEG,DS:DSEG,SS:SSEG
START:
    MOV AX,DSEG
    MOV DS,AX

;开放中断屏蔽
    CLI
    IN AL,21H
    AND AL,0F3H	;11110011
    OUT 21H,AL

;中断主程序
    CALL SET_TABLE
;对8255进行初始化
    MOV DX,283H
    MOV AL,90H
    OUT DX,AL
;中断程序
    XOR CX,CX	;CX清零
S1:
    STI
    ;设置8255的PC6输出高电平,触发中断
    MOV DX,282H
    MOV AL,40H	;01000000
    OUT DX,AL
;LED
    MOV DX,281H
    MOV AL,0FFH
    OUT DX,AL
    CALL DELAY
    MOV AL,00H
    OUT DX,AL
    CALL DELAY
    MOV DX,282H
    MOV AL,00H
    OUT DX,AL
    ;统计中断次数
    CMP CX,N
    JNZ S1
;中断结束,恢复中断向量
    CLI
    CALL RECOVER_TABLE
;中断结束恢复中断屏蔽
    IN AL,21H
    OR AL,0CH
    OUT 21H,AL
    STI
    MOV AH,4CH
    INT 21H
    
;修改中断向量
SET_TABLE PROC
    ;寄存器压栈保护
    PUSH DS
    PUSH DI
    PUSH BX
    
    MOV AX,0;
    MOV DS,AX
    MOV DI,4*0BH
    ;获取原中断向量
    MOV BX,[DI]
    MOV OLD_OFF,BX
    MOV BX,[DI+2]
    MOV OLD_SEG,BX
    ;设置新的中断向量
    MOV BX,OFFSET SW_INT
    MOV [DI],BX
    MOV BX,SEG SW_INT
    MOV [DI+2],BX
    
    POP BX
    POP DI
    POP DS
    RET
SET_TABLE ENDP

;中断向量恢复
RECOVER_TABLE PROC
    PUSH DS
    PUSH DI
    PUSH BX
    
    MOV AX,0;
    MOV DS,AX
    MOV DI,4*0BH
    ;实现中断向量恢复句
    MOV BX,OLD_OFF
    MOV [DI],BX
    MOV BX,OLD_SEG
    MOV [DI+2],BX
    
    POP BX
    POP DI
    POP DS
    RET
RECOVER_TABLE ENDP

;中断服务程序
SW_INT PROC
    PUSH AX
    PUSH DX
    CLI
    INC CX		;统计中断次数
    
    MOV AL,20H
    OUT 20H,AL
    POP DX
    POP AX
    STI
    IRET
SW_INT ENDP

;因为程序目的是LED自发闪烁,为确保观测效果设定时延
DELAY PROC
    PUSH BX
    PUSH CX
    MOV CX,0FFFH
DL1:    
    MOV BX,0FFFH
DL2:
    DEC BX
    JNZ DL2
    DEC CX
    JNZ DL1
    POP CX
    POP BX
    RET
DELAY ENDP

CSEG ENDS
END START

四、 思考题
如何理解采用中断方式进行实时控制,请举一些可能的应用例子。
答:中断是一种可以使CPU和硬件设备进行通信的技术。例如,当我们在敲击键盘时,键盘控制器(控制键盘的硬件设备)会发送一个中断,通知操作系统有键按下。从本质上说,中断是一种特殊的信号,由硬件设备向CPU发送。当CPU接收到中断信号后,就会马上通知操作系统此信号的到来,然后由操作系统负责处理这些新到来的数据。