汇编 8259 中断实验

news2024/11/17 21:19:51

汇编 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 SEGMENT
	Msg DB 'This is a MIR7 Interrupt!', 0DH, 0AH, '$'  
DATA ENDS

CODE   	SEGMENT
	   	ASSUME CS:CODE,  DS:DATA
START: 	PUSH DS
		MOV AX, 0000H
		MOV DS, AX
		MOV AX, OFFSET P1		;取中断入口地址
		MOV SI, 003CH			;中断矢量地址
		MOV [SI], AX			;填IRQ7的偏移矢量
		MOV AX, CS				;段地址
		MOV SI, 003EH
		MOV [SI], AX			;填IRQ7的段地址矢量
		CLI
		POP DS
		;初始化主片8259
		MOV AL, 11H
		OUT 20H, AL				;ICW1
		MOV AL, 08H
		OUT 21H, AL				;ICW2
		MOV AL, 04H
		OUT 21H, AL				;ICW3
		MOV AL, 01H
		OUT 21H, AL				;ICW4
		MOV AL, 6FH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用
		OUT 21H, AL
		STI
		MOV AX, DATA
		MOV DS, AX
AA1:	NOP
		JMP AA1


P1 PROC
	CLI			;关中断

	PUSH AX			;保护现场
	PUSH DX

	STI			;开中断

	MOV DX, OFFSET Msg	;做事情
	MOV AH, 09H
    	INT 21H 

	CLI			;关中断
	
	POP DX
	POP AX			;恢复现场

	STI			;开中断

	MOV AL, 20H
	OUT 20H, AL		;EOI,中断结束

	IRET
P1 ENDP

CODE ENDS
END START

内容2

DATA SEGMENT
	Msg6 DB 'This is a MIR6 Interrupt!', 0DH, 0AH, '$'  
	Msg7 DB 'This is a MIR7 Interrupt!', 0DH, 0AH, '$'  
DATA ENDS

CODE   	SEGMENT
	   	ASSUME CS:CODE,  DS:DATA
START: 	PUSH DS

		MOV AX, 0000H
		MOV DS, AX
		MOV AX, OFFSET P1		;取中断入口地址
		MOV SI, 0038H			;中断矢量地址
		MOV [SI], AX			;填IRQ6的偏移矢量
		MOV AX, CS				;段地址
		MOV SI, 003AH
		MOV [SI], AX			;填IRQ6的段地址矢量

		MOV AX, 0000H
		MOV DS, AX
		MOV AX, OFFSET P2		;取中断入口地址
		MOV SI, 003CH			;中断矢量地址
		MOV [SI], AX			;填IRQ7的偏移矢量
		MOV AX, CS				;段地址
		MOV SI, 003EH
		MOV [SI], AX			;填IRQ7的段地址矢量

		CLI
		POP DS
		;初始化主片8259
		MOV AL, 11H
		OUT 20H, AL				;ICW1
		MOV AL, 08H
		OUT 21H, AL				;ICW2
		MOV AL, 04H
		OUT 21H, AL				;ICW3
		MOV AL, 01H
		OUT 21H, AL				;ICW4
		MOV AL, 6FH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用
		OUT 21H, AL
		STI
		MOV AX, DATA
		MOV DS, AX
AA1:	NOP
		JMP AA1


P1 PROC
	CLI			;关中断

	PUSH BX			;保护现场
	PUSH CX
	PUSH DX
	PUSH SI

	STI			;开中断

	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 CX
	JNZ DelayLoop1		; 循环直到计数器减到0

	INC SI			; 移动到字符串的下一个字符
	JMP PrintLoop1		; 继续打印下一个字符

EndP1:
	CLI			;关中断
	
	POP SI
	POP DX
	POP CX
	POP BX			;恢复现场

	STI			;开中断

	MOV AL, 20H
	OUT 20H, AL		;EOI,中断结束

	IRET
P1 ENDP


P2 PROC
	CLI			;关中断

	PUSH BX			;保护现场
	PUSH CX
	PUSH DX
	PUSH SI

	STI			;开中断

	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 CX
	JNZ DelayLoop2		; 循环直到计数器减到0

	INC SI			; 移动到字符串的下一个字符
	JMP PrintLoop2		; 继续打印下一个字符

EndP2:
	CLI			;关中断
	
	POP SI
	POP DX
	POP CX
	POP BX			;恢复现场

	STI			;开中断

	MOV AL, 20H
	OUT 20H, AL		;EOI,中断结束

	IRET
P2 ENDP

