?? 匯008.txt
字號:
了解的內容:輸入輸出的基本概念,中斷的基本概念,中斷源和中斷的響應過程(在其它課程中應有更高的要求),各類中斷的基本功能,能根據具體的需要找到相應的系統中斷。
掌握的內容:I/O地址和內存單元地址的編址,中斷向量表的作用,修改中斷向量表的方法,以及編寫用戶中斷服務程序的編程方法。
熟練掌握的內容:各種I/O指令的功能,引起中斷的指令和中斷返回指令,中斷的使用方法。
建議學習時間:8小時。
第8章 輸入輸出和中斷
輸入輸出功能是計算機的重要組成部分,是人—機交互功能的主要承擔者。在早期的計算機系統中,通常把輸入輸出設備或功能作為次要的部分,而把CPU作為主要研究對象。但現在隨著輸入輸出設備的日益豐富、功能要求越來越復雜,輸入輸出部分在整個計算機系統中的地位也得到了進一步提高。
本章先介紹了I/O的基本概念和I/O指令,再敘述了中斷的概念及其工作過程,并列舉出計算機系統中若干個常用的中斷及其功能。
8.1 輸入輸出的基本概念
輸入輸出是一個完整應用程序的重要組成部分,是交互式應用程序不可缺少的組成部分。
在用高級語言編程時,程序員可直接用輸入輸出語句來完成鍵盤輸入、屏幕顯示或打印輸出等需求,而無需關心這些輸入輸出語句是如何實現的,因為編譯程序會自動把這些語句轉換成相應的輸入輸出指令。但如果用匯編語言編寫程序的話,情況就不同了,因為匯編語言是與機器有關的程序設計語言,要編寫出具有輸入輸出功能的代碼段就必須清楚CPU為輸入輸出提供了哪些指令,或計算機系統提供了哪些可直接使用的功能調用。
8.1.1 I/O端口地址
I/O端口是CPU與輸入輸出設備的交換數據的場所,通過I/O端口,處理機可以接受從輸入設備輸入的信息;也可向輸出設備發送信息。在計算機系統中,為了區分各類不同的I/O端口,就用不同的數字給它們進行編號,這種對I/O端口的編號就稱為I/O端口地址。按照
每次可交換一個字節數據的端口稱為字節端口,每次可交換一個字數據的端口稱為字端口。
在Intel公司的CPU家族中,I/O端口的地址空間可達64K,即可有65536個字節端口,或32768個字端口。這些地址不是內存單元地址的一部分,不能普通的訪問內存指令來讀取其信息,而要用專門的I/O指令才能訪問它們。雖然CPU提供了很大的I/O地址空間,但目前大多數微機所用的端口地址都在0~3FFH范圍之內,其所用的I/O地址空間只占整個I/O地址空間的很小部分。表8.1列舉了幾個重要的I/O端口地址。
表8.1 幾個重要的I/O端口地址
端口地址 端口名稱 端口地址 端口名稱
020H~023H
中斷屏蔽寄存器
378H~37FH
并行口LPT2
040H~043H
時針/計數器
3B0H~3BBH
單色顯示器端口
060H
鍵盤輸入端口
3BCH~3BFH
并行口LPT1
061H
揚聲器(0, 1位)
3C0H~3CFH
VGA/EGA
200H~20FH
游戲控制口
3D0H~3DFH
CGA
278H~27FH
并行口LPT3
3F0H~3F7H
磁盤控制器
2F8H~2FFH
串行口COM2
3F8H~3FFH
串行口COM1
計算機在啟動時,BIOS程序(Basic Input/Output System)將檢查計算機系統中有哪些端口地址。當發現有串行端口地址時,BIOS就把 該端口存放在以地址40:00H開始的數據區內;當發現有并行端口地址時,BIOS會把它 存入以地址40:08H開始的數據區內。
每類端口有4個字的空間,對有二個串行口、二個并行口的計算機系統,其BIOS程序將得到如圖8.1所示的部分數據表。
圖中03F8H、02F8H、0378H和0278H分別為COM1、COM2、LPT1和LPT2的端口地址。
圖8.1 BIOS部分數據表
8.1.2 I/O指令
由于I/O端口地址和內存單元地址是相互獨立的,這些端口地址不能普通的訪問內存指令來訪問其信息,所以,在CPU的指令系統中就專門設置了I/O指令來存取I/O端口的信息。按功能分類來看,I/O指令應屬于數據傳送指令。
1、輸入指令IN
輸入指令IN的一般格式如下:
IN AL/AX, PortNo/DX
該指令的作用是從端口中讀入一個字節或字,并保存在寄存器AL或AX中。如果某輸入設備的端口地址在0~255范圍之內,那么,可在指令IN中直接給出,否則,要把該端口地址先存入寄存器DX中,然后在指令中由DX來給出其端口地址。
例如:
IN AL, 60H ;從端口60H讀入一個字節到AL中
IN AX, 20H ;把端口20H、21H按“高高低低”組成的字讀入AX
MOV DX, 2F8H
IN AL, DX ;從端口2F8H讀入一個字節到AL中
IN AX, DX ;把端口2F8H、2F9H按“高高低低”組成的字讀入AX
2、輸出指令OUT
輸出指令OUT的一般格式如下:
OUT PortNo/DX, AL/AX
該指令的作用是把寄存器AL或AX的內容輸出到指定端口。如果某輸出設備的端口地址在0~255范圍之內,那么,可在指令OUT中直接給出,否則,要把該端口地址先存入寄存器DX中,然后在指令中由DX來給出其端口地址。
例如:
OUT 61H, AL ;把AL的內容輸出到端口61H中
OUT 20H, AX ;把AX的內容輸出到端口20H、21H中
MOV DX, 3C0H
OUT DX, AL ;把AL的內容輸出到端口3C0H中
OUT DX, AX ;把AX的內容輸出到端口3C0H、3C1H中
有關字符串的輸入輸出指令,請見5.2.11節中的介紹。
8.2 中斷
在計算機系統中,引入中斷的最初目的是為了提高系統的輸入輸出性能。隨著計算機應用的發展,中斷技術也應用到計算機系統的許多領域,如:多道程序、分時系統、實時處理、程序監視和跟蹤等領域。
8.2.1 中斷的基本概念
下面只簡單介紹與匯編語言程序設計有關的中斷知識,使本章的知識具有一定完整性。有關中斷的詳細介紹可參閱《計算機組成原理》課程中的相關章節。
1、中斷和中斷源
所謂中斷就是CPU暫停當前程序的執行,轉而執行處理緊急事務的程序,并在該事務處理完后能自動恢復執行原先程序的過程。在此,稱引起緊急事務的事件為中斷源,稱處理緊急事務的程序為中斷服務程序或中斷處理程序。 計算機系統還根據緊急事務的緊急程度,把中斷分為不同的優先級,并規定:高優先級的中斷能暫停低優先級的中斷服務程序的執行。
計算機系統有上百種可以發出中斷請求的中斷源,但最常見的中斷源是:外設的輸入輸出請求,如:鍵盤輸入引起的中斷,通信端口接受信息引起的中斷等;還有一些計算機內部的異常事件,如:0作除數、奇偶校驗錯等。
CPU在執行程序時,是否響應中斷要取決于以下三個條件能否同時滿足:
(1)、有中斷請求;
(2)、允許CPU接受中斷請求;
(3)、一條指令執行完,下一條指令還沒有開始執行。
條件(1)是響應中斷的主體。除用指令INT所引起的軟件中斷之外,其它中斷請求信號是隨機產生的,程序員是無法預見的。
程序員可用程序部分地控制條件(2)是否滿足,即可用指令STI和CLI來允許或不允許CPU響應可屏蔽的外部中斷。而對于不可屏蔽中斷和內部中斷,CPU一定會響應它們的,程序員是無控制權的。CPU一定會執行這些中斷的中斷服務程序。
2、斷向量表和中斷服務程序
中斷向量表是一個特殊的線性表,它保存著系統所有中斷服務程序的入口地址(偏移量和段地址)。在微機系統中,該向量表有256個元素(0~0FFH),每個元素占4個字節,總共1K字節,其在內存中的存儲形式及其存儲內容如圖8.2所示。
圖8.2中的“中斷偏移量”和“中斷段地址”是指該中斷服務程序入口單元的“偏移量”和“段地址”。由此不難看出:假如中斷號為n,那么,在中斷向量表中存儲該中斷處理程序的入口地址的單元地址為:4n。
表8.2說明了前16個中斷向量表中列舉了部分常用的中斷號。
圖8.2 中斷向量表
表8.2 部分常用的中斷號及其含義
中斷號 含義 中斷號 含義
0 除法出錯 8 定時器
1 單步 9 鍵盤
2 非屏蔽中斷 A 未用
3 斷點 B COM2
4 溢出 C COM1
5 打印屏幕 D 硬盤(并行口)
6 未用 E 軟盤
7 未用 F 打印機
8.2.2 引起中斷的指令
中斷處理程序基本上是系統程序員編寫好的,是為操作系統或用戶程序服務的。為了在應用程序中使用中斷服務程序,程序員必須能夠在程序中有目的地安排中斷的發生。為此,指令系統提供了各種引起中斷的指令。
1、中斷指令INT
中斷指令INT的一般格式如下:
INT Imm
其中:立即數Imm是一個0~0FFH范圍內的整數。
指令執行的步驟:
◆、把標志寄存器壓棧,清除標志位IF和TF;
◆、把代碼段寄存器CS的內容壓棧,并把中斷服務程序入口地址的高字部分送CS;
◆、32位段,壓32位IP。
在該指令執行完后,CPU將轉去執行中斷服務程序。由于有了指令INT,程序員就能為滿足某種特殊的需要,在程序中有目的地安排中斷的發生,也就是說,該中斷不是隨機產生的,而是完全受程序控制的。
一般情況下,一個中斷可有很多不同的功能,每個功能都有一個唯一的功能號,所以,在安排中斷之前, 程序員還要決定需要該中斷的哪個功能,中斷的功能號都是由AH來確定的。有些中斷還需要其它參數,常用中斷的功能和參數如附錄3所列。
2、溢出指令INTO
當標志位OF為1時,引起中斷。該指令的格式如下:
INTO
該指令影響標志位:IF和TF。
8.2.3 中斷返回指令
當一個中斷服務程序執行完畢時,CPU將恢復被中斷的現場,返回到引起中斷的程序中。為了實現此項功能,指令系統提供了一條專用的中斷返回指令。該指令的格式如下:
IRET/IRETD
該指令執行的過程基本上是INT指令的逆過程,具體如下:
◆、從棧頂彈出內容送入IP;
◆、再從新棧頂彈出內容送入CS;
◆、再從新棧頂彈出內容送入標志寄存器;
對80386及其以后的CPU,指令IRETD從棧頂彈出32位內容送入EIP。
8.2.4 中斷和子程序的比較
中斷和子程序調用之間有其相似和不同之處。它們的工作過程非常相似,即:暫停當前程序的執行,轉而執行另一程序段,當該程序段執行完時,CPU都自動恢復原程序的執行。
如圖8.3所示。
圖8.3 中斷和子程序調用的工作過程
它們的主要差異有:
◆、 子程序調用一定是程序員在編寫源程序時事先安排好的,是可知的,而中斷是由中斷源根據自身的需要產生的,是不可預見的(用指令INT引起的中斷除外);
◆、 子程序調用是用CALL指令來實現的,但沒有調用中斷的指令,只有發出中斷請求的事件(指令INT是發出內部中斷信號,而不要理解為調用中斷服務程序);
◆、 子程序的返回指令是RET,而中斷服務程序的返回指令是IRET/IRETD。
◆、 在通常情況下,子程序是由應用系統的開發者編寫的,而中斷服務程序是由系統軟件設計者編寫的。
8.3. 中斷功能的分類
計算機系統有上百種中斷,若按中斷的性質來劃分,則系統中的中斷可分為:可屏蔽中斷和不可屏蔽中斷。對不可屏蔽中斷,程序員不能控制它,系統肯定會立即響應的,而對于可屏蔽中斷,匯編語言程序員可以通過指令CLI和STI來控制對它們的響應。
若按中斷源來劃分,則系統中的中斷又可分為:硬件中斷和軟件中斷。對于硬件中斷,程序員不能控制它,它們基本上是隨機產生的,而對于軟件中斷,匯編語言程序員可通過指令INT和INTO來有目的安排它們的。
下面主要介紹匯編語言程序員能控制的軟件中斷的功能及其使用方法,常用的這類中斷有:DOS功能調用(INT 21H)、BIOS中斷、硬件和外設的中斷等。
圖8.4給出了程序員可使用的各類中斷之間的層次關系。
圖8.4 各類系統中斷之間的層次關系
在用戶程序中,若直接通過端口來操作硬件或外設,那么,其處理過程沒有額外的多余工作,處理速度顯然是最快的,但這樣做,無疑使用戶程序具有了很大的局限性。硬件環境的改變將直接影響程序的正常運行。
若用戶程序通過調用DOS功能來實現其所需功能,那么,應用程序與低層硬件相距較遠,操作最終的對象需要經過中間環節,處理速度肯定受到一定的損失,但這種應用程序適應性強,應用范圍廣,對硬件的依賴性最小。
由于BIOS介于DOS和具體硬件之間,所以,調用BIOS的功能是一個很好的折中方案。程序員可在以下三種情況下考慮使用BIOS的功能:
1)、BIOS提供的功能,而DOS沒有提供該功能的情況;
2)、不能利用DOS功能調用的情況(可能因為某些具體應用的限制);
3)、基于處理速度的考慮,需要繞過DOS層的情況。
綜上所述,可以歸納出如下結論:使用中斷的層次越高,它與硬件設備相關程度就越低,處理速度也就越低,但用戶程序的適用范圍較廣。反之也然。
有了上面的結論,程序員可根據應用程序的要求、對硬件環境的熟悉程度等因素來選用不同層次的中斷。
8.3.1 鍵盤輸入的中斷功能
鍵盤輸入是絕大多數程序的主要輸入方式,學習和掌握有關鍵盤輸入中斷的使用方法對編寫交互式程序是非常重要的,也能更進一步理解計算機是如何接受鍵盤輸入的。
1、鍵盤緩沖區
鍵盤緩沖區是一個先進先出的環形隊列,其所占內存區域如下:
KBHead DW ? ;其內存地址為0000:041AH,緩沖區頭指針
KBTail DW ? ;其內存地址為0000:041CH,緩沖區尾指針
KBBuff DW 16 DUP(?) ;其內存地址為0000:041EH,該緩沖區的缺省長度為16個字
與鍵盤有關的其它地址請見附錄6之鍵盤地址。
鍵盤緩沖區是一個環形隊列,其性質與《數據結構》課程中對“環形隊列”所描述的性質完全一致。雖然緩沖區的本身長度為16個字,但出于判斷“對列滿”的考慮,它最多只能保存15個鍵盤信息。當緩沖區滿時,系統將不再接受按鍵信息,而會發出“嘟”的聲音,以示要暫緩按鍵。當KBHead=KBTail時,表示無鍵盤輸入。
2、鍵盤狀態字
在計算機鍵盤上除了可輸入各種字符(字母、數字和符號等)的按鍵之外,還有一些功能鍵(如:F1、F2、…等)、控制鍵(如:Ctrl、Alt、Shift等)、雙態鍵(如:Num Lock、Caps Lock等)和特殊請求鍵(如:Print Screen、Scroll Lock等)。
鍵盤中的控制鍵和雙態鍵是非打印按鍵,它們是起控制或轉換作用的。當使用者按下控制鍵或雙態鍵時,系統要記住其所按下的按鍵。為此,在計算機系統中,特意安排的一個字來標志這些按鍵的狀態,我們稱該字為鍵盤狀態字。
8.3.2 屏幕顯示的中斷功能
顯示器是一個重要的輸出設備,它通過顯示卡與計算機系統相連。顯示器的顯示屏通常稱之為屏幕,現在常用的顯示器有14"和17",常用的顯示分辨率為800×600或1024×768等。常用的顯示卡類型為VGA、SVGA、EVGA和TVGA等,顯示卡上也都帶有大量的顯示存儲器,能快速顯示精美的圖象。
1、顯示模式
計算機系統中的顯示器都有二種顯示方式:文本顯示方式和圖形顯示方式。在DOS操作系統環境下,其默認的顯示方式為文本顯示方式,而在Windows操作系統環境下,其顯示方式是圖形顯示方式,其絕大多數操作界面是以圖形界面的窗口形式出現的。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -