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