CODE ENDS
END START

内容3

DATA SEGMENT
	Msg7 DB 'This is a MIR7 Interrupt!awdtguagdwtadgwgasgdtawfd', 0DH, 0AH, '$'  
	Msg21 DB 'This is a MIR21 Interrupt!', 0DH, 0AH, '$'  
DATA ENDS

CODE SEGMENT
	ASSUME CS:CODE, DS:DATA
START: 	PUSH DS

		MOV AX, 0000H
		MOV DS, AX
		MOV AX, OFFSET P1		;取中断入口地址
		MOV SI, 003CH			;中断矢量地址
		MOV [SI], AX			;填IRQ6的偏移矢量
		MOV AX, CS				;段地址
		MOV SI, 003EH
		MOV [SI], AX			;填IRQ6的段地址矢量

		MOV AX, 0000H
		MOV DS, AX
		MOV AX, OFFSET P2		;取中断入口地址
		MOV SI, 00C4H			;中断矢量地址
		MOV [SI], AX			;填IRQ7的偏移矢量
		MOV AX, CS				;段地址
		MOV SI, 00C6H
		MOV [SI], AX			;填IRQ7的段地址矢量

		CLI
		POP DS
		;初始化主片8259
		MOV AL, 11H
		OUT 20H, AL				;ICW1
		MOV AL, 08H
		OUT 21H, AL				;ICW2
		MOV AL, 04H
		OUT 21H, AL				;ICW3
		MOV AL, 01H
		OUT 21H, AL				;ICW4

		;初始化cong片8259
		MOV AL, 11H
		OUT 0A0H, AL				;ICW1
		MOV AL, 30H
		OUT 0A1H, AL				;ICW2
		MOV AL, 02H
		OUT 0A1H, AL				;ICW3
		MOV AL, 01H
		OUT 0A1H, AL				;ICW4


		MOV AL, 6BH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用
		OUT 21H, AL
		MOV AL, 0FDH				;OCW1  0110 1111   开放4号中断串口用,7号中断实验用
		OUT 0A1H, AL

		STI
		MOV AX, DATA
		MOV DS, AX
AA1:	NOP
		JMP AA1


P1 PROC
	CLI			;关中断

	PUSH BX			;保护现场
	PUSH CX
	PUSH DX
	PUSH SI

	STI			;开中断

	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 CX
	JNZ DelayLoop1		; 循环直到计数器减到0

	INC SI			; 移动到字符串的下一个字符
	JMP PrintLoop1		; 继续打印下一个字符

EndP1:
	CLI			;关中断
	
	POP SI
	POP DX
	POP CX
	POP BX			;恢复现场

	STI			;开中断

	MOV AL, 20H
	OUT 20H, AL		;EOI,中断结束

	IRET
P1 ENDP


P2 PROC
	CLI			;关中断

	PUSH BX			;保护现场
	PUSH CX
	PUSH DX
	PUSH SI

	STI			;开中断

	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 CX
	JNZ DelayLoop2		; 循环直到计数器减到0

	INC SI			; 移动到字符串的下一个字符
	JMP PrintLoop2		; 继续打印下一个字符

EndP2:
	CLI			;关中断
	
	POP SI
	POP DX
	POP CX
	POP BX			;恢复现场

	STI			;开中断

	MOV AL, 20H
	OUT 0A0H, AL		;EOI,中断结束,注意A0H
	OUT 20H, AL		;EOI,向主片发送EOI

	IRET
P2 ENDP



CODE ENDS
END START

内容4

DATA SEGMENT
    MESS1 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 SEGMENT
    ASSUME CS: CODE, DS: DATA
printNumber PROC ; 子程序用于打印十进制数字
    ;要打印的数字存储在 ax 中
    push ax ; 保存寄存器状态
    push bx
    push cx                          
    push dx
    mov bx, 10 ; BX = 10
    xor cx, cx ; CX = 0,用于计数

NumLoop:
    xor dx, dx ; DX = 0
    div bx ; AX = AX / BX, DX = AX % BX
    push dx ; 将余数压栈
    inc cx ; 增加计数
    test ax, ax ; 检查商是否为0
    jnz NumLoop ; 如果不为0,继续循环

PrintLoop:
    pop dx ; 弹出栈顶元素到 DX
    add dl, '0' ; 将数字转换为字符
    mov ah, 2 ; AH = 2,用于显示单个字符
    int 21h ; 输出字符
    loop PrintLoop ; 循环打印数字
    
    pop dx ; 恢复寄存器状态
    pop cx
    pop bx
    pop ax
    ret
