【接口技术】实验三:中断实验

一. 实验目的

  1. 掌握PC机中断处理系统的基本原理。
  2. 学会编写中断服务程序。
  3. 掌握扩展查询方法。

二. 实验内容

硬件平台:TPC-ZK-II配套试验箱
软件环境:TPC-ZK-II

实验3-1 中断服务实验

实验要求:

参照实验电路图,编写IRQ10的中断程序。实现直接用手动产生单脉冲作为中断请求信号。要求每按一次开关产生一次中断,在屏幕上显示一次“IRQ10!”,中断10次后程序退出。

电路图:
在这里插入图片描述
接线:
在这里插入图片描述
汇编代码:

DATA SEGMENT
    MESS DB 'IRQ10!',0DH,0AH,'$'    ;定义名为MESS的字符串,内容为IRQ10
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA          ;建立段寄存器寻址

START:
    MOV AX,CS                       ;将CS中的值送入AX中暂存
    MOV DS,AX                       ;将AX中的值送入DS中
    MOV DX,OFFSET INT10             ;设置中断程序段INT10的入口偏移量,并送入DX中
    MOV AX,2572H                    ;设置IRQ10的中断向量,设置完后,识别到有72h的中断类型号,会根据DS:DX的中断向量执行相应的中断服务程序
    INT 21H                         ;中断,输出
    
    IN AL,21H                       ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
    AND AL,0FBH                     ;取消屏蔽D2的中断,1111 1011
    OUT 21H,AL                      ;写回主片改变后的屏蔽字
    
    IN AL,0A1H                      ;从从片端口地址0A1H读入中断屏蔽器的当前屏蔽字
    AND AL,0FBH                     ;取消屏蔽D2的中断,1111 1011
    OUT 0A1H,AL                     ;写回从片改变后的屏蔽字
    
    MOV CX,10                       ;设置中断循环次数为10次,由CX储存
    STI                             ;恢复中断,设置中断标志位

LL: 
    JMP LL                          ;等待脉冲

INT10:
    MOV AX,DATA                     ;将DATA数据段送入AX寄存器中暂存
    MOV DS,AX                       ;将AX寄存器中的数据送入DS中
    MOV DX,OFFSET MESS              ;取得MESS数据存储区的首地址并送入DX寄存器中
    MOV AH,09                       ;调用DOS的9号功能,显示每次中断的提示信息
    INT 21H                         ;中断,输出中断提示信息
    
    MOV AL,20H                      ;从端口地址20H读入ISR内容送入AL
    OUT 20H,AL                      ;主片发出EOI结束命令
    OUT 0A0H,AL                     ;从片发出EOI结束命令
    
    LOOP NEXT                       ;循环执行NEXT,直到中断程序的远返回

    IN AL,21H                       ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
    OR AL,04H                       ;屏蔽D2的中断,0000 0100
    OUT 21H,AL                      ;写回主片改变后的屏蔽字
    
    IN AL,0A1H                      ;从从片端口地址0A1H读入中断屏蔽器的当前屏蔽字
    OR AL,04H                       ;屏蔽D2的中断,0000 0100
    OUT 0A1H,AL                     ;写回从片改变后的屏蔽字
    
    STI                             ;恢复中断,设置中断标志位
    MOV AH,4CH                      ;返回DOS
    INT 21H                         ;中断,退出,输出done

NEXT: IRET                          ;指令执行到中断程序的远返回

CODE ENDS
END START

运行结果:
在这里插入图片描述

实验3-2 中断嵌套实验

实验要求:
采用查询方式,参考电路图编制程序,编写IRQ3和IRQ10的中断嵌套程序,每按一次单脉冲进行一次中断,屏幕上显示相应的中断请求号“IRQ3”或“IRQ10”,进行IRQ10或者IRQ3中断操作,在屏幕显示中断信息时,按下另一个脉冲按钮,进行中断,屏幕上中断信息会被打断,进而显示另一个中断类型的中断信息。

电路图:
在这里插入图片描述
接线:
在这里插入图片描述
汇编代码:

DATA SEGMENT
    MESS DB 'IRQ10!',0DH,0AH,'$'    ;定义名为MESS的字符串,内容为IRQ10
    MEES DB 'IRQ3!',0DH,0AH,'$'     ;定义名为MESS的字符串,内容为IRQ3
DATA ENDS

CODE SEGMENT
    ASSUME CS: CODE, DS:DATA
.386

