实验一:8259中断控制器应用实验实验名称PC机内中断应用实验成绩班级通信姓名学号实验目的:1.学习可编程中断控制器8259的工作原理;2.掌握可编程中断控制器8259的应用控制方法;实验内容:PC机中断实验。使用单次脉冲模拟中断产生。验证中断处理程序,在显示屏幕上显示一行预设定的字符串。实验步骤:实验结果及分析:DATASEGMENTMESSDB'TPCAinterrupt!',0DH,0AH,'$'DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,CSMOVDS,AXMOVDX,OFFSETINT3;采用间接修改法,调用DOS功能,设置中断向量,取得偏移地址MOVAX,SEGINT3;通过AX的过渡,得到段首地址。MOVDS,AXMOVAL,0BH;设置IRQ3对应的中断向量0BHMOVAH,25HINT21HINAL,21H;读中断屏蔽寄存器,21H是该寄存器的端口号ANDAL,0F7H;开放IRQ3中断,允许IRQ3的中断申请,11110111OUT21H,AL;输出到中断屏蔽寄存器MOVCX,10;记中断循环次数为10次STI;允许中断发生WAIT:JMPWAITINT3:MOVAX,DATA;中断服务程序MOVDS,AXMOVDX,OFFSETMESSMOVAH,09H;在屏幕上显示每次中断的提示信息INT21HMOVAL,20H;发出EOI结束中断到PC内主片的地址20HOUT20H,ALLOOPNEXT;当CX为0,跳转到NEXTINAL,21H;读中断屏蔽寄存器,获取中断屏蔽字ORAL,04H;关闭IRQ3中断,00000100OUT21H,AL;将中断屏蔽字送到中断屏蔽寄存器STI;置中断标志位MOVAH,4CH;返回DOSINT21HNEXT:IRET;中断返回CODEENDSENDSTART收获体会:使用间接法设置中断向量:1.将中断处理程序的段首地址送入DS寄存器,偏移量送入DX寄存器。2.将需要修改的中断向量类型号送入AL.3.25号功能送AH。4.执行INT21H指令。实验名称PC机内中断嵌套实验成绩班级姓名学号实验目的:1.学习可编程中断控制器8259的工作原理;2.掌握可编程中断控制器8259的应用控制方法;实验内容:PC机内中断嵌套实验。使用单次脉冲模拟两个中断源的中断产生,填写中断处理程序,体会中断嵌套的过程。实验步骤:实验结果及分析:CODESEGMENTASSUMECS:CODESTART:.386;伪指令CLIMOVAX,CSMOVDS,AXMOVDX,OFFSETINT10;设置IRQ10对应的中断向量MOVAX,SEGINT10;以AX为过渡,取得段首地址MOVDS,AXMOVAL,72H;IRQ10的中断向量地址为72HMOVAH,25HINT21HMOVDX,OFFSETINT3;设置IRQ3对应的中断向量MOVAX,SEGINT3;以AX为过渡,取得段首地址MOVDS,AXMOVAL,0BH;IRQ3的中断向量地址为0BHMOVAH,25HINT21HINAL,21H;读入中断控制寄存器ANDAL,0F7H;开放IRQ3中和IRQ2中断请求,11110111OUT21H,AL;输出到中断控制寄存器INAL,0A1HANDAL,0FBH;开放IRQ10中断请求11111011OUT0A1H,ALMOVCX,10;设置计数器STIWAIT:JMPWAIT;跳转,等待中断请求信号INT10:CLI;将处理器标志寄存器的中断标志位清0,当前不允许中断PUSHAD;将所有的32位通用寄存器压入堆栈PUSHFD;然后将32位标志寄存器EFLAGS压入堆栈MOVCX,10NEXT10_1:;在*号之间填写代码,在屏幕上显示10和空格的字符;****************************************MOVDL,'1';在屏幕显示字符1MOVAH,2INT21HMOVDL,'0';在屏幕显示字符0MOVAH,2INT21HMOVDL,20H;在屏幕显示空格字符MOVAH,2INT21H;******************************************CALLDELAY1;调用延时子程序LOOPNEXT10_1MOVDX,0DH;调用DOS的中断功能,回车MOVAH,02HINT21HMOVDX,0AH;调用DOS的中断功能,换行MOVAH,02HINT21HMOVAL,20HOUT0A0H,ALOUT20H,ALPOPFDPOPADSTIIRETINT3:CLIPUSHADPUSHFDMOVCX,10NEXT3_1:;在*号之间填写代码,在屏幕显示3和空格的字符;****************************************MOVDL,'3';在屏幕显示字符3MOVAH,2INT21HMOVDL,20H;在屏幕显示空格字符MOVAH,2INT21H;******************************************CALLDELAY1;调用延时子程序LOOPNEXT3_1MOVDX,0DH;调用DOS的中断功能,回车MOVAH,02HINT21HMOVDX,0AH;调用DOS的中断功能,换行MOVAH,02HINT21HMOVAL,20HOUT20H,ALOUT0A0H,ALPOPFDPOPADSTIIRETDELAY1PROC;延时子程序PUSHAD;将所有的32位通用寄存器压入堆栈PUSHFD;然后将32位标志寄存器EFLAGS压入堆栈MOVCX,0FH;向CX送数据0FHDELAY_LOOP1:MOVBX,0FFFFHDELAY_LOOP2:DECBXNOPJNZDELAY_LOOP2LOOPDELAY_LOOP1POPFDPOPADRETDELAY1ENDPCODEENDSENDSTART收获体会:(1)按下连接IRQ的单次脉冲按键,在屏幕上10次显示未结束之前,按下连接IRQ10的单次脉冲按键,观察现象;答:按下IRQ时屏幕上会显示10个3,此时按下IRQ10,会直接在屏幕上显示10个10,然后结束后再显示剩余的3(2)按下连接IRQ10的单次脉冲按键,在屏幕上10次显示未结束之前,按下连接IRQ3的单次脉冲按键,观察现象。答:在屏幕上显示10个10的过程中按下IRQ无反应,等到10个10全部显示完毕后才再显示10个3原因:IRQ10的中断优先级比IRQ的高。实验名称扩展多中断应用实验成绩班级姓名学号实验目的:1.学习可编程中断控制器8259的工作原理;2.掌握可编程中断控制器8259的应用控制方法;实验内容:扩展多中断源查询方式应用实验。利用实验平台上的8259控制器作为中断扩展源,编写程序对8259控制器的中断请求进行处理。实验步骤:实验结果及分析:;*****************************************************************;8259中断查询方式应用实验;*****************************************************************I8259_1EQU2B0H;8259的ICW1端口地址I8259_2EQU2B1H;8259的ICW2端口地址I8259_3EQU2B1H;8259的ICW3端口地址I8259_4EQU2B1H;8259的ICW4端口地址O8259_1EQU2B1H;8259的OCW1端口地址O8259_2EQU2B0H;8259的OCW2端口地址O8259_3EQU2B0H;8259的OCW3端口地址DATASEGMENTMES1DB'YOUCANPLAYAKEYONTHEKEYBOARD!',0DH,0AH,24HMES2DDMES1MESS1DB'HELLO!THISISINTERRUPT*0*!',0DH,0AH,'$'MESS2DB'HELLO!THISISINTERRUPT*1*!',0DH,0AH,'$'MESS3DB'HELLO!THISISINTERRUPT*2*!',0DH,0AH,'$'MESS4DB'HELLO!THISISINTERRUPT*3*!',0DH,0AH,'$'MESS5DB'HELLO!THISISINTERRUPT*4*!',0DH,0AH,'$'MESS6DB'HELLO!THISISINTERRUPT*5*!',0DH,0AH,'$'MESS7DB'HELLO!THISISINTERRUPT*6*!',0DH,0AH,'$'MESS8DB'HELLO!THISISINTERRUPT*7*!',0DH,0AH,'$'DATAENDSSTACKSSEGMENTDB100DUP(?)STACKSENDSSTACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKS,ES:DATA.386;伪指令,告诉编译器在本程序中使用的指令集为80386指令集START:MOVAX,DATAMOVDS,AXMOVES,AXMOVAX,STACKSMOVSS,AXMOVDX,I8259_1;初始化8259的ICW1MOVAL,13H;边沿触发、单片8259、需要ICW400010011OUTDX,ALMOVDX,I8259_2;初始化8259的ICW2MOVAL,0B0HOUTDX,ALMOVAL,03HOUTDX,ALMOVDX,O8259_1;初始化8259的OCW1MOVAL,00H;打开屏蔽位OUTDX,ALQUERY:MOVAH,1;判断是否有按键按下INT16HJNZQUIT;有按键则退出MOVDX,O8259_3;向8259的OCW3发送查询命令MOVAL,0CH;00001100D2=1,设置为中断查询方式工作OUTDX,ALINAL,DX;读出查询字MOVAH,ALANDAL,80H;判断中断是否已响应TESTAL,80HJZQUERY;没有响应则继续查询MOVAL,AHANDAL,07H;取出查询字的末三位00000111;通过下面的比较判断程序,判断中断请求来自哪个优先级CMPAL,00H;将查询字末三位与00H比较,相等,为IR0请求JEIR0ISR;若为IR0请求,跳到IR0处理程序CMPAL,01HJEIR1ISR;若为IR1请求,跳到IR1处理程序CMPAL,02HJEIR2ISR;若为IR2请求,跳到IR2处理程序CMPAL,03HJEIR3ISR;若为IR3请求,跳到IR3处理程序CMPAL,04HJEIR4ISR;若为IR4请求,跳到IR4处理程序CMPAL,05HJEIR5ISR;若为IR5请求,跳到IR5处理程序CMPAL,06HJEIR6ISR;若为IR6请求,跳到IR6处理程序CMPAL,07HJEIR7ISR;若为IR7请求,跳到IR7处理程序JMPQUERYIR0ISR:MOVAX,DATA;将数据段首地址放入AX寄存器MOVDS,AXMOVDX,OFFSETMESS1;显示提示信息MOVAH,09INT21HJMPEOIIR1ISR:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMESS2;显示提示信息MOVAH,09INT21HJMPEOIIR2ISR:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMESS3;显示提示信息MOVAH,09INT21HJMPEOIIR3ISR:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMESS4;显示提示信息MOVAH,09INT21HJMPEOIIR4ISR:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMESS5;显示提示信息MOVAH,09INT21HJMPEOIIR5ISR:MOVAX,DATAMOVDS,AXMOVDX,OFFSETMES