printNumber ENDP
START:
    CLI
    MOV AL, 11H    ;初始化 8253
    OUT 20H, AL
    MOV AL, 08H
    OUT 21H, AL
    MOV AL, 04H
    OUT 21H, AL
    MOV AL, 01H
    OUT 21H, AL
    MOV AX, 0      ;设置中断向量
    MOV DS, AX
    MOV AX, OFFSET M_IR7
    MOV SI, 003CH
    MOV [SI], AX
    MOV AX, SEG M_IR7
    MOV SI, 003EH
    MOV [SI], AX
    MOV AL, 6FH       ;初始化IMR
    OUT 21H, AL
    MOV AX, DATA   ;初始话ISR
    MOV DS, AX
    MOV BX, 0
    STI
AA1:
    NOP
    JMP AA1
M_IR7: 
    STI
    ;进行取余操作,如果余数是1,2,3那么按顺序输出,如果是其他就输出 th 就好了 
    inc bx
    cmp bx, 100
    jg PINGBI
    LEA DX, front
    MOV AH, 09H
    INT 21H
    mov ax,bx
    call printNumber
    cmp ax, 11
    je printTH
    cmp ax, 12
    je printTH
    cmp ax, 13
    je printTH
    mov cl, 10
    div cl
    cmp ah, 1
    je printST
    cmp ah, 2
    je printND
    cmp ah, 3
    je printRD
    jmp printTH
printTH:
	lea dx, TH
	mov ah, 09h
	int 21h
	jmp printEnd
printST:
	lea dx, ST
	mov ah, 09h
	int 21h
	jmp printEnd	
printND:
	lea dx, ND
	mov ah, 09h
	int 21h
	jmp printEnd
printRD:
	lea dx, RD
	mov ah, 09h
	int 21h
	jmp printEnd		    
    


printEnd:
    lea dx, endMsg
    mov ah, 09h
    int 21h
    lea dx, newline
    mov ah, 09h
    int 21h
    mov al, 20h
    out 20h, al
    jmp NEXT

PINGBI:
	mov al, 20h
    out 20h, al
    IN AL, 21H  ;屏蔽中断
    OR AL, 80H
    OUT 21H, AL
    MOV DX, OFFSET MESS2
    MOV AH, 9
    int 21H
NEXT: IRET
CODE ENDS
END START 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业级实践为“燃料”,大模型助推Kyligence产品力向上

回顾2023年,最火热的科技话题无疑是生成式AI。 从ChatGPT横空出世,到“千模大战”如火如荼,AIGC正式破圈,成为企业数字化转型的新关键词。 在红杉中国《2023企业数字化年度指南》中,通过调研235家企业可知&#xff0…

Eclipse先关的一些配置

启动配置设置 配置项详细说明: -Xms:初始堆内存大小,设定程序启动时占用内存大小,默认物理内存1/64 -Xms -XX:InitialHeapSiz-Xmx:最大堆内存,设定程序运行期间最大可占用的内存大小。如果程序运行需要…

软件测试|SQL中的null值,该如何理解?

深入理解SQL中的Null值:处理缺失数据的重要概念 简介 Null值在SQL中是用于表示缺失或未知数据的特殊值。本文将深入探讨Null值的概念、处理方法和注意事项,以帮助读者更好地理解和处理SQL中的缺失数据。 在SQL数据库中,Null值是一种特殊的…

BEV+Transformer感知架构共识下,传感器「火药味」再升级

高阶智能驾驶战火愈演愈烈,正带动感知方案卷入新一轮军备竞赛。 根据高工智能汽车研究院最新发布数据显示,2023年1-9月,中国市场(不含进出口)乘用车前装标配(软硬件)NOA交付新车37.73万辆&…

Linux下NUMA 内存管理初步理解

LINUX 系统在多核下,以及NUMA架构技术下 如何管理物理内存? 经过初步了解 发现系统对内存有以下工作 1 映射 2 内存碎片 3 内存回收 4 内存池 5 冷热页 6 水位线和保留内存 7 支持内存条热插拔 8 大页管理 这些功能给人感觉,尤其是DBA感觉是重新实现了数据缓存池的功…

机器学习(三) -- 特征工程(1)

系列文章目录 机器学习(一) -- 概述 机器学习(二) -- 数据预处理(1-3) 机器学习(三) -- 特征工程(1-2) 未完待续…… 目录 系列文章目录 前言 一、特征…

