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