当前位置: 首页 > news >正文

实验四 中断实验

一、实验目的               

掌握中断服务程序的编写。

二、实验电路

三、实验内容

1.实验用PC机内部的中断控制器8259A,中断源用TPC-ZK实验箱上的单脉冲电路,将单脉冲电路的输出接中断请求信号IRQ,每按一次单脉冲按键产生一次中断请求。

2.编写程序,要求每次主机响应外中断IRQ时,显示"THIS IS A 8259A INTERRUPT !",在键盘上敲任意一个键,程序退出。

四、编程提示

1.本实验用TPC-ZK实验系统的USB接口,USB接口实验箱固定接到了PC机主片中断控制器8259的IRQ3上,即进行中断实验时,所用中断类型号为0BH,编程时要根据0BH中断类型号设置中断矢量。

2. PC机主片中断控制器8259的地址为20H、21H。主片8259中断屏蔽寄存器IMR对应位(IRQ3)要清零(允许中断):

IN AL,21H

AND AL,11110111B

OUT 21H,AL

中断服务结束前要使用中断结束命令:

MOV AL,20H

OUT 20H,AL

中断结束返回DOS时将IMR对应位置1,屏蔽中断。

IN AL,21H

OR AL,08H

OUT 21H,AL

五、实验程序(必须加注释)和结果

IRO_MASK EQU 11110111B ; 中断屏蔽码,二进制表示为11110111,用于设置8259A中断控制器的中断屏蔽寄存器

DATAS SEGMENT

    MS1 DB 0DH,0AH,'THIS IS A 8259A INTERRUPT!',0DH,0AH,'$' ; 定义字符串,用于显示中断信息

    MS2 DB 0DH,0AH,'PRESS ANY KEY TO EXIT!',0DH,0AH,'$' ; 定义字符串,用于提示用户按任意键退出

    MS3 DB 0DH,0AH,'guozhihong2022900624 AND mingruizhao2022900625',0DH,0AH,'$' ; 定义字符串,可能是作者信息

    CSREG DW? ; 用于存储旧的中断向量段地址

    IPREG DW? ; 用于存储旧的中断向量偏移地址

DATAS ENDS

STACKS SEGMENT

    ; 此处输入堆栈段代码

STACKS ENDS

CODES SEGMENT

    ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:

    MOV ax,DATAS

    MOV ds,AX

   

    MOV dx,OFFSET MS3

    MOV ah,09H

    INT 21H ; 显示作者信息

   

    MOV DX,OFFSET MS1

    MOV ah,09H

    INT 21H ; 显示中断信息

   

    CLI ; 关中断,禁止其他中断发生

    MOV ax,350bh

    INT 21h ; 获取旧的中断向量

    MOV ax,es

    MOV CSREG,ax ; 存储旧的中断向量段地址

    MOV IPREG,bx ; 存储旧的中断向量偏移地址

    MOV ax,cs

    mov ds,ax

    MOV dx,offset INT_PROC

    MOV ax,250bh

    INT 21h ; 设置新的中断向量

    IN al,21h

    AND al,11110111b

    OUT 21h,al ; 设置8259A中断控制器的中断屏蔽寄存器

    MOV dx,offset MS2

    MOV ah,09h

    INT 21h ; 显示提示信息

    STI ; 开中断,允许其他中断发生

AG:

    MOV ah,1

    INT 16h

    JZ AG ; 等待用户按键

EXIT:

    CLI ; 关中断

    MOV dx,IPREG

    MOV ax,CSREG

    MOV ds,ax

    MOV ax,250bh

    INT 21h ; 恢复旧的中断向量

    IN al,21h

    or al,00001000b

    OUT 21h,al ; 恢复8259A中断控制器的中断屏蔽寄存器

    MOV ax,4c00h

    INT 21h ; 程序结束,返回操作系统

INT_PROC PROC

    PUSH ax

    PUSH dx

    PUSH ds

    MOV ax,DATAS

    MOV ds,ax

    MOV dx,offset MS1

    MOV ah,09h

    INT 21h ; 显示中断信息

    MOV al,20h

    OUT 20h,al ; 发送中断结束命令给8259A中断控制器

    POP ds

    POP dx

    POP ax

    IRET ; 中断返回