大数据开发的专业术语

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列专栏目录 [Java项…

画中画视频剪辑:创意与技术的完美结合,批量制作视频不再难

随着科技的飞速发展,视频制作已成为信息时代的一种重要表达方式。其中画中画视频剪辑技术更是以其独特的创意性和技术性,为观众的视觉体验带来了全新的冲击。它不仅为创作者提供了更广阔的创意空间,同时也降低了视频制作的门槛。现在一起来看…

VSCode Jupyter print 函数输出在错误的单元格(cell)

问题描述 最近在复现一个开源项目时,发现执行过该项目中的代码单元格后,其余单元格的print函数输出也会续在该单元格后。而正常情况下print函数输出应该位于其所属的单元格。下图中,我将出现问题的单元格执行后清空了输出,但是在…

深度解析 Compose 的 Modifier 原理 -- Modifier.composed()、ComposedModifier

众所周知:原理性分析的文章,真的很难讲的通俗易懂,讲的简单了就没必要写了,讲的繁琐难懂往往大家也不乐意看,所以只能尽量找个好的角度(比如从 Demo 代码示例出发)慢慢带着大家去钻源码&#xf…

书生·浦语大模型全链路开源开放体系

书生浦语大模型全链路开源体系_哔哩哔哩_bilibili 大模型全链路开源开放体系等你来探索~ https://github.com/internLM/tutorial 书生浦语全链条开源开放体系 1)数据: 书生万卷 2TB数据,并行训练,极致优化涵盖多种模态与任务 预训练: I…

聚道云软件连接器助力某动漫行业公司实现财务自动化

客户介绍 某动漫行业公司是一家专注于文化创意领域,致力于为人们提供独特、有趣的文化产品。公司拥有一支充满活力和创造力的团队,他们以卓越的创意和精湛的技术,创造出了一系列令人惊叹的作品。未来,该公司将继续秉承这一理念&a…

低代码开发平台支持复杂的业务逻辑和API对接吗

当今数字化时代,企业和组织面临着日益复杂的业务需求。为了应对这些挑战,低代码开发平台应运而生。白码低代码开发平台是一种高效、灵活且可扩展的开发工具,能够支持复杂的业务逻辑和第三方API对接,为企业带来更快速、更灵活的解决…

Rust 字符串 初步了解

rust 的字符串 。字符串不是复合类型, String 和 &str : String 具有所有权,是存储在堆上的。&str 没有所有权,是对 String 的引用。字符串字面量也是 &str 类型,存储在栈上。 切片(slice&a…

线性代数 --- 为什么LU分解中L矩阵的行列式一定等于(+-)1?

以下是关于下三角矩阵L的行列式一定等于-1的一些说明 证明:在LU分解中,下三角矩阵L的行列式一定是. 在证明之前,我这里先补充几条关于行列式的性质: 性质1:对于三角矩阵而言,不论是上三角矩阵还是下三角矩…

Qt6学习笔记:对象树

使用QObject及其子类创建的对象是以对象树的形式来组织的。创建一个QObject对象时若设置一个父对象,它就会被添加到父对象的子对象列表里,一个父对象被删除时,其全部的子对象都会自动删除。QObject类的构造函数里有一个参数用于设置对象的父对…

PyTorch基础操作

一、Tensor 在 PyTorch 中,张量(Tensor)是一个核心概念,它是一个用于存储和操作数据的多维数组,类似于 NumPy 的 ndarray,但与此同时,它也支持 GPU 加速,这使得在大规模数据上进行科…

数据结构和算法-希尔排序(增量序列 算法实现 性能分析 稳定性)

文章目录 希尔排序过程小结增量序列不是固定的 算法实现算法性能分析稳定性小结 希尔排序 基本有序,就是存在有序的子序列 通过增量4得到各个子表 对各个子表分别进行插入排序 缩小增量,再除2,此时的子表 对各个子表插入排序 缩小增量&…

数据库设计——DQL

D Q L \huge{DQL} DQL ⭐⭐⭐⭐⭐ DQL:数据库查询语言,用来查询数据库中的记录,非常的重要,对于数据库的操作修改相对来讲还是较少部分,绝大多数操作都是数据查询。 整体的语法结构: 基本查询 示例&#…

2024最新Java基础面试题大全(一)

1、String可以被继承&#xff1f; 不能被继承&#xff0c;因为String类有final修饰符&#xff0c;而final修饰的类是不能被继承的。 public final class String implements java.io.Serializable, Comparable<String>, CharSequence {// 省略...  }2、常见集合类 Java…