汇编 8259 中断实验

汇编 8259 中断实验

一、实验目的

(1)掌握微机中断处理系统的基本原理。
(2)掌握8259中断控制器的工作原理,学会编写中断服务程序。
(3)掌握8259级联方式的使用方法。

二、实验设备

(1)微型计算机1台。
(2)TD-PITE微机接口实验系统1套。

三、预习要求

(1)阅读本实验教程及相关教材。
(2)复习有关中断的内容,了解微机的中断处理过程,熟悉8259的工作方式及编程方法。
(3)预习实验提示及相关知识点。
(4)按实验题目要求在实验前编写好相应的源程序。

四、实验内容和要求

(1)利用系统总线上中断请求信号MIR7,设计一个单一中断请求实验。
(2)利用系统总线上中断请求信号MIR6和MIR7,设计一个双中断优先级应用实验,观察8259对中
断优先级的控制。
(3)利用系统总线上中断请求信号MIR7和SIR1,设计一个级联中断应用实验。

五、实验原理

在Intel 386EX芯片中集成有中断控制单元(ICU),该单元包含有两个级联中断控制器,一个为主
控制器,一个为从控制器。该中断控制单元就功能而言与工业上标准的82C59A是一致的,操作方法也
相同。从片的INT连接到主片的IR2信号上构成两片8259的级联。
在TD-PITE微机实验系统中,将主控制器的IR6、IR7以及从控制器的IR1开放出来供实验使用,主片
8259的IR4供系统串口使用。8259的内部连接及外部管脚引出如图3-5所示。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
初始化命令字。8259有一个状态机控制对寄存器的访问,不正确的初始化顺序会造成异常初始化。
在初始化主片8259时,写入初始化命令字的顺序是:ICW1、ICW2、ICW3、然后是ICW4,初始化从片
8259的顺序与初始化主片8259的顺序是相同的。
系统启动时,主片8259已被初始化,且4号中断源(IR4)提供给与PC联机的串口通信使用,其它中
断源被屏蔽。中断矢量地址与中断号之间的关系如表3-2所示。

在这里插入图片描述

内容1

DATA SEGMENTMsg DB 'This is a MIR7 Interrupt!', 0DH, 0AH, '$'  
DATA ENDSCODE   	SEGMENTASSUME CS:CODE,  DS:DATA
START: 	PUSH DSMOV AX, 0000HMOV DS, AXMOV AX, OFFSET P1		;取中断入口地址MOV SI, 003CH			;中断矢量地址MOV [SI], AX			;填IRQ7的偏移矢量MOV AX, CS				;段地址MOV SI, 003EHMOV [SI], AX			;填IRQ7的段地址矢量CLIPOP DS;初始化主片8259MOV AL, 11HOUT 20H, AL				;ICW1MOV AL, 08HOUT 21H, AL				;ICW2MOV AL, 04HOUT 21H, AL				;ICW3MOV AL, 01HOUT 21H, AL				;ICW4MOV AL, 6FH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用OUT 21H, ALSTIMOV AX, DATAMOV DS, AX
AA1:	NOPJMP AA1P1 PROCCLI			;关中断PUSH AX			;保护现场PUSH DXSTI			;开中断MOV DX, OFFSET Msg	;做事情MOV AH, 09HINT 21H CLI			;关中断POP DXPOP AX			;恢复现场STI			;开中断MOV AL, 20HOUT 20H, AL		;EOI,中断结束IRET
P1 ENDPCODE ENDS
END START

内容2

