一、實驗目的 ??????????????
掌握中斷服務程序的編寫。
二、實驗電路
|
三、實驗內容
1.實驗用PC機內部的中斷控制器8259A,中斷源用TPC-ZK實驗箱上的單脈沖電路,將單脈沖電路的輸出接中斷請求信號IRQ,每按一次單脈沖按鍵產生一次中斷請求。
2.編寫程序,要求每次主機響應外中斷IRQ時,顯示"THIS IS A 8259A INTERRUPT !",在鍵盤上敲任意一個鍵,程序退出。
四、編程提示
1.本實驗用TPC-ZK實驗系統的USB接口,USB接口實驗箱固定接到了PC機主片中斷控制器8259的IRQ3上,即進行中斷實驗時,所用中斷類型號為0BH,編程時要根據0BH中斷類型號設置中斷矢量。
2. PC機主片中斷控制器8259的地址為20H、21H。主片8259中斷屏蔽寄存器IMR對應位(IRQ3)要清零(允許中斷):
IN AL,21H
AND AL,11110111B
OUT 21H,AL
中斷服務結束前要使用中斷結束命令:
MOV AL,20H
OUT 20H,AL
中斷結束返回DOS時將IMR對應位置1,屏蔽中斷。
IN AL,21H
OR AL,08H
OUT 21H,AL
五、實驗程序(必須加注釋)和結果
IRO_MASK EQU 11110111B ; 中斷屏蔽碼,二進制表示為11110111,用于設置8259A中斷控制器的中斷屏蔽寄存器
DATAS SEGMENT
??? MS1 DB 0DH,0AH,'THIS IS A 8259A INTERRUPT!',0DH,0AH,'$' ; 定義字符串,用于顯示中斷信息
??? MS2 DB 0DH,0AH,'PRESS ANY KEY TO EXIT!',0DH,0AH,'$' ; 定義字符串,用于提示用戶按任意鍵退出
??? MS3 DB 0DH,0AH,'guozhihong2022900624 AND mingruizhao2022900625',0DH,0AH,'$' ; 定義字符串,可能是作者信息
??? CSREG DW? ; 用于存儲舊的中斷向量段地址
??? IPREG DW? ; 用于存儲舊的中斷向量偏移地址
DATAS ENDS
STACKS SEGMENT
??? ; 此處輸入堆棧段代碼
STACKS ENDS
CODES SEGMENT
??? ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
??? MOV ax,DATAS
??? MOV ds,AX
???
??? MOV dx,OFFSET MS3
??? MOV ah,09H
??? INT 21H ; 顯示作者信息
???
??? MOV DX,OFFSET MS1
??? MOV ah,09H
??? INT 21H ; 顯示中斷信息
???
??? CLI ; 關中斷,禁止其他中斷發生
??? MOV ax,350bh
??? INT 21h ; 獲取舊的中斷向量
??? MOV ax,es
??? MOV CSREG,ax ; 存儲舊的中斷向量段地址
??? MOV IPREG,bx ; 存儲舊的中斷向量偏移地址
??? MOV ax,cs
??? mov ds,ax
??? MOV dx,offset INT_PROC
??? MOV ax,250bh
??? INT 21h ; 設置新的中斷向量
??? IN al,21h
??? AND al,11110111b
??? OUT 21h,al ; 設置8259A中斷控制器的中斷屏蔽寄存器
??? MOV dx,offset MS2
??? MOV ah,09h
??? INT 21h ; 顯示提示信息
??? STI ; 開中斷,允許其他中斷發生
AG:
??? MOV ah,1
??? INT 16h
??? JZ AG ; 等待用戶按鍵
EXIT:
??? CLI ; 關中斷
??? MOV dx,IPREG
??? MOV ax,CSREG
??? MOV ds,ax
??? MOV ax,250bh
??? INT 21h ; 恢復舊的中斷向量
??? IN al,21h
??? or al,00001000b
??? OUT 21h,al ; 恢復8259A中斷控制器的中斷屏蔽寄存器
??? MOV ax,4c00h
??? INT 21h ; 程序結束,返回操作系統
INT_PROC PROC
??? PUSH ax
??? PUSH dx
??? PUSH ds
??? MOV ax,DATAS
??? MOV ds,ax
??? MOV dx,offset MS1
??? MOV ah,09h
??? INT 21h ; 顯示中斷信息
??? MOV al,20h
??? OUT 20h,al ; 發送中斷結束命令給8259A中斷控制器
??? POP ds
??? POP dx
??? POP ax
??? IRET ; 中斷返回
INT_PROC ENDP
CODES ENDS
END START
代碼注釋說明
IRO_MASK EQU 11110111B:定義了一個常量,用于設置8259A中斷控制器的中斷屏蔽寄存器。
DATAS SEGMENT:定義了數據段,包含了要顯示的字符串和用于存儲舊中斷向量的變量。
STACKS SEGMENT:定義了堆棧段,但代碼中沒有具體內容。
CODES SEGMENT:定義了代碼段,包含了程序的主要邏輯。
START:程序的入口點,包含了初始化和中斷處理的代碼。
INT_PROC PROC:定義了中斷處理程序,用于處理8259A中斷控制器產生的中斷。
CODES ENDS:代碼段結束。
END START:程序結束。
代碼執行流程
程序開始,顯示作者信息。
顯示中斷信息。
保存舊的中斷向量。
設置新的中斷向量,指向自定義的中斷處理程序。
設置8259A中斷控制器的中斷屏蔽寄存器。
顯示提示信息,等待用戶按鍵。
用戶按鍵后,恢復舊的中斷向量。
恢復8259A中斷控制器的中斷屏蔽寄存器。
程序結束,返回操作系統。
代碼中的關鍵操作
CLI和STI:用于關閉和開啟中斷。
INT 21H:用于調用DOS系統功能,如顯示字符串和獲取/設置中斷向量。
IN和OUT:用于與8259A中斷控制器進行數據傳輸。
PUSH和POP:用于保存和恢復寄存器的值。
IRET:用于從中斷處理程序返回。
代碼中的數據結構和變量
MS1、MS2和MS3:用于存儲要顯示的字符串。
CSREG和IPREG:用于存儲舊的中斷向量段地址和偏移地址。
代碼中的函數和子程序
INT_PROC:中斷處理程序,用于處理8259A中斷控制器產生的中斷。
代碼中的輸入輸出操作
MOV dx,OFFSET MS1和MOV ah,09H:用于顯示字符串。
IN al,21h和OUT 21h,al:用于與8259A中斷控制器進行數據傳輸。
代碼中的條件判斷和循環結構
JZ AG:用于等待用戶按鍵。
代碼中的異常處理
代碼中沒有顯式的異常處理邏輯,但通過中斷處理程序可以處理8259A中斷控制器產生的中斷。
IRQ |
二、實驗電路