INT_PROC ENDP

CODES ENDS

END START

代码注释说明

IRO_MASK EQU 11110111B:定义了一个常量,用于设置8259A中断控制器的中断屏蔽寄存器。

DATAS SEGMENT:定义了数据段,包含了要显示的字符串和用于存储旧中断向量的变量。

STACKS SEGMENT:定义了堆栈段,但代码中没有具体内容。

CODES SEGMENT:定义了代码段,包含了程序的主要逻辑。

START:程序的入口点,包含了初始化和中断处理的代码。

INT_PROC PROC:定义了中断处理程序,用于处理8259A中断控制器产生的中断。

CODES ENDS:代码段结束。

END START:程序结束。

代码执行流程

程序开始,显示作者信息。

显示中断信息。

保存旧的中断向量。

设置新的中断向量,指向自定义的中断处理程序。

设置8259A中断控制器的中断屏蔽寄存器。

显示提示信息,等待用户按键。

用户按键后,恢复旧的中断向量。

恢复8259A中断控制器的中断屏蔽寄存器。

程序结束,返回操作系统。

代码中的关键操作

CLI和STI:用于关闭和开启中断。

INT 21H:用于调用DOS系统功能,如显示字符串和获取/设置中断向量。

IN和OUT:用于与8259A中断控制器进行数据传输。

PUSH和POP:用于保存和恢复寄存器的值。

IRET:用于从中断处理程序返回。

代码中的数据结构和变量

MS1、MS2和MS3:用于存储要显示的字符串。

CSREG和IPREG:用于存储旧的中断向量段地址和偏移地址。

代码中的函数和子程序

INT_PROC:中断处理程序,用于处理8259A中断控制器产生的中断。

代码中的输入输出操作

MOV dx,OFFSET MS1和MOV ah,09H:用于显示字符串。

IN al,21h和OUT 21h,al:用于与8259A中断控制器进行数据传输。

代码中的条件判断和循环结构

JZ AG:用于等待用户按键。

代码中的异常处理

代码中没有显式的异常处理逻辑,但通过中断处理程序可以处理8259A中断控制器产生的中断。

IRQ

二、实验电路

相关文章:

  • 【Linux】第七章 控制对文件的访问
  • 实现类似 “更新中” 的水平进度条按钮效果
  • 高级java每日一道面试题-2025年4月10日-微服务篇[Nacos篇]-Nacos的服务健康检查机制是如何工作的?
  • 下载maven低版本(官网)
  • 网站301搬家后谷歌一直不收录新页面怎么办?
  • maven如何解决jar包依赖冲突
  • Maven 多仓库和多镜像配置
  • 红宝书第四十七讲:Node.js服务器框架解析:Express vs Koa 完全指南
  • 408 计算机网络 知识点记忆(9)
  • 【今日三题】添加字符(暴力枚举) / 数组变换(位运算) / 装箱问题(01背包)
  • 阿里云短信服务与ASP.NET对接实例
  • 21、c#中“?”的用途
  • TDengine 语言连接器(R语言)
  • 【QT】常用控件 【多元素类 | 容器类 | 布局类】
  • 【n8n docker 部署的代理问题】解决n8n部署无法访问openai等外国大模型厂商的api
  • 入门-C编程基础部分:5、变量
  • MyBatis-Plus 中BaseMapper接口是如何加速微服务内部开发的?
  • 在ubuntu20.04+系统部署VUE及Django项目的过程记录——以腾讯云为例
  • HADOOP——序列化
  • 高并发多级缓存架构实现思路
  • 二级学院网站建设方案/企业网络营销策划书范文
  • 网站建设销售培训语/站长号
  • 购物网站设计理念/西安企业网站seo
  • 网站制作教程步骤/seo研究中心倒闭
  • 怎样建设好门户网站/实体店怎么引流推广
  • 对网站建设的考核机制/网站推广文章