DATA SEGMENTMsg6 DB 'This is a MIR6 Interrupt!', 0DH, 0AH, '$'  Msg7 DB 'This is a MIR7 Interrupt!', 0DH, 0AH, '$'  
DATA ENDSCODE   	SEGMENTASSUME CS:CODE,  DS:DATA
START: 	PUSH DSMOV AX, 0000HMOV DS, AXMOV AX, OFFSET P1		;取中断入口地址MOV SI, 0038H			;中断矢量地址MOV [SI], AX			;填IRQ6的偏移矢量MOV AX, CS				;段地址MOV SI, 003AHMOV [SI], AX			;填IRQ6的段地址矢量MOV AX, 0000HMOV DS, AXMOV AX, OFFSET P2		;取中断入口地址MOV SI, 003CH			;中断矢量地址MOV [SI], AX			;填IRQ7的偏移矢量MOV AX, CS				;段地址MOV SI, 003EHMOV [SI], AX			;填IRQ7的段地址矢量CLIPOP DS;初始化主片8259MOV AL, 11HOUT 20H, AL				;ICW1MOV AL, 08HOUT 21H, AL				;ICW2MOV AL, 04HOUT 21H, AL				;ICW3MOV AL, 01HOUT 21H, AL				;ICW4MOV AL, 6FH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用OUT 21H, ALSTIMOV AX, DATAMOV DS, AX
AA1:	NOPJMP AA1P1 PROCCLI			;关中断PUSH BX			;保护现场PUSH CXPUSH DXPUSH SISTI			;开中断MOV SI, OFFSET Msg6	; 将字符串的地址加载到SI寄存器PrintLoop1:MOV DL, [SI]		; 将当前字符加载到AL寄存器CMP DL, '$'		; 检查字符串结束标志JE  EndP1		; 如果是字符串结束标志,跳转到程序结束MOV AH, 02H		; 准备调用中断来打印字符INT 21H			; 调用DOS中断打印字符MOV CX, 0FFFH		; 设置延时计数器
DelayLoop1:DEC CXJNZ DelayLoop1		; 循环直到计数器减到0INC SI			; 移动到字符串的下一个字符JMP PrintLoop1		; 继续打印下一个字符EndP1:CLI			;关中断POP SIPOP DXPOP CXPOP BX			;恢复现场STI			;开中断MOV AL, 20HOUT 20H, AL		;EOI,中断结束IRET
P1 ENDPP2 PROCCLI			;关中断PUSH BX			;保护现场PUSH CXPUSH DXPUSH SISTI			;开中断MOV SI, OFFSET Msg7	; 将字符串的地址加载到SI寄存器PrintLoop2:MOV DL, [SI]		; 将当前字符加载到AL寄存器CMP DL, '$'		; 检查字符串结束标志JE  EndP2		; 如果是字符串结束标志,跳转到程序结束MOV AH, 02H		; 准备调用中断来打印字符INT 21H			; 调用DOS中断打印字符MOV CX, 0FFFH		; 设置延时计数器
DelayLoop2:DEC CXJNZ DelayLoop2		; 循环直到计数器减到0INC SI			; 移动到字符串的下一个字符JMP PrintLoop2		; 继续打印下一个字符EndP2:CLI			;关中断POP SIPOP DXPOP CXPOP BX			;恢复现场STI			;开中断MOV AL, 20HOUT 20H, AL		;EOI,中断结束IRET
P2 ENDPCODE ENDS
END START

内容3

DATA SEGMENTMsg7 DB 'This is a MIR7 Interrupt!awdtguagdwtadgwgasgdtawfd', 0DH, 0AH, '$'  Msg21 DB 'This is a MIR21 Interrupt!', 0DH, 0AH, '$'  
DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATA
START: 	PUSH DSMOV AX, 0000HMOV DS, AXMOV AX, OFFSET P1		;取中断入口地址MOV SI, 003CH			;中断矢量地址MOV [SI], AX			;填IRQ6的偏移矢量MOV AX, CS				;段地址MOV SI, 003EHMOV [SI], AX			;填IRQ6的段地址矢量MOV AX, 0000HMOV DS, AXMOV AX, OFFSET P2		;取中断入口地址MOV SI, 00C4H			;中断矢量地址MOV [SI], AX			;填IRQ7的偏移矢量MOV AX, CS				;段地址MOV SI, 00C6HMOV [SI], AX			;填IRQ7的段地址矢量CLIPOP DS;初始化主片8259MOV AL, 11HOUT 20H, AL				;ICW1MOV AL, 08HOUT 21H, AL				;ICW2MOV AL, 04HOUT 21H, AL				;ICW3MOV AL, 01HOUT 21H, AL				;ICW4;初始化cong片8259MOV AL, 11HOUT 0A0H, AL				;ICW1MOV AL, 30HOUT 0A1H, AL				;ICW2MOV AL, 02HOUT 0A1H, AL				;ICW3MOV AL, 01HOUT 0A1H, AL				;ICW4MOV AL, 6BH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用OUT 21H, ALMOV AL, 0FDH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用OUT 0A1H, ALSTIMOV AX, DATAMOV DS, AX
AA1:	NOPJMP AA1P1 PROCCLI			;关中断PUSH BX			;保护现场PUSH CXPUSH DXPUSH SISTI			;开中断MOV SI, OFFSET Msg7	; 将字符串的地址加载到SI寄存器PrintLoop1:MOV DL, [SI]		; 将当前字符加载到AL寄存器CMP DL, '$'		; 检查字符串结束标志JE  EndP1		; 如果是字符串结束标志,跳转到程序结束MOV AH, 02H		; 准备调用中断来打印字符INT 21H			; 调用DOS中断打印字符MOV CX, 0FFFH		; 设置延时计数器
DelayLoop1:DEC CXJNZ DelayLoop1		; 循环直到计数器减到0INC SI			; 移动到字符串的下一个字符JMP PrintLoop1		; 继续打印下一个字符EndP1:CLI			;关中断POP SIPOP DXPOP CXPOP BX			;恢复现场STI			;开中断MOV AL, 20HOUT 20H, AL		;EOI,中断结束IRET
P1 ENDPP2 PROCCLI			;关中断PUSH BX			;保护现场PUSH CXPUSH DXPUSH SISTI			;开中断MOV SI, OFFSET Msg21	; 将字符串的地址加载到SI寄存器PrintLoop2:MOV DL, [SI]		; 将当前字符加载到AL寄存器CMP DL, '$'		; 检查字符串结束标志JE  EndP2		; 如果是字符串结束标志,跳转到程序结束MOV AH, 02H		; 准备调用中断来打印字符INT 21H			; 调用DOS中断打印字符MOV CX, 0FFFH		; 设置延时计数器
DelayLoop2:DEC CXJNZ DelayLoop2		; 循环直到计数器减到0INC SI			; 移动到字符串的下一个字符JMP PrintLoop2		; 继续打印下一个字符EndP2:CLI			;关中断POP SIPOP DXPOP CXPOP BX			;恢复现场STI			;开中断MOV AL, 20HOUT 0A0H, AL		;EOI,中断结束,注意A0HOUT 20H, AL		;EOI,向主片发送EOIIRET
P2 ENDPCODE ENDS
END START