START:
    MOV AX,CS                       ;将CS中的值送入AX中暂存
    MOV DS,AX                       ;将AX中的值送入DS中
    
    MOV DX,OFFSET INT10             ;设置中断程序段INT10的入口偏移量,并送入DX中
    MOV AX,2572H                    ;设置IRQ10的中断向量,设置完后,识别到有72h的中断类型号,会根据DS:DX的中断向量执行相应的中断服务程序
    INT 21H                         ;中断,输出
    
    MOV DX,OFFSET INT3              ;设置中断程序段INT3的入口偏移量,并送入DX中
    MOV AX,250BH                    ;设置IRQ3的中断向量,设置完后,识别到有0Bh的中断类型号,会根据DS:DX的中断向量执行相应的中断服务程序
    INT 21H                         ;中断,输出
    
    IN AL,21H                       ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
    AND AL,0F3H                     ;取消屏蔽D2和D3的中断,1111 0011
    OUT 21H,AL                      ;写回主片改变后的屏蔽字

    IN AL,0A1H                      ;从从片端口地址0A1H读入中断屏蔽器的当前屏蔽字
    AND AL,0FBH                     ;取消屏蔽D2的中断,1111 1011
    OUT 0A1H,AL                     ;写回从片改变后的屏蔽字
    
    MOV CX,10                       ;设置中断循环次数为10次,由CX储存
    STI                             ;恢复中断,设置中断标志位
    
LL:
    JMP LL                          ;等待脉冲

INT10:
    PUSHAD                          ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈,以便准确跳转中断服务程序入口
    PUSHFD                          ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈,以便准确跳转中断服务程序入口
    MOV CX,10                       ;设置中断循环次数为10次,由CX储存
    MOV AX,DATA                     ;将DATA数据段送入AX寄存器中暂存
    MOV DS,AX                       ;将AX寄存器中的数据送入DS中
    
CC:   
    MOV DX,OFFSET MESS              ;取得MESS数据存储区的首地址并送入DX寄存器中
    MOV AH,09                       ;调用DOS的9号功能,显示每次中断的提示信息
    INT 21H                         ;中断,输出中断提示信息

    CALL DELAY                      ;调用延时子程序DELAY
    LOOP CC                         ;循环执行CC
    
    MOV AL,20H                      ;从主片端口地址20H读入ISR内容送入AL
    OUT 20H,AL                      ;主片发出EOI结束命令
    MOV AL,0A0H                     ;从从片端口地址0A0H读入ISR内容送入AL
    OUT 0A0H,AL                     ;从片发出EOI结束命令
 
    IN AL,21H                       ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
    OR AL,04H                       ;屏蔽D2的中断,0000 0100
    OUT 21H,AL                      ;写回主片改变后的屏蔽字
    OUT 0A1H,AL                     ;写回从片改变后的屏蔽字

    POPFD                           ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
    POPAD                           ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
    STI                             ;恢复中断,设置中断标志位
    IRET                            ;指令执行到中断程序的远返回
    MOV AH,4CH                      ;返回DOS
    INT 21H                         ;中断,退出
  
INT3:
    PUSHAD                          ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈,以便准确跳转中断服务程序入口
    PUSHFD                          ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈,以便准确跳转中断服务程序入口
    MOV CX,10                       ;设置中断循环次数为10次,由CX储存
    MOV AX,DATA                     ;将DATA数据段送入AX寄存器中暂存
    MOV DS,AX                       ;将AX寄存器中的数据送入DS中

BB:
    MOV DX,OFFSET MEES              ;取得MESS数据存储区的首地址并送入DX寄存器中
    MOV AH,09                       ;调用DOS的9号功能,显示每次中断的提示信息
    INT 21H                         ;中断,输出中断提示信息

    CALL DELAY                      ;调用延时子程序DELAY
    LOOP BB                         ;循环执行BB
    
    MOV AL,20H                      ;从主片端口地址20H读入ISR内容送入AL
    OUT 20H,AL                      ;主片发出EOI结束命令
    IN AL,21H                       ;从主片端口地址21H读入中断屏蔽器的当前屏蔽字
    OR AL,08H                       ;屏蔽D3的中断,0000 1000
    OUT 21H,AL                      ;写回主片改变后的屏蔽字

    POPFD                           ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
    POPAD                           ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
    STI                             ;恢复中断,设置中断标志位
    IRET                            ;指令执行到中断程序的远返回
    MOV AH,4CH                      ;返回DOS
    INT 21H                         ;中断,退出

DELAY PROC NEAR                     ;延时子程序DELAY开始定义
    PUSH BX                         ;将BX中内容入栈
    PUSH CX                         ;将CX中内容入栈
    MOV BX,100H                     ;将100H送入BX中

lll:
    MOV CX,0                        ;0送入CX中

llLL:
    LOOP llLL                       ;循环执行llLL
    DEC BX                          ;BX中内容自减
    JNE lll                         ;跳转至lll
    POP CX                          ;将CX中内容出栈
    POP BX                          ;将BX中内容出栈
    RET                             ;修改IP实现近转移

DELAY ENDP                          ;延时子程序DELAY结束定义

CODE ENDS
END START

运行结果:
在这里插入图片描述

  • 11
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jeron Zhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值