汇编 8259 中断实验

发布时间:2023年12月28日

汇编 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 

文章来源:https://blog.csdn.net/Go_ahead_forever/article/details/135279559
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。