内容4

DATA SEGMENTMESS1 DB 'This is a IR7 interrupt!',0ah,0dh,'$'MESS2 DB 'All the 100 interrupts are over!',0h,0dh,'$'sequence DB 'st','nd','rd','th','$';ST db 'st$'ND db 'nd$'RD db 'rd$'TH db 'th$'front DB 'This is the  $'endMsg DB ' time interrupt$'newline db 0ah,0dh,'$' 
DATA ENDS
CODE SEGMENTASSUME CS: CODE, DS: DATA
printNumber PROC ; 子程序用于打印十进制数字;要打印的数字存储在 ax 中push ax ; 保存寄存器状态push bxpush cx                          push dxmov bx, 10 ; BX = 10xor cx, cx ; CX = 0,用于计数NumLoop:xor dx, dx ; DX = 0div bx ; AX = AX / BX, DX = AX % BXpush dx ; 将余数压栈inc cx ; 增加计数test ax, ax ; 检查商是否为0jnz NumLoop ; 如果不为0,继续循环PrintLoop:pop dx ; 弹出栈顶元素到 DXadd dl, '0' ; 将数字转换为字符mov ah, 2 ; AH = 2,用于显示单个字符int 21h ; 输出字符loop PrintLoop ; 循环打印数字pop dx ; 恢复寄存器状态pop cxpop bxpop axret
printNumber ENDP
START:CLIMOV AL, 11H    ;初始化 8253OUT 20H, ALMOV AL, 08HOUT 21H, ALMOV AL, 04HOUT 21H, ALMOV AL, 01HOUT 21H, ALMOV AX, 0      ;设置中断向量MOV DS, AXMOV AX, OFFSET M_IR7MOV SI, 003CHMOV [SI], AXMOV AX, SEG M_IR7MOV SI, 003EHMOV [SI], AXMOV AL, 6FH       ;初始化IMROUT 21H, ALMOV AX, DATA   ;初始话ISRMOV DS, AXMOV BX, 0STI
AA1:NOPJMP AA1
M_IR7: STI;进行取余操作,如果余数是1,2,3那么按顺序输出,如果是其他就输出 th 就好了 inc bxcmp bx, 100jg PINGBILEA DX, frontMOV AH, 09HINT 21Hmov ax,bxcall printNumbercmp ax, 11je printTHcmp ax, 12je printTHcmp ax, 13je printTHmov cl, 10div clcmp ah, 1je printSTcmp ah, 2je printNDcmp ah, 3je printRDjmp printTH
printTH:lea dx, THmov ah, 09hint 21hjmp printEnd
printST:lea dx, STmov ah, 09hint 21hjmp printEnd	
printND:lea dx, NDmov ah, 09hint 21hjmp printEnd
printRD:lea dx, RDmov ah, 09hint 21hjmp printEnd		    printEnd:lea dx, endMsgmov ah, 09hint 21hlea dx, newlinemov ah, 09hint 21hmov al, 20hout 20h, aljmp NEXTPINGBI:mov al, 20hout 20h, alIN AL, 21H  ;屏蔽中断OR AL, 80HOUT 21H, ALMOV DX, OFFSET MESS2MOV AH, 9int 21H
NEXT: IRET
CODE ENDS
END START 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/305604.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[SWPUCTF 2021 新生赛]finalrce

[SWPUCTF 2021 新生赛]finalrce wp 注&#xff1a;本文参考了 NSSCTF Leaderchen 师傅的题解&#xff0c;并修补了其中些许不足。 此外&#xff0c;参考了 命令执行(RCE)面对各种过滤&#xff0c;骚姿势绕过总结 题目代码&#xff1a; <?php highlight_file(__FILE__); …

git 学习 之一个规范的 commit 如何写

最好的话做一件完整的事情就提交一次

idea中切换JDK8、JDK11、JDK17

有时候&#xff0c;我们可能需要在不同的Java版本中去测试或者查看源码&#xff0c;idea可以让我们修改Java的版本。 前提&#xff1a;你必须下载安装好对应的Java版本&#xff0c;可参考文章【windows下切换JDK8、JDK11、JDK17】&#xff08;https://blog.csdn.net/xijinno1/a…

八种常见顺序存储的算法

目录 1、线性枚举 1&#xff09;问题描述 2&#xff09;动图演示 3&#xff09;示例说明 4&#xff09;算法描述 5&#xff09;源码详解 2、前缀和差分 1&#xff09;问题描述 2&#xff09;动图演示 3&#xff09;样例分析 4&#xff09;算法描述 5&#xff09;源码…

【解决方案】智能语音模块,东胜物联远场语音解决方案让控制更简单,应用于智能家居等场景

现在的天气真是冷得不想多动一下&#xff0c;又想打开取暖器&#xff1f;有了它&#xff0c;用声音就能遥控&#xff0c;今天我们就来聊聊智能语音模块。 技术概述 远场语音技术&#xff0c;采用了麦克风阵列、信号处理技术以及先进的语音识别引擎&#xff0c;使得设备能够在距…

Linux 查看系统类型和版本(内核版本 | 发行版本)

Linux 查看系统类型和版本 首先普及下linux系统的版本内容1. 查看linux系统内核版本2. 查看linux系统发行版本 首先普及下linux系统的版本内容 内核版本和发行版本区别 内核版本就是指 Linux 中最基层的代码&#xff0c;版本号如 Linux version 3.10.0-327.22.2.el7.x86_64发行…

网络安全 :保护数字世界的壁垒

随着数字化时代的到来&#xff0c;网络安全变得越来越重要。本文介绍了网络安全的定义&#xff0c;探讨了网络安全的重要性以及网络安全的解决方案&#xff0c;包括身份验证、防火墙、加密等技术&#xff0c;以确保数字世界的安全。 随着互联网的蓬勃发展&#xff0c;数字化技术…

uniApp中uView组件库的丰富布局方法

目录 基本使用 #分栏间隔 #混合布局 #分栏偏移 #对齐方式 API #Row Props #Col Props #Row Events #Col Events UniApp的uView组件库是一个丰富的UI组件库&#xff0c;提供了各种常用的UI组件和布局方法&#xff0c;帮助开发者快速构建美观、灵活的界面。下面给你写一…

Apache Commons JCS缓存解决方案

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff01;今天&#xff0c;咱们来聊聊Apache Commons JCS&#xff0c;一个Java界里的缓存大杀器。缓存技术&#xff0c;对于提高应用性能来说&#xff0c;就像是给它加了一剂兴奋剂&#xff0c;能让数据访问变得快如闪电。…

MySQL进阶之(一)逻辑架构

一、逻辑架构 1.1 逻辑架构剖析1.1.1 连接层1.1.2 服务层01、基础服务组件02、SQL Interface&#xff1a;SQL 接口03、Parser&#xff1a;解析器04、Optimizer&#xff1a;查询优化器05、Caches & Buffers&#xff1a; 查询缓存组件 1.1.3 引擎层1.1.4 存储层1.1.5 总结 1.…

DP进阶之路——整数拆分

343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。 示例 2: 输入: n 10 输出: 36 解释…

Ubuntu fcitx Install

ubuntu经常出现键盘失灵的问题 查询资料得知应该是Ibus框架的问题 于是需要安装fcitx框架和搜狗拼音 sudo apt update sudo apt install fcitx 设置fcitx开机自启动&#xff08;建议&#xff09; sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ 然后…