![第8章 輸入輸出方法 匯編語言程序設(shè)計 教學(xué)課件_第1頁](http://file4.renrendoc.com/view/d4222e66c9a22bb1bed79060db2587db/d4222e66c9a22bb1bed79060db2587db1.gif)
![第8章 輸入輸出方法 匯編語言程序設(shè)計 教學(xué)課件_第2頁](http://file4.renrendoc.com/view/d4222e66c9a22bb1bed79060db2587db/d4222e66c9a22bb1bed79060db2587db2.gif)
![第8章 輸入輸出方法 匯編語言程序設(shè)計 教學(xué)課件_第3頁](http://file4.renrendoc.com/view/d4222e66c9a22bb1bed79060db2587db/d4222e66c9a22bb1bed79060db2587db3.gif)
![第8章 輸入輸出方法 匯編語言程序設(shè)計 教學(xué)課件_第4頁](http://file4.renrendoc.com/view/d4222e66c9a22bb1bed79060db2587db/d4222e66c9a22bb1bed79060db2587db4.gif)
![第8章 輸入輸出方法 匯編語言程序設(shè)計 教學(xué)課件_第5頁](http://file4.renrendoc.com/view/d4222e66c9a22bb1bed79060db2587db/d4222e66c9a22bb1bed79060db2587db5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第8章輸入輸出方法
8.1輸入輸出的基本概念
8.2無條件方式輸入輸出
8.3查詢方式輸入輸出
8.4中斷方式輸入輸出
本章要點
習(xí)題八返回章目錄第8章輸入輸出方法返回章目錄8.1輸入輸出的基本概念
從第2章的圖2.1可以看到,計算機(jī)的硬件系統(tǒng)由CPU、內(nèi)存、外設(shè)三大部分構(gòu)成,它們相互之間通過一組信息傳遞的公共通道──總線聯(lián)系在一起的。CPU和內(nèi)存構(gòu)成了計算機(jī)的主機(jī)部分,是計算機(jī)中的高速設(shè)備。而大多數(shù)外部設(shè)備都是慢速設(shè)備,用來把從主機(jī)以外采集到的數(shù)據(jù)送入主機(jī)內(nèi)部,或者把主機(jī)內(nèi)的數(shù)據(jù)傳遞到外部,外設(shè)中的外部存儲器還可以存儲大量的數(shù)據(jù)。那么,CPU作為計算機(jī)的核心,它又是如何控制外設(shè)的呢?8.1輸入輸出的基本概念
8.1.1外設(shè)接口外部設(shè)備的種類繁多,功能各不相同,控制的方法也各式各樣。很多外設(shè)由于速度與信號的關(guān)系,無法直接連接在總線上與主機(jī)進(jìn)行數(shù)據(jù)交換,需要在系統(tǒng)總線與外設(shè)之間設(shè)置一個“適配器”,又稱為“接口”,用于把CPU來的控制命令轉(zhuǎn)換成外設(shè)的控制信號,把外設(shè)的工作情況轉(zhuǎn)換成CPU可以讀取并處理的狀態(tài)信號。接口部件擔(dān)負(fù)著總線信號與外設(shè)信號的轉(zhuǎn)接工作。它一頭與外設(shè)相連,能夠從外設(shè)接收數(shù)據(jù)或向外設(shè)發(fā)出信號,另一頭連接在系統(tǒng)總線上,能夠直接接收來自總線的數(shù)據(jù)和控制信號,或者在適當(dāng)?shù)臅r候往總線發(fā)送數(shù)據(jù)。8.1.1外設(shè)接口CPU能夠與內(nèi)存進(jìn)行數(shù)據(jù)交換,也可以與外設(shè)接口進(jìn)行數(shù)據(jù)傳遞,兩者工作的方式是非常相似的。從第2章的描述中我們已經(jīng)知道,CPU如果要從內(nèi)存讀或向內(nèi)存寫一個數(shù)據(jù),總是先在地址總線上發(fā)出地址信號,以選定操作對象,然后在控制總線上發(fā)出控制信號,通知操作對象完成什么樣的操作,數(shù)據(jù)總線則提供被交換的數(shù)據(jù)進(jìn)行傳遞的通道。CPU總是通過總線,以發(fā)送地址信號的方式選擇操作對象,對內(nèi)存對外設(shè)接口都是如此。所以,計算機(jī)系統(tǒng)中對內(nèi)存進(jìn)行了編號,就是內(nèi)存的物理地址,對外設(shè)接口也進(jìn)行了編號,這個號碼稱作“外設(shè)端口號”。每一個端口號對應(yīng)外設(shè)接口中的一個存放字節(jié)型數(shù)據(jù)的元件,稱為一個“外設(shè)端口”。一個外設(shè)接口中往往需要多個外設(shè)端口,占據(jù)多個外設(shè)端口號。CPU控制外設(shè)就是通過從這些外設(shè)端口中讀取數(shù)據(jù)以及向它們發(fā)送數(shù)據(jù)實現(xiàn)的。CPU能夠與內(nèi)存進(jìn)行數(shù)據(jù)交換,也可以與外設(shè)接在計算機(jī)內(nèi)外數(shù)據(jù)交換過程中,外設(shè)總是處于從屬狀態(tài),它受來自總線信號的控制,按控制命令的要求完成相應(yīng)的操作,并且可以從主機(jī)接收或向主機(jī)提供數(shù)據(jù)。所以大多數(shù)外設(shè)接口從功能上可以分為控制部件、狀態(tài)部件和數(shù)據(jù)部件三大組成部分??刂撇考址Q為命令部件,專用于接收來自主機(jī)的操作命令,并轉(zhuǎn)換成對外設(shè)的控制信號;狀態(tài)部件負(fù)責(zé)向主機(jī)轉(zhuǎn)達(dá)外設(shè)的當(dāng)前工作情況;數(shù)據(jù)部件是內(nèi)外數(shù)據(jù)交換的緩沖器,臨時存放需要傳遞的數(shù)據(jù)。在計算機(jī)內(nèi)外數(shù)據(jù)交換過程中,外設(shè)總是處于從屬通常,三大部件中的每個部件至少占據(jù)1個外設(shè)端口地址,每個端口都以字節(jié)為基本構(gòu)成單位,因而1個外設(shè)接口一般最少占用3個端口地址。但是,有些外設(shè)能夠接受的控制命令很少,只需要1字節(jié)中的1位或2位就夠了,這時可以用1個控制端口的8個位分別控制不同的外設(shè),把不同外設(shè)的接口集中在一起,共同占據(jù)一個外設(shè)端口號。另一方面,接口中的命令部件只用于接收控制命令,CPU對命令部件只寫不讀。狀態(tài)部件剛好相反,只用于向CPU提供狀態(tài)信息,CPU對它只讀不寫。因而有些接口把命令部件與狀態(tài)部件設(shè)計為共同占用1個外設(shè)端口號,由總線上的“讀”或“寫”信號區(qū)分究竟哪個部件是當(dāng)前的數(shù)據(jù)傳遞對象。通常,三大部件中的每個部件至少占據(jù)1個外設(shè)端8.1.28088的獨立編址方式無論是內(nèi)存還是外設(shè)端口,都是以字節(jié)為基本的數(shù)據(jù)單位。當(dāng)總線上出現(xiàn)有效的地址信號時,每個字節(jié)型內(nèi)存儲器或外設(shè)端口都能夠根據(jù)地址信號,判斷自己是否被選中為數(shù)據(jù)傳遞的對象(完成這種判斷的是地址譯碼器),沒有被選中的自動不參與本次總線上的數(shù)據(jù)傳遞。從這個角度說,只要為內(nèi)存和外設(shè)端口分別安排不同的地址,就可以從地址信號本身區(qū)分?jǐn)?shù)據(jù)傳遞的對象是內(nèi)存還是外設(shè)端口,從而把各個內(nèi)存字節(jié)與外設(shè)端口編排一套地址號碼,這種編排地址的方式稱為“統(tǒng)一編址”或“混合編址”。8.1.28088的獨立編址方式8088采用的是另一種編址方式。由于8088CPU在數(shù)據(jù)交換時除了能夠發(fā)出地址信號外,還有一根特別的信號線(IO/M)可以發(fā)出兩種不同的信號。當(dāng)這根信號線上發(fā)出高電位信號時,表示當(dāng)前總線上是外設(shè)操作;反之,這根信號線上是低電位時,表示當(dāng)前總線上是內(nèi)存操作。設(shè)計計算機(jī)系統(tǒng)時就可以利用這根信號線上的信號,區(qū)分操作對象是內(nèi)存還是外設(shè)。這時,各個內(nèi)存字節(jié)與外設(shè)端口可以分開編排兩套號碼,分別稱為內(nèi)存地址與外設(shè)地址。當(dāng)CPU需要讀寫數(shù)據(jù)時,同時發(fā)出地址信號和IO/M信號,這些信號一起送到地址譯碼器,地址信號選擇了具體的地址號碼,而IO/M信號則選擇內(nèi)存還是外設(shè)。這種把內(nèi)存和外設(shè)端口分開各自編址的方式稱為“獨立編址”。8088采用的是另一種編址方式。由于8088C
8.1.3控制外設(shè)的指令由于8088采取了獨立編址方式,就需要有特殊的指令控制對外設(shè)端口的操作。8088系統(tǒng)設(shè)計有兩條專用指令:IN和OUT?!局噶罡袷健縄Nd1,d2【功能】從d2指明的外設(shè)端口中讀取1字節(jié)或2字節(jié)數(shù)據(jù),送到操作數(shù)d1指出的地方?!菊f明】(1)8088系統(tǒng)限制d1只能是AL或AX。當(dāng)外設(shè)端口號不超過255時,d2操作數(shù)可直接寫端口號碼,是外設(shè)的直接尋址方式;端口號超過255時,必須先把端口號放在DX中,以DX作為d2操作數(shù),這是外設(shè)的間接尋址方式。8.1.3控制外設(shè)的指令(2)當(dāng)d1是AL時,該指令從指定的端口中讀1字節(jié)數(shù)據(jù);當(dāng)d1是AX時,CPU將從d2對應(yīng)的端口讀1字節(jié)數(shù)據(jù)到AL,從下一個端口號讀1字節(jié)數(shù)據(jù)到AH,即總共讀取16位數(shù)據(jù)送到AX中?!局噶罡袷健縊UTd1,d2【功能】把操作數(shù)d2指明的1字節(jié)或2字節(jié)數(shù)據(jù)送到d1對應(yīng)的外設(shè)端口中?!菊f明】(1)d2只能是AL或AX。當(dāng)外設(shè)端口號不超過255時,d1操作數(shù)可直接寫端口號碼;端口號超過255時,必須先把端口號放在DX中,以DX作為d1操作數(shù)。(2)當(dāng)d1是AL時,該指令從指定的端口中讀1字(2)當(dāng)d2是AL時,該指令把AL中的8位數(shù)據(jù)送往d1指定的外設(shè)端口;當(dāng)d2是AX時,該指令把AL中的8位數(shù)據(jù)送到d1對應(yīng)的端口,把AH中的8位數(shù)據(jù)送往下一端口,即把16位數(shù)據(jù)送到d1對應(yīng)的端口及下一端口中。IN和OUT指令專門用于外設(shè)操作,必須與內(nèi)存操作嚴(yán)格區(qū)分開。下面的例8.1用來說明IN、OUT指令與內(nèi)存操作的MOV指令之間的差別,并請讀者體會在數(shù)據(jù)傳遞期間IO/M信號的作用。(2)當(dāng)d2是AL時,該指令把AL中的8位數(shù)據(jù)送往【例8.1】說明下面各指令或程序段的功能。 (1)MOVDX,61H INAL,DX (2)MOVBX,61H MOVAL,[BX] (3)OUT21H,AL (4)MOVSI,21H MOV[SI],AL【例8.1】說明下面各指令或程序段的功能。【解】(1)先把立即數(shù)61H放到DX中,然后以DX中的61H作為外設(shè)端口號,從相應(yīng)的外設(shè)端口讀取1字節(jié)數(shù)據(jù)送到AL中。(2)先把立即數(shù)61H放到BX中,然后以BX中的61H作為偏移地址,以缺省段寄存器DS中的值為段地址,從相應(yīng)的內(nèi)存中取出1字節(jié)數(shù)據(jù)送到AL中。(3)把AL中的1字節(jié)數(shù)據(jù)送往21H號外設(shè)端口。(4)先把立即數(shù)21H放到SI中,然后以SI中的21H作為偏移地址,以缺省段寄存器DS中的值為段地址,把AL中的1字節(jié)數(shù)據(jù)送到相應(yīng)的內(nèi)存中。
【解】8.1.4輸入輸出方式外部設(shè)備是多種多樣的,不同的設(shè)備需要不同的控制方法。CPU與外設(shè)之間進(jìn)行數(shù)據(jù)傳遞時需要考慮外設(shè)的性能。對于多數(shù)慢速外設(shè)而言,如果CPU傳送來的數(shù)據(jù)速度太快,外設(shè)來不及處理,就可能造成數(shù)據(jù)丟失;如果外設(shè)還沒有準(zhǔn)備好數(shù)據(jù),CPU就已經(jīng)發(fā)出了讀操作命令,將讀不到正確的數(shù)據(jù)。因此,計算機(jī)系統(tǒng)進(jìn)行內(nèi)外數(shù)據(jù)交換時,必須根據(jù)外設(shè)的特點采用適當(dāng)?shù)男问健?偟膩碚f,主機(jī)與外設(shè)之間數(shù)據(jù)交換的方法有4種:無條件方式、查詢方式、中斷方式、DMA方式。8.1.4輸入輸出方式
1.無條件方式又稱為直接方式,是指CPU可在任何時刻直接以外設(shè)操作指令與外部設(shè)備進(jìn)行數(shù)據(jù)傳遞。顯然,這種方式對外設(shè)有很高的要求,它必須能像內(nèi)存一樣時刻準(zhǔn)備著與CPU進(jìn)行數(shù)據(jù)傳遞,并且能夠跟上CPU的速度,保證傳送的信息的正確性。
2.查詢方式使用查詢方式工作的外設(shè)必須至少有兩個部件,其中之一是狀態(tài)部件。CPU每一次與外設(shè)進(jìn)行數(shù)據(jù)交換之前,先從狀態(tài)部件讀取信息,判斷外設(shè)是否處于“就緒”(Ready)狀態(tài)。如果來自外設(shè)的狀態(tài)信息反映出外設(shè)“沒有準(zhǔn)備好”或正“忙”(Busy),說明還不能進(jìn)行數(shù)據(jù)傳遞;反之,當(dāng)CPU檢測到外設(shè)已準(zhǔn)備好(Ready)后,可以與外設(shè)進(jìn)行一次數(shù)據(jù)交換。1.無條件方式3.中斷方式這是指每當(dāng)外設(shè)準(zhǔn)備好、能夠進(jìn)行數(shù)據(jù)傳遞時,就向CPU發(fā)出一個特殊的請求信號,稱為中斷請求信號。CPU收到中斷請求后,暫停當(dāng)前的工作,轉(zhuǎn)而執(zhí)行一段預(yù)先設(shè)計好的中斷服務(wù)程序,完成對外設(shè)的數(shù)據(jù)交換。執(zhí)行完中斷服務(wù)程序后,CPU仍回到被暫停的程序繼續(xù)執(zhí)行。
4.直接存儲器存取DMA(DirectMemoryAccess)方式這是一種不通過CPU,在內(nèi)存與外設(shè)之間直接進(jìn)行高速數(shù)據(jù)交換的方法。通常,系統(tǒng)總線是在CPU的控制之下,CPU總是作為數(shù)據(jù)傳遞的一方,內(nèi)存與外設(shè)其中之一作為另一方。當(dāng)大量的數(shù)據(jù)需要傳遞時,在主機(jī)內(nèi)部,數(shù)據(jù)不3.中斷方式可能完全放在CPU中,只能放在內(nèi)存中。在CPU控制下進(jìn)行大量數(shù)據(jù)的傳遞,就必須把內(nèi)存中的數(shù)據(jù)讀到CPU中,然后再寫往外設(shè),或者反方向,先把數(shù)據(jù)從外設(shè)讀入CPU再寫往內(nèi)存??梢?,數(shù)據(jù)必須以CPU作為過渡,才能到達(dá)它的目的地。DMA方式正是避免了這種過渡,讓數(shù)據(jù)不經(jīng)過CPU,直接從內(nèi)存送到外設(shè),或者反之。進(jìn)行DMA方式的數(shù)據(jù)傳遞必須有一個前提條件,就是CPU能夠讓出總線的控制權(quán),交由DMA方式數(shù)據(jù)傳遞的專用控制器控制,當(dāng)數(shù)據(jù)傳遞結(jié)束后,CPU再收回總線控制權(quán)。8088CPU支持這樣的總線操作方式,因而8088系統(tǒng)可以進(jìn)行DMA方式的數(shù)據(jù)傳遞。可能完全放在CPU中,只能放在內(nèi)存中。在CPU控制下進(jìn)行大量DMA控制器專門用于控制內(nèi)存與外設(shè)之間的直接數(shù)據(jù)傳遞,但是它沒有數(shù)據(jù)處理能力。在一些計算機(jī)系統(tǒng)中還設(shè)計有帶有處理能力的專用數(shù)據(jù)傳送芯片,其工作方式與DMA方式很相似,也需要CPU在適當(dāng)?shù)臅r候讓出總線供其使用,這種數(shù)據(jù)傳遞方式稱為“專用處理機(jī)方式”。8088微型計算機(jī)不使用處理機(jī)方式進(jìn)行數(shù)據(jù)傳遞,DMA方式需要涉及計算機(jī)硬件的內(nèi)容過多,所以本書都不做詳細(xì)介紹。DMA控制器專門用于控制內(nèi)存與外設(shè)之間的直接系統(tǒng)總線端口61H:P7P6P5P4P3P2P1P0 1.193MHz定時器AB與門放大電路揚(yáng)聲器圖8.1揚(yáng)聲器與系統(tǒng)總線的連接8.2無條件方式輸入輸出計算機(jī)系統(tǒng)中的揚(yáng)聲器是一種簡單的輸出設(shè)備,可以隨時從CPU接收控制命令。圖8.1是揚(yáng)聲器的連接原理圖。系統(tǒng)總線端口61H:P7P6P5P4P3揚(yáng)聲器發(fā)聲的基本原理是振動。揚(yáng)聲器口上的一層薄膜在電信號控制下往復(fù)振動產(chǎn)生聲音,每秒鐘振動的次數(shù)就是所發(fā)出的聲音的頻率,振動的幅度決定聲音的強(qiáng)度。由于控制揚(yáng)聲器的信號是二進(jìn)制的開關(guān)信號,不能對流過揚(yáng)聲器的電流的大小進(jìn)行控制,因而不能控制揚(yáng)聲器薄膜的振幅,所以小揚(yáng)聲器只能發(fā)出固定強(qiáng)度的聲音。但開關(guān)信號變化的頻率是可控的,CPU正是通過控制開關(guān)信號的頻率,讓揚(yáng)聲器發(fā)出不同頻率的聲音。揚(yáng)聲器發(fā)聲的基本原理是振動。揚(yáng)聲器口上的一層薄由圖8.1可以看到,控制揚(yáng)聲器的信號有兩個來源,它們通過與門之后送往放大電路并控制揚(yáng)聲器發(fā)聲。系統(tǒng)中的61H號端口是一個可讀寫的外設(shè)端口,能夠存放一字節(jié)數(shù)據(jù),其中的最低兩位就用來控制送往小揚(yáng)聲器的兩個信號源。最低位P0為0可以保證送往與門A輸入端的信號為高電位,這時只需要交替變化次低位P1的值,控制與門的另一個輸入端B端的信號即可。除此之外,還要控制P1變化的頻率,比如要讓揚(yáng)聲器發(fā)出500?Hz的聲音,就是要使P1位上的信號每秒鐘變化500次,即每0.002秒是一個變化周期,因而要讓P1位維持高電位(即置P1位為1)0.001秒,然后變成低電位,再維持0.001秒,如此交替變化。而發(fā)聲時間則通過控制P1位交替變化的次數(shù)來掌握,比如讓揚(yáng)聲器在1秒鐘內(nèi)保持發(fā)出500?Hz的聲音,就要讓P1位交替變化500次。由圖8.1可以看到,控制揚(yáng)聲器的信號有兩個來控制時間并不是件容易的事。如果要準(zhǔn)確控制時間,可以參照微機(jī)原理中有關(guān)定時器的內(nèi)容,采用后面說明的中斷方式。在此只是為了說明直接數(shù)據(jù)傳送的原理,故簡化時間控制的方法,采用循環(huán)延遲的方式實現(xiàn)。需要說明的是,例8.2的程序雖然可以在各種檔次的PC機(jī)上運(yùn)行,但發(fā)出的聲音頻率有可能不一樣。這是因為不同檔次的機(jī)器執(zhí)行循環(huán)延遲所花費(fèi)的時間不同,而程序本身就是利用這個延遲來控制音頻的??刂茣r間并不是件容易的事。如果要準(zhǔn)確控制時間,【例8.2】利用無條件數(shù)據(jù)傳送方式,讓計算機(jī)的揚(yáng)聲器在1秒鐘內(nèi)保持發(fā)出500Hz的聲音?!窘狻客暾某绦蛉缦拢篸elnum=14000staSEGMENTSTACKDW1024DUP(0)staENDScodeSEGMENTASSUMECS:code,SS:sta【例8.2】利用無條件數(shù)據(jù)傳送方式,讓計算機(jī)的揚(yáng)聲delayPROCNEAR;時間延遲子程序,以CX中的值作為PUSHAX;循環(huán)次數(shù),做若干次的乘法產(chǎn)生時PUSHDX;間延遲的效果del:IMULAX;用乘法指令延遲,執(zhí)行時間較長LOOPdelPOPDXPOPAXRETdelayENDPmain:MOVCX,500sou:PUSHCXdelayPROCNEAR;時間 INAL,61H;讀出原61H端口的數(shù)據(jù)ANDAL,11111100B;清最低兩位OUT61H,AL;送低電位到P1MOVCX,delnum;取控制延遲時間的循環(huán)次數(shù)值CALLdelayINAL,61HORAL,00000010B;置P1位為1OUT61H,ALMOVCX,delnum
INAL,61HCALLdelayPOPCXLOOPsouMOVAX,4C00HINT21HcodeENDSENDmain從這個例子可以看出,對揚(yáng)聲器的控制是不需要任何條件的,程序中在向61H號端口送數(shù)據(jù)時根本不考慮揚(yáng)聲器是否準(zhǔn)備好、是否可接收數(shù)據(jù)等問題。由端口61H到放大電路構(gòu)成了揚(yáng)聲器的接口電路,該接口以系統(tǒng)總線上送來的信號驅(qū)動薄膜的振動,按無條件方式進(jìn)行數(shù)據(jù)傳送。CALLdelay8.3查詢方式輸入輸出大多數(shù)外設(shè)不可能像揚(yáng)聲器那樣工作,這些外設(shè)處理數(shù)據(jù)的速度和提供數(shù)據(jù)的速度往往比主機(jī)內(nèi)部速度慢得多,因而CPU與這類設(shè)備進(jìn)行數(shù)據(jù)傳遞前必須先判斷它們是否“就緒”。CPU以查詢方式從外設(shè)讀取一批數(shù)據(jù),以及向外設(shè)送出一批數(shù)據(jù)的流程如圖8.2所示。8.3查詢方式輸入輸出Y讀狀態(tài)端口 Ready?處理完?NYN向數(shù)據(jù)端口寫一個數(shù)據(jù)或向命令端口發(fā)一個操作命令(b)查詢方式輸出操作流程(a)查詢方式輸入操作流程讀狀態(tài)端口 Ready?從數(shù)據(jù)端口讀一個數(shù)據(jù)處理完?NYNYY讀狀態(tài)端口 Ready?處理完?NYN向數(shù)據(jù)端口寫打印機(jī)是一種可以按查詢方式工作的輸出外設(shè),它與主機(jī)連接的接口部件是打印機(jī)適配器,也就是平常所說的“標(biāo)準(zhǔn)并行接口”或“并口”。打印機(jī)接口中的三大部件齊備,它們各自占據(jù)一個外設(shè)端口號碼,分別是:數(shù)據(jù)部件──378H;狀態(tài)部件──379H;控制部件──37AH。狀態(tài)端口各位的含義如下:BusyACKPESELECTERROR
D7 D6 D5 D4 D3 D2 D1D0打印機(jī)是一種可以按查詢方式工作的輸出外設(shè),它(1)D7位:是打印機(jī)的“忙”信號。這一位為0表示打印機(jī)當(dāng)前正處于“忙”狀態(tài),為1表示打印機(jī)不忙。(2)D6位:是打印機(jī)送回的認(rèn)可信號。當(dāng)打印機(jī)從接口中正確接收1字節(jié)數(shù)據(jù)后,就送回一個低電位的認(rèn)可信號,這個信號只維持很短的時間,然后又恢復(fù)高電位。(3)D5位:缺紙信號。這一位為1表示打印機(jī)無紙,因而無法打印,為0時表示正常工作。(4)D4位:聯(lián)機(jī)信號。這一位為1表示正處于聯(lián)機(jī)工作狀態(tài),為0表示沒有聯(lián)機(jī),這時不能工作。(5)D3位:出錯信號。為0表示打印機(jī)內(nèi)部出現(xiàn)錯誤,不能工作,為1則正常。(1)D7位:是打印機(jī)的“忙”信號。這一位為0表示控制端口各位的含義如下:INTSELECTINITAutoFeedSTBD7D6 D5 D4 D3 D2 D1 D0
(1)D4位:允許中斷信號。將該位置1,允許打印機(jī)以中斷方式工作,為0則不允許。(2)D3位:聯(lián)機(jī)命令。置1將設(shè)置打印機(jī)的聯(lián)機(jī)工作方式,控制打印機(jī)時總是把這一位置1,否則打印機(jī)不能正常工作。打印機(jī)正常打印時這一位需要保持1??刂贫丝诟魑坏暮x如下:INTSELECTINITAuto(3)D2位:初始化信號。正常工作時總是把這一位置1,需要把打印機(jī)重新初始化時,則在這一位先清0再置1,并且要維持清0的時間0.05秒以上。初始化又稱作打印機(jī)復(fù)位,復(fù)位時可觀察到的現(xiàn)象是打印頭回到最左邊。(4)D1位:自動走紙。置1要求打印機(jī)在打印完一行后(回車時)自動走紙,清0時則需要向打印機(jī)輸出換行符(0AH)控制走紙。這一位通常被置為0。(5)D0位:選通信號。CPU通過在這一位上先置1再清0,通知打印機(jī)從數(shù)據(jù)部件中取走一字節(jié)數(shù)據(jù)并打印。把圖8.2中查詢輸出的流程稍做修改,可以作為控制打印機(jī)以查詢方式工作的程序流程,如圖8.3所示。(3)D2位:初始化信號。正常工作時總是把這一位置計數(shù)器清0讀狀態(tài)端口Ready?送數(shù)據(jù)到數(shù)據(jù)端口送先高后低的STB信號打印完?計數(shù)器加1,取下一數(shù)據(jù)NYYN結(jié)束圖8.3查詢方式控制打印機(jī)計數(shù)器清0讀狀態(tài)端口Ready?送數(shù)據(jù)到數(shù)據(jù)端口送先【例8.3】控制打印機(jī)以查詢方式工作,打印26個英文字母,共打印30行?!窘狻縮taSEGMENTSTACKDB1024DUP(0)staENDSdataSEGMENTprintDB'abcdefghijklmnopqrstuvwxyz',0DH,0AHdataENDScodeSEGMENTASSUMECS:code,SS:sta,DS:data【例8.3】控制打印機(jī)以查詢方式工作,打印26initPROCNEAR;打印機(jī)初始化程序MOVDX,37AHMOVAL,08HOUTDX,ALMOVCX,1000init1:LOOPinit1;延遲,維持初始化信號一段時間MOVAL,0CHOUTDX,AL;結(jié)束初始化,保持聯(lián)機(jī)RETinitENDPinitPROCNEARstart:MOVAX,dataMOVDS,AXMOVCX,30;30行again:LEABX,print;待打印字符串首地址存放于BX中next:MOVDX,379Hwait:INAL,DXTESTAL,80HJZwait;打印機(jī)忙,轉(zhuǎn)去再讀狀態(tài)端口DECDX;數(shù)據(jù)端口號MOVAL,[BX]OUTDX,AL;送數(shù)據(jù)到數(shù)據(jù)端口暫存MOVDX,37AHMOVAL,0DHstart:MOVAX,dataOUTDX,AL ;置STB信號為1 DECALOUTDX,AL;置STB信號為0CMPBYTEPTR[BX],0AHJZnewlineINCBXJMPnextnewline:LOOPagainMOVAX,4C00HINT21HcodeENDSENDstartOUTDX,AL ;置S8.4中斷方式輸入輸出把例8.3的程序拿到計算機(jī)上去執(zhí)行,可以發(fā)現(xiàn)從鍵盤上發(fā)出程序執(zhí)行命令后,光標(biāo)會停在命令的下一行閃爍,并且打印機(jī)開始工作,直到打印機(jī)打印完所有內(nèi)容后才會出現(xiàn)系統(tǒng)提示符。也就是說,在打印期間,系統(tǒng)是不能做其它事情的。分析一下例8.3的程序可以發(fā)現(xiàn),它是讓高速的CPU去適應(yīng)低速的打印機(jī),讓CPU反復(fù)不停地查問打印機(jī)的狀態(tài),直到打印機(jī)準(zhǔn)備好。由于兩者的速度差很大,很可能會出現(xiàn)CPU查問成千上萬次以后才能等到打印機(jī)準(zhǔn)備好的信號,送出1個字節(jié)的數(shù)據(jù)。顯然,這種數(shù)據(jù)傳遞方式的效率是極低的。8.4中斷方式輸入輸出設(shè)想讓CPU把反復(fù)查問的時間利用起來去做別的事情,而讓打印機(jī)在準(zhǔn)備好接收一個數(shù)據(jù)時就向CPU發(fā)出一個信號。當(dāng)CPU接到這個信號時,暫時停止正在執(zhí)行的工作,以很短的時間為打印機(jī)送出下一個數(shù)據(jù),然后恢復(fù)原工作。這樣,盡管打印的速度并沒有提高,但把高性能的CPU解放出來,可以做其它的事情,從而提高了整個系統(tǒng)的工作效率。中斷式數(shù)據(jù)傳遞正是基于這種思想。設(shè)想讓CPU把反復(fù)查問的時間利用起來去做別的8.4.1中斷的基本概念
1.中斷CPU暫停正在執(zhí)行的程序,轉(zhuǎn)去完成另一件工作,完成后再回到原來的程序繼續(xù)執(zhí)行的現(xiàn)象稱為中斷。
2.中斷源能夠?qū)е翪PU中斷的事件稱為中斷源。如果引發(fā)中斷的事件來自CPU的內(nèi)部,這樣的中斷源稱為內(nèi)中斷源,比如CPU執(zhí)行了一個會產(chǎn)生溢出的除法操作,就會產(chǎn)生一個內(nèi)部中斷。如果是由CPU外部的信號引發(fā)中斷,這種中斷源稱為外中斷源,打印機(jī)申請中斷就是一種外中斷源。8.4.1中斷的基本概念3.中斷源分類按照引發(fā)中斷的中斷源的位置不同,8088系統(tǒng)把中斷源分為內(nèi)中斷源和外中斷源兩大類。來自CPU內(nèi)部的中斷請求是內(nèi)中斷源,8088系統(tǒng)的內(nèi)中斷源有除法溢出、執(zhí)行中斷指令和單步中斷(CPU每執(zhí)行一條指令都產(chǎn)生一次的中斷請求,主要用于程序的調(diào)試)。外中斷源是來自CPU芯片外的中斷請求信號,8088芯片有兩個引腳可以接收外中斷請求信號,分別是NMI和INTR,并且8088對這兩個引腳上的中斷請求信號的處理方式不太一樣。根據(jù)中斷信號來自哪一個引腳,外中斷源又再分為兩類:把中斷請求信號通過NMI引腳送往CPU的中斷源稱為不可屏蔽外中斷源,INTR上的則稱為可屏蔽外中斷源。也可以按產(chǎn)生中斷請求的方式不同,把中斷源分為軟件中斷源和硬件中斷源,由它們導(dǎo)致的中斷又分別稱為軟中斷和硬中斷。除法溢出中斷、單步中斷是內(nèi)中斷源中的硬中斷源,外中斷源都是硬中斷源。軟中斷則是由指令系統(tǒng)中的中斷指令導(dǎo)致的中斷。3.中斷源分類4.中斷號在計算機(jī)系統(tǒng)中,各種中斷源都被統(tǒng)一地編排了一個互不相同的號碼,用以唯一地標(biāo)識一個中斷源,這個號碼稱為中斷號。在8088系統(tǒng)中,中斷號的有效范圍是0到255。常用的中斷號與中斷源的對應(yīng)關(guān)系見表8.1。5.中斷源識別由于中斷源有不同的類型,向CPU申請中斷的方式也各不相同。當(dāng)CPU知道有中斷請求后,還必須判斷出究竟是幾號中斷請求。CPU確定中斷號的過程稱為中斷源識別。如果中斷請求來自CPU內(nèi)部,CPU內(nèi)有相應(yīng)機(jī)制可以取到內(nèi)中斷請求的中斷號;如果是不可屏蔽外中斷請求,系統(tǒng)只安排了唯一的中斷號(2號);當(dāng)中斷請求來自CPU的INTR外引腳時,情況就比較復(fù)雜了。4.中斷號
6.中斷優(yōu)先級由于8088共支持256個中斷源,尤其是包括若干硬中斷源,各種中斷源就有同時提出中斷請求的可能。當(dāng)多個中斷申請同時送到8088時,CPU必須能分別輕重緩急妥善處理。CPU分辨各中斷源優(yōu)先次序的方式是預(yù)先把所有中斷源進(jìn)行分級,稱為中斷優(yōu)先級。當(dāng)CPU遇到同時有兩個或兩個以上的中斷申請時,就按它們的優(yōu)先級次序,先為級別最高的中斷源服務(wù)。6.中斷優(yōu)先級8088把所有中斷源劃分為4個等級,以0級為最高,依次降低等級。各中斷源的等級劃分情況是:0級──除單步中斷以外的內(nèi)中斷源;1級──不可屏蔽外中斷源;2級──可屏蔽外中斷源;3級──單步中斷。不同級別中的兩個中斷源同時申請中斷時,CPU可以根據(jù)級別高低決定服務(wù)的先后次序。但同級中的兩個中斷源同時申請又如何處理呢?在0級中斷源中,所有中斷源由CPU執(zhí)行指令產(chǎn)生的,只有執(zhí)行DIV或IDIV指令時才有可能產(chǎn)生08088把所有中斷源劃分為4個等級,以0級為號中斷請求,執(zhí)行一條中斷指令只能產(chǎn)生一個中斷號,而CPU在任何時刻只能執(zhí)行一條指令,所以不可能同時有兩個或兩個以上的0級中斷請求。1級與3級中斷源分別各有一個,不涉及同時產(chǎn)生中斷請求的問題,只有2級比較麻煩。所有可屏蔽外中斷源都處于中斷優(yōu)先級中的2級,這些外中斷源都必須通過CPU的INTR引腳向CPU提出中斷申請,如果它們當(dāng)中出現(xiàn)同時申請的現(xiàn)象,將由中斷控制器處理。在8088系統(tǒng)中,中斷控制器可以把它管轄的所有可屏蔽外中斷源再進(jìn)行內(nèi)部分級,當(dāng)同時出現(xiàn)多個中斷申請時,由中斷控制器判別相互間優(yōu)先級的高低,并把其中最高級別的可屏蔽中斷請求通過INTR送達(dá)CPU。號中斷請求,執(zhí)行一條中斷指令只能產(chǎn)生一個中斷號,而CPU在任7.中斷屏蔽如果某個中斷源發(fā)出中斷請求后,CPU置之不理,繼續(xù)完成自己的工作,這種現(xiàn)象稱為中斷屏蔽。8088系統(tǒng)中對各種中斷分類處理,0級和1級中斷是不能被屏蔽的,當(dāng)CPU收到0級或1級中斷請求時,必須立刻放下正在執(zhí)行的程序進(jìn)行中斷處理;但2級或3級中斷就有被屏蔽的可能。3級中斷是否屏蔽由標(biāo)志寄存器中的TF標(biāo)志位決定,當(dāng)TF=0時,CPU將不響應(yīng)單步中斷請求。指令系統(tǒng)中沒有專門指令可以直接針對TF標(biāo)志位操作,但可以通過PUSHF和POPF指令達(dá)到修改TF值的目的。2級中斷是否屏蔽受兩個方面的控制:一是標(biāo)志寄存器的IF標(biāo)志位,如果IF=0,所有的2級中斷源都被屏蔽;另一個可控制2級中斷屏蔽的是中斷控制器,中斷控制器是作為8088系統(tǒng)的一個外設(shè),CPU可以通過命令的形式通知中斷控制器屏蔽掉幾號中斷請求,這種方式可以只屏蔽2級中斷源中的某幾個而不是屏蔽所有2級中斷。7.中斷屏蔽8.中斷服務(wù)程序CPU響應(yīng)中斷就是暫停正在執(zhí)行的程序,轉(zhuǎn)而為中斷源進(jìn)行相應(yīng)的服務(wù),稱為中斷服務(wù)。中斷服務(wù)當(dāng)然是通過執(zhí)行一段程序來實現(xiàn)的。CPU響應(yīng)某個中斷時去執(zhí)行的程序稱為“中斷服務(wù)程序”或“中斷處理程序”。顯然,如果要系統(tǒng)正常工作,中斷服務(wù)程序就必須長期保存在內(nèi)存中,保證CPU隨時可以執(zhí)行它。CPU在兩種情況下會轉(zhuǎn)去執(zhí)行中斷服務(wù)程序,一是正在執(zhí)行的程序中遇到了一條中斷指令(INT指令),二是硬中斷源產(chǎn)生了中斷請求且沒有被屏蔽。第二種情況是由硬件中斷源引起的中斷,也就是說,不需要CPU去執(zhí)行什么專用指令,只要出現(xiàn)沒被屏蔽的硬中斷申請,就會導(dǎo)致CPU去執(zhí)行相應(yīng)的中斷服務(wù)程序。8.中斷服務(wù)程序各個中斷源都對應(yīng)地有自己的中斷服務(wù)程序,當(dāng)機(jī)器啟動完成后,這些中斷服務(wù)程序是操作系統(tǒng)或ROMBIOS中的程序段。這些中斷服務(wù)程序也是可以修改的,只要用戶程序能夠把一段程序長期保留在內(nèi)存中(即常駐內(nèi)存),并且通知CPU這就是某個中斷的中斷服務(wù)程序。各個中斷源都對應(yīng)地有自己的中斷服務(wù)程序,當(dāng)機(jī)器
9.中斷向量既然每個中斷服務(wù)程序都放在內(nèi)存中,當(dāng)然就有其入口地址,這樣,當(dāng)CPU響應(yīng)中斷時才能知道轉(zhuǎn)到哪里去執(zhí)行中斷服務(wù)程序。入口地址是一個完整的邏輯地址,包括16位的段地址和16位的偏移地址,由總共32位數(shù)據(jù)構(gòu)成,需要占據(jù)4個字節(jié)的存儲空間。把中斷服務(wù)程序的入口地址的各個字節(jié)按照一定的規(guī)則排列起來,構(gòu)成的一個有特定含義的數(shù)據(jù)組合稱為“中斷向量”或“中斷矢量”。8088系統(tǒng)規(guī)定其中斷服務(wù)程序入口地址的4個字節(jié)的排列規(guī)則是:(偏移地址低字節(jié),偏移地址高字節(jié),段地址低字節(jié),段地址高字節(jié))為了說明的方便,中斷向量通常都用十六進(jìn)制書寫。比如某中斷服務(wù)程序的入口地址在F000:EF05處,表示成中斷向量就是:(05,EF,00,F0)9.中斷向量10.中斷向量表8088系統(tǒng)中共有256個中斷源,每個中斷源都有自己的中斷向量,把所有這些中斷向量集中起來,按照中斷號由0到255的順序,從內(nèi)存物理地址為0處開始依次存放,構(gòu)成一張“中斷向量表”。每個計算機(jī)系統(tǒng)的中斷向量表都有自己固定的位置和長度,8088系統(tǒng)是把這張表放在內(nèi)存的最低端,共占用1024個字節(jié)。圖8.4是中斷向量表的示意圖。10.中斷向量表00000 0號中斷服務(wù)程序偏移地址低字節(jié)00001 0號中斷服務(wù)程序偏移地址高字節(jié)00002 0號中斷服務(wù)程序段地址低字節(jié)000030號中斷服務(wù)程序段地址高字節(jié)000041號中斷服務(wù)程序偏移地址低字節(jié)00005 1號中斷服務(wù)程序偏移地址高字節(jié)00006 1號中斷服務(wù)程序段地址低字節(jié)00007 1號中斷服務(wù)程序段地址高字節(jié)000082號中斷服務(wù)程序偏移地址低字003FF0FFH號中斷服務(wù)程序段地址高字節(jié)…00000 0號中斷服務(wù)程序偏移地址低字節(jié)00001 11.中斷嵌套在CPU執(zhí)行一個低級別的中斷服務(wù)程序時,如果系統(tǒng)中又產(chǎn)生了一個高級別的中斷請求,這時系統(tǒng)會暫停低級中斷服務(wù),優(yōu)先處理高級別中斷,處理完后再繼續(xù)低級中斷服務(wù)。這種高級別中斷打斷低級別中斷服務(wù)的現(xiàn)象稱為中斷嵌套。中斷嵌套的典型例子是,在一個中斷服務(wù)程序中,需要在屏幕上顯示一些信息,屏幕顯示需要用到后面將要說明的10H號中斷調(diào)用,因此在中斷服務(wù)程序中就會寫有INT10H指令。這是一條內(nèi)中斷調(diào)用指令,是最高級別的中斷,在執(zhí)行到該指令時,系統(tǒng)會轉(zhuǎn)去先進(jìn)行10H號中斷服務(wù),在屏幕上進(jìn)行顯示,10H號中斷返回后,再繼續(xù)原先低級別的中斷服務(wù)。11.中斷嵌套
8.4.2中斷處理過程不論是軟中斷還是硬中斷,當(dāng)CPU響應(yīng)中斷時,自動完成下列操作:(1)取中斷號n(中斷源識別)。(2)把標(biāo)志寄存器(PSW)的內(nèi)容入棧。(3)當(dāng)前CS的值入棧。(4)當(dāng)前IP的值入棧。(5)把標(biāo)志寄存器中的IF和TF標(biāo)志位清0。(6)從物理地址4×n處取出4個字節(jié)的n號中斷的中斷向量,設(shè)取出的數(shù)據(jù)依次是b0、b1、b2、b3,把(b1,b0)拼成一個字型數(shù)據(jù)送到IP中,(b3,b2)拼成一個字型數(shù)據(jù)送到CS中。8.4.2中斷處理過程(7)按CS:IP的新值繼續(xù)執(zhí)行。這些操作是由硬件自動完成的,是CPU響應(yīng)中斷這一過程中密不可分的幾個步驟,不能把它們拆開來,理解作依次執(zhí)行幾條指令的結(jié)果。響應(yīng)中斷的過程中,有三個字型數(shù)據(jù)被入棧保護(hù),其中包括CS和IP。CS與IP的專職就是存放下一條指令的邏輯地址,它們的值被入棧保護(hù),就意味著將來可以從棧中取出保存的值,恢復(fù)被中斷的程序繼續(xù)執(zhí)行,就像子程序調(diào)用與返回一樣。響應(yīng)過程中的第(6)個操作是把CS和IP修改為n號中斷向量的值,也就是把CS和IP改為n號中斷服務(wù)程序的入口地址,繼而轉(zhuǎn)入中斷服務(wù)程序執(zhí)行。當(dāng)中斷服務(wù)完成后,在服務(wù)程序的最后有一條特別的指令I(lǐng)RET作為結(jié)束。該指令將把中斷時入棧保存的三個字型數(shù)據(jù)分別恢復(fù)到原出處,使CPU從中斷服務(wù)程序轉(zhuǎn)回到中斷時的程序繼續(xù)執(zhí)行。(7)按CS:IP的新值繼續(xù)執(zhí)行。
8.4.3與中斷有關(guān)的指令在中斷的有關(guān)概念描述中多次提到軟中斷是CPU執(zhí)行中斷指令時產(chǎn)生的中斷,除了中斷指令外,中斷服務(wù)程序結(jié)束時也需要執(zhí)行一條特殊的指令,以告訴CPU中斷服務(wù)到此為止。關(guān)于2級中斷的屏蔽標(biāo)志位IF還有兩條專用指令,分別說明如下?!局噶罡袷健縄NTn【功能】產(chǎn)生一次n號中斷請求。由于這是中斷指令,屬于內(nèi)中斷,具有最高級別,CPU必然響應(yīng),因此該指令將導(dǎo)致一次n號中斷處理過程。具體的操作見8.4.2節(jié)中的中斷響應(yīng)時硬件自動完成的動作。8.4.3與中斷有關(guān)的指【說明】(1)指令格式中的n是一個立即數(shù),用以代表中斷號,有效范圍是0到255。(2)這是一條放在用戶程序中的指令,與隨時可能發(fā)生的硬件中斷不同,這是程序員有意識地安排在程序中的一個中斷,因而程序員很清楚這個中斷指令執(zhí)行的效果。這樣使用的中斷,其服務(wù)程序往往是系統(tǒng)預(yù)先編寫好的一些專用子程序,完成一些特定的服務(wù)功能,供用戶程序使用,就比如DOS提供的服務(wù)程序讓用戶程序以INT?21H指令去調(diào)用一樣。這類程序段與子程序不同的是,它們在系統(tǒng)啟動時就已進(jìn)入內(nèi)存中,不需要像子程序那樣與調(diào)用它的程序相聯(lián)接。因此,習(xí)慣上又把這類程序段稱為中斷服務(wù)子程序,當(dāng)作子程序一樣使用,只是調(diào)用方式不同而已。【說明】(3)指令格式中的n只要求在0到255之間,沒有其它的限制。也就是說,不論是哪一個中斷源,包括應(yīng)該由硬件引起的外中斷源,只要知道它的中斷號,就可以用一條INT指令產(chǎn)生一次中斷調(diào)用。但對硬件中斷對應(yīng)的0號、8號到0FH號,以及70H到77H號,用INT指令去調(diào)用可能產(chǎn)生一些意想不到的結(jié)果,也有可能造成死機(jī)?!局噶罡袷健縄RET【功能】從棧中彈出3個字,第1個彈出的送到IP,第2個到CS,第3個到PSW。(3)指令格式中的n只要求在0到255之間,沒有【說明】這是專門為中斷服務(wù)程序設(shè)計的一條指令,通常是中斷服務(wù)程序的最后一條指令,它的功能與中斷響應(yīng)時硬件自動完成的動作相對應(yīng),從而保證不論是硬中斷還是軟中斷,在中斷服務(wù)結(jié)束后,CPU都能回到正確的位置繼續(xù)執(zhí)行。【指令格式】CLI【功能】把標(biāo)志寄存器的IF標(biāo)志位清0,使CPU不響應(yīng)可屏蔽外中斷?!局噶罡袷健縎TI【功能】把標(biāo)志寄存器的IF標(biāo)志位置1,允許CPU響應(yīng)可屏蔽外中斷。【說明】這是專門為中斷服務(wù)程序設(shè)計的一條指令,通常是中CLI與STI指令總是配合使用,使得計算機(jī)系統(tǒng)在某一段時間內(nèi)不響應(yīng)任何可屏蔽外中斷請求。CLI是屏蔽掉所有2級中斷的簡單方法,但在應(yīng)用時請小心,如果用戶程序執(zhí)行過程中屏蔽了所有2級中斷,將使得系統(tǒng)不能從鍵盤、鼠標(biāo)等輸入設(shè)備上接收數(shù)據(jù),這將使操作人員失去對機(jī)器的控制。所以,總是在屏蔽2級中斷一段時間以后再把它打開。在程序中屏蔽中斷的一個很好的理由,是不想要自己的程序在需要連續(xù)執(zhí)行時被硬件服務(wù)打斷,這通常是用在程序中需要執(zhí)行一些不能暫停的任務(wù)的情況下。CLI與STI指令總是配合使用,使得計算機(jī)系統(tǒng)
8.4.4系統(tǒng)提供的中斷服務(wù)子程序當(dāng)計算機(jī)啟動成功之后,內(nèi)存中已經(jīng)存放了很多具有固定功能的子程序,操作系統(tǒng)DOS提供的以INT21H的形式調(diào)用的子程序只是其中的一部分,還有一部分是BIOS中斷服務(wù)子程序,以及已裝載的程序所提供的功能。DOS提供的中斷服務(wù)子程序分成很多子功能,完成各個子功能的程序段都集中放在一起,并且有一個總控程序,構(gòu)成了一個整體。整個中斷服務(wù)子程序的入口地址放在了21H號中斷向量中。這是一個軟件中斷,調(diào)用方式是INT指令,并規(guī)定調(diào)用時AH中必須放子功能號,不同的子功能還需要有不同的入口參數(shù)。前面章節(jié)中已經(jīng)講述了其中的1號、2號、9號、0AH號和4CH號子功能,實際上DOS提供給用戶程序使用的子功能很多,包括如何讀寫文件、如何申請和釋放內(nèi)存、如何修改中斷向量、如何取得及修改系統(tǒng)當(dāng)前的日期和時間等等,不能一一列舉。8.4.4系統(tǒng)提供的中斷服務(wù)子程序BIOS是固化在計算機(jī)的內(nèi)存ROM芯片中的程序,其中包括計算機(jī)啟動時最初執(zhí)行的一些程序,從設(shè)備自檢、系統(tǒng)初始化,到引導(dǎo)操作系統(tǒng)。BIOS中還有很大一部分是提供了一些可供用戶程序使用的中斷服務(wù)子程序,這些子程序都用于對外部設(shè)備的直接控制,主要涉及鍵盤、顯示器、打印機(jī)、串行通訊等,由于這些設(shè)備的控制方法比較復(fù)雜,如果讓應(yīng)用程序直接用輸入輸出命令去控制,就會給程序的編制帶來巨大的障礙。而這些設(shè)備的控制程序雖然較長,但都有一個固定的模式,適合于做成公共子程序的形式供各個程序調(diào)用,BIOS中就是存放著這樣的子程序。各個主要的輸入輸出設(shè)備都有相應(yīng)的子程序,這些子程序分在了各個中斷服務(wù)程序當(dāng)中,包括10H、14H、16H、17H號等幾個中斷。BIOS是固化在計算機(jī)的內(nèi)存ROM芯片中的程8.4.5中斷與子程序的比較子程序是程序設(shè)計的一種常用方法,一般是把具有固定功能、在程序中無規(guī)律重復(fù)使用的程序段做成子程序,在需要的地方調(diào)用;中斷是計算機(jī)系統(tǒng)支持的一種重要功能,當(dāng)發(fā)生中斷時,系統(tǒng)執(zhí)行一段特定的程序。根據(jù)中斷源的不同,需要把中斷分為軟件中斷與硬件中斷分別看待,軟件中斷、硬件中斷與子程序之間有一些共同之處:(1)都需要相應(yīng)程序段的支持。發(fā)生子程序調(diào)用時,系統(tǒng)轉(zhuǎn)去執(zhí)行一段子程序,并在執(zhí)行完后返回調(diào)用處繼續(xù)執(zhí)行;發(fā)生中斷時,系統(tǒng)也是轉(zhuǎn)去執(zhí)行一段中斷服務(wù)程序,執(zhí)行完后返回中斷點繼續(xù)執(zhí)行。被調(diào)用的程序段一定要在內(nèi)存中。8.4.5中斷與子程序的比較(2)軟件中斷與子程序都由特定指令調(diào)用。軟件中斷由指令I(lǐng)NTn調(diào)用,子程序調(diào)用指令是“CALL子程序名”。不論是中斷還是子程序調(diào)用,都會使系統(tǒng)修改CS和IP從而實現(xiàn)轉(zhuǎn)向。(3)發(fā)生調(diào)用時,系統(tǒng)自動記載返回地址。不論是中斷還是子程序調(diào)用,系統(tǒng)在轉(zhuǎn)入子程序/中斷服務(wù)程序之前,都會把返回地址(IP或者是CS和IP)入棧保存。調(diào)用完成后,正是根據(jù)棧中保存的值,才能返回到正確的位置。(4)軟件中斷和子程序都可以帶有入口參數(shù)和出口參數(shù)。由于軟件中斷和子程序都是具有固定功能的服務(wù)性程序段,都是按固定模式進(jìn)行數(shù)據(jù)處理,通常,在調(diào)用前需要知道被處理的數(shù)據(jù)是什么或在什么地方,即入口參數(shù),調(diào)用后又需要把數(shù)據(jù)處理的結(jié)果通知調(diào)用者,即出口參數(shù)。(2)軟件中斷與子程序都由特定指令調(diào)用。軟件中斷(5)可以用子程序調(diào)用代替軟件中斷的調(diào)用指令。INT指令與FAR類型子程序調(diào)用的CALL指令之間的主要差別在于是否把標(biāo)志寄存器入棧,因此,只要能夠先把標(biāo)志寄存器入棧保存,再用CALL指令同樣可以進(jìn)行軟件中斷服務(wù)子程序的調(diào)用。比如,下面的方法完全可以代替INT21H指令: MOV BX,0 MOV DS,BX ;中斷向量表的段地址 MOV BX,84H ;21H號中斷向量在中斷向量表中的偏移地址 PUSHF CALL FARPTR[BX] ;以子程序調(diào)用的CALL指令去調(diào)用21H號中斷服務(wù)子程序(5)可以用子程序調(diào)用代替軟件中斷的調(diào)用指令。IN特別的是,這種用法很不合常規(guī),并且上述程序段中的最后一條指令在MASM5.0下會出現(xiàn)語法錯誤。解決這個問題的方法是,編程人員手工地把這條指令翻譯成機(jī)器碼(查閱有關(guān)資料,或者經(jīng)調(diào)試軟件DEBUG的處理可以知道,該指令的機(jī)器碼由兩字節(jié)組成,分別是0FFH和01FH),然后直接把機(jī)器碼置入源程序中,即把上面的CALL指令用下面的一行代替: DB 0FFH,01FH特別的是,這種用法很不合常規(guī),并且上述程序段中軟件中斷、硬件中斷與子程序三者之間也存在著本質(zhì)的差別,主要體現(xiàn)在:(1)調(diào)用方式不同。軟件中斷由INT指令調(diào)用,子程序用CALL指令調(diào)用,而硬件中斷是由硬件提出申請,不需要任何指令。(2)系統(tǒng)保護(hù)的值不同。中斷調(diào)用時,系統(tǒng)會把標(biāo)志寄存器、CS和IP入棧保存,而子程序調(diào)用時,系統(tǒng)只入棧保存IP或者CS和IP。(3)返回方式不同。中斷返回指令是IRET,而子程序返回指令是RET,并且子程序還有NEAR和FAR兩種類型。軟件中斷、硬件中斷與子程序三者之間也存在著本質(zhì)(4)共享方式不同。硬件中斷的服務(wù)程序不能被其它程序共享,而是直接由系統(tǒng)掌握,軟件中斷的服務(wù)程序可以被任何程序以INT指令的形式調(diào)用,并且調(diào)用者不必關(guān)心中斷服務(wù)程序到底在內(nèi)存的哪一個地方,也不需要把中斷服務(wù)程序與調(diào)用它的程序拼裝到一起。子程序的共享方式比較豐富,但有一點,就是被調(diào)用的子程序必須與調(diào)者拼裝在一起,形成最終的執(zhí)行文件。(5)在內(nèi)存中存在的時間不同。中斷服務(wù)程序通常是長期保留在內(nèi)存中,而子程序是隨可執(zhí)行文件一起進(jìn)入內(nèi)存,當(dāng)可執(zhí)行文件執(zhí)行完后,子程序所占用的內(nèi)存也隨之釋放。(4)共享方式不同。硬件中斷的服務(wù)程序不能被其它*8.4.6編寫中斷服務(wù)程序中斷服務(wù)程序一般是長期保留在內(nèi)存中的,在用戶程序結(jié)束后還能夠被其它應(yīng)用程序調(diào)用,或者是CPU在響應(yīng)硬件中斷時調(diào)用。因此,編寫一個中斷服務(wù)子程序還需要掌握以下技術(shù):如何讓一段程序常駐內(nèi)存,如何修改中斷向量使其指向新的中斷服務(wù)程序。8.4.6.1常駐內(nèi)存技術(shù)內(nèi)存是由操作系統(tǒng)管理的,DOS專門為駐留程序設(shè)計了一個功能調(diào)用。【駐留方法】在AH中放31H,在DX中放需要駐留的程序的節(jié)長度,然后以INT21H指令調(diào)用DOS的結(jié)束并駐留子功能。*8.4.6編寫中斷服務(wù)程序【說明】(1)駐留前要告訴DOS,駐留程序的長度是多少。方法是把駐留長度放在DX中,長度單位是“節(jié)”而不是字節(jié),1節(jié)等于16個字節(jié)。如果需要駐留的程序長度是n字節(jié),則DX的值可通過下面的計算式算得:DX=(n÷10H)+1+10H其中(n÷10H)+1是計算出駐留程序需要多少“節(jié)”,加1是為了預(yù)防駐留程序以字節(jié)計算的長度不是16的整數(shù)倍。再加16節(jié)是因為每個程序在調(diào)入內(nèi)存時,操作系統(tǒng)都為它安排了一個稱為“程序段前綴(PSP)”的專用內(nèi)存區(qū),并且放在程序的前面,這個程序段前綴的長度是256字節(jié),剛好16節(jié),它必須與需要駐留的程序一起駐留在內(nèi)存?!菊f明】如果一個應(yīng)用程序中編寫了一段程序需要常駐內(nèi)存,總是把這段程序?qū)懺诖a段的最前面,如果數(shù)據(jù)段也需要駐留,則應(yīng)該數(shù)據(jù)段在前,代碼段在后。計算駐留長度時,應(yīng)該把數(shù)據(jù)段的長度加上代碼段中駐留部分的長度一起計算。比如,一個應(yīng)用程序由代碼段、數(shù)據(jù)段、堆棧段構(gòu)成,數(shù)據(jù)段的各個變量總共占據(jù)200個字節(jié),代碼段中需要駐留的部分有500個字節(jié),則段的編排次序應(yīng)該是數(shù)據(jù)段、代碼段、堆棧段,因為堆棧段是不需要駐留的,駐留節(jié)長度是:
如果一個應(yīng)用程序中編寫了一段程序需要常駐內(nèi)存數(shù)據(jù)段:200B÷16+1=13節(jié)代碼段:500B÷16+1=32節(jié)PSP:16節(jié)──────────────總計:66節(jié)因此,調(diào)用DOS的31H號子功能進(jìn)行程序駐留前,必須把DX置為66,即42H。數(shù)據(jù)段:200B÷16+1=13節(jié)8.4.6.2修改中斷向量的技術(shù)由于中斷向量共有4個字節(jié),8088指令系統(tǒng)中最多只能一次送16位的字型數(shù)據(jù)到內(nèi)存,所以修改中斷向量至少要用兩條指令才能完成。在修改中斷向量時還必須保證一點,就是不能允許在修改過程中(只修改了其中的1個字時)產(chǎn)生相應(yīng)號的中斷請求,因為這時中斷向量還是一種不完整的狀態(tài)。即使產(chǎn)生了相應(yīng)的中斷請求也必須能屏蔽掉,保證修改的連續(xù)性和中斷向量的完整性。比較好的方法是利用DOS提供的一個子功能進(jìn)行修改?!驹O(shè)置中斷向量】入口參數(shù):AH=25HAL=中斷號DS:DX=新的中斷服務(wù)程序的入口地址調(diào)用:INT21H8.4.6.2修改中斷向量的技術(shù)8.4.6.3中斷編程實例8088系統(tǒng)中有一個定時器,它每隔約0.05秒向CPU發(fā)出一次8號中斷請求,這是一個硬中斷,不受程序的控制。8號中斷服務(wù)程序中有一條調(diào)用1CH號中斷的指令,而1CH號中斷是一個可供用戶使用的中斷,它只由8號中斷調(diào)用,與硬中斷有類似的效果。下面就利用1CH號中斷,編寫一個時鐘程序。【例8.4】編寫一個時鐘程序,要求把時鐘信號顯示在屏幕的右上角,并在程序結(jié)束后常駐內(nèi)存。
8.4.6.3中斷編程實例【分析】由于系統(tǒng)每隔0.05秒就產(chǎn)生一次1CH號中斷,因此在1CH號中斷服務(wù)程序中應(yīng)該有一個0到20的計數(shù)器,初值為20。每次中斷調(diào)用該服務(wù)程序時,就把計數(shù)器的值減1,當(dāng)計數(shù)器的值沒減到0時,說明還沒有中斷20次,即不足1秒鐘,因而不需要更新鐘的讀數(shù)。當(dāng)計數(shù)值到0后,就需要讓時鐘向前走1秒,把秒數(shù)加1,若滿60秒則向分鐘數(shù)進(jìn)1,分鐘數(shù)滿60后再向小時數(shù)進(jìn)1,小時數(shù)滿24就清0,并且要把已走了1秒的鐘的當(dāng)前讀數(shù)顯示在屏幕上。另外,為了計數(shù)下一秒,還要把0到20的計數(shù)器重新置初值20。處理完這些工作后,中斷結(jié)束并返回。主程序需要完成以下工作:把1CH號中斷向量改為新的中斷服務(wù)程序的入口地址,讓新的中斷服務(wù)程序常駐內(nèi)存。
【分析】由于系統(tǒng)每隔0.05秒就產(chǎn)生一次1CH【解】codeSEGMENTASSUMECS:code,DS:codeclockPROCFARDECCS:[x];計數(shù)器減1JZc2;滿1秒轉(zhuǎn)JMPcend;不足1秒,直接轉(zhuǎn)中斷結(jié)束c2:PUSHDSPUSHESPUSHAXPUSHBXPUSHCX【解】PUSHDXPUSHSIPUSHDI;保護(hù)現(xiàn)場PUSHCSPOPDSMOV[x],20;對0到20的計數(shù)器重新賦初值INC[s];秒數(shù)加1CMP[s],60JBc1;不滿60秒轉(zhuǎn)MOV[s],0;計滿60秒后,秒數(shù)清0INC[m];分鐘數(shù)加1CMP[m],60PUSHDXJBc1;不滿60分鐘轉(zhuǎn)MOV[m],0;計滿60分鐘后,分鐘數(shù)清0INC[h];小時數(shù)加1CMP[h],24JBc1;不滿24小時轉(zhuǎn)MOV[h],0 ;計滿24小時后,小時數(shù)清0c1:MOVAL,[s]MOVAH,0MOVDL,10DIVDLORAX,3030HJBc1MOV[t+6],AX;把秒鐘數(shù)拆分成兩位ASCII送入變量t+6處MOVAL,[m]MOVAH,0DIVDLORAX,3030HMOV[t+3],AX;把分鐘數(shù)拆分成兩位ASCII送入變量t+3處MOVAL,[h]MOVAH,0DIVDLORAX,3030HMOV[t],AX;把小時數(shù)拆分成兩位ASCII送入變量t處MOV[t+6],AX;把秒鐘數(shù)拆分成兩位AMOVCX,8CLDMOVAX,0B800HMOVES,AX;取顯示緩沖區(qū)段地址MOVAH,1FH;時鐘讀數(shù)的字符屬性,蘭底,高亮度白字LEASI,[t]MOVDI,71*2MOVCX,8c3:LODSBSTOSWLOOPc3;以直寫屏方式顯示,參見下一章POPDI POPSIPOPDXPOPCXPOPBXPOPAXPOPESPOPDSc3:LODSBcend:IRETtDB'00:00:00';存放時鐘讀數(shù)的變量hDB0;計小時數(shù)的變量mDB0;計分鐘數(shù)的變量sDB0;計秒鐘數(shù)的變量xDB20;0到20次的計數(shù)變量clockENDPmain:MOVAX,codeMOVDS,AXMOVAH,2CHcend:IRETINT21H;取當(dāng)前系統(tǒng)時間MOV[h],CH;置小時數(shù)初值MOV[m],CL;置分鐘數(shù)初值MOV[s],DH;置秒鐘數(shù)初值LEADX,clockMOVAX,251CHINT21H;置1CH號中斷向量,使指向CLOCK子程序MOVAX,3100HLEADX,mainINT21HMOVCL,4SHRDX,CLADDDX,11H;計算駐留程序的節(jié)長度INT21H;結(jié)束并駐留RETcodeENDSENDmainMOVCL,4本
章
要
點輸入輸出設(shè)備是計算機(jī)對外發(fā)揮作用的途徑。不同的外設(shè)有各自的特點,需要不同的控制方法,但總的來說,外設(shè)都需要通過一個接口部件與計算機(jī)的主機(jī)相連。接口負(fù)責(zé)主機(jī)內(nèi)外的信號轉(zhuǎn)達(dá),接口通常包括命令部件、數(shù)據(jù)部件和狀態(tài)部件三大組成部分,每個部件占用一個或多個端口地址。輸入輸出的主要方式有4種。直接方式適用于那些能與主機(jī)速度相匹配的外設(shè),查詢和中斷方式則用于速度較慢、控制較復(fù)雜的外設(shè),而DMA方式提供了一種不通過CPU直接在主機(jī)與內(nèi)存之間進(jìn)行高速數(shù)據(jù)傳遞的方法。用戶可以編寫程序?qū)σ灾苯臃绞?、查詢方式、中斷方式工作的外設(shè)進(jìn)行操作控制。中斷是CPU的一種重要工作方式,由中斷源發(fā)出中斷請求信號開始,經(jīng)過中斷源識別、現(xiàn)場保護(hù)、執(zhí)行中斷服務(wù)程序、現(xiàn)場恢復(fù)的過程,使CPU在完成中斷服務(wù)后能接著被中斷的程序繼續(xù)執(zhí)行。本章要點習(xí)
題
八8.1用圖8.5的例子解釋中斷處理的全過程。8.2現(xiàn)實生活中有如下現(xiàn)象:某人的辦公桌上放了紅色和白色兩部電話機(jī)、一臺收錄機(jī),他正在聽一段錄音。試把下列各項與計算機(jī)的中斷相對比:(1)電話鈴響。(2)判斷是哪一部電話響鈴。(3)兩部電話同時響鈴時先接紅色。(4)按下錄音機(jī)暫停鍵。(5)接電話。(6)按起錄音機(jī)暫停鍵。習(xí)題八(7)電話鈴響但不接電話。(8)拔掉白色電話機(jī)的電話線。(9)接聽白色電話時紅色電話機(jī)響鈴,放下白色電話去接紅色電話。8.3在例8.2的基礎(chǔ)上,編寫一個控制計算機(jī)的揚(yáng)聲器發(fā)聲的子程序,以發(fā)出聲音的頻率和維持發(fā)聲時間的長短為兩個入口參數(shù)。8.4控制計算機(jī)上的揚(yáng)聲器發(fā)出音樂聲,樂曲自選。8.5IRET指令與RET指令有什么異同?能否用RET
2或者RET指令代替中斷服務(wù)程序的結(jié)束指令I(lǐng)RET?為什么?8.6為例8.4的時鐘程序增加一項功能:每當(dāng)整點時(即分鐘數(shù)和秒鐘數(shù)都為0)時,讓揚(yáng)聲器產(chǎn)生一次報時聲。(7)電話鈴響但不接電話。8.7設(shè)計以中斷方式驅(qū)動打印機(jī)的程序流程圖。8.8比較4種輸入輸出方式的特點,并說明為什么使用直接方式的外設(shè)并不多。8.9說明一般接口的基本構(gòu)成,分別列舉三大部件的作用。8.10有下面的程序段:PUSHAXMOVAH,1INT21HMOVDL,ALPOPAX當(dāng)系統(tǒng)執(zhí)行到MOV
DL,AL指令時,定時器產(chǎn)生了一次8號中斷請求,且IF=1。試說明該程序段執(zhí)行期間堆棧的變化情況。8.7設(shè)計以中斷方式驅(qū)動打印機(jī)的程序流程圖。第8章輸入輸出方法
8.1輸入輸出的基本概念
8.2無條件方式輸入輸出
8.3查詢方式輸入輸出
8.4中斷方式輸入輸出
本章要點
習(xí)題八返回章目錄第8章輸入輸出方法返回章目錄8.1輸入輸出的基本概念
從第2章的圖2.1可以看到,計算機(jī)的硬件系統(tǒng)由CPU、內(nèi)存、外設(shè)三大部分構(gòu)成,它們相互之間通過一組信息傳遞的公共通道──總線聯(lián)系在一起的。CPU和內(nèi)存構(gòu)成了計算機(jī)的主機(jī)部分,是計算機(jī)中的高速設(shè)備。而大多數(shù)外部設(shè)備都是慢速設(shè)備,用來把從主機(jī)以外采集到的數(shù)據(jù)送入主機(jī)內(nèi)部,或者把主機(jī)內(nèi)的數(shù)據(jù)傳遞到外部,外設(shè)中的外部存儲器還可以存儲大量的數(shù)據(jù)。那么,CPU作為計算機(jī)的核心,它又是如何控制外設(shè)的呢?8.1輸入輸出的基本概念
8.1.1外設(shè)接口外部設(shè)備的種類繁多,功能各不相同,控制的方法也各式各樣。很多外設(shè)由于速度與信號的關(guān)系,無法直接連接在總線上與主機(jī)進(jìn)行數(shù)據(jù)交換,需要在系統(tǒng)總線與外設(shè)之間設(shè)置一個“適配器”,又稱為“接口”,用于把CPU來的控制命令轉(zhuǎn)換成外設(shè)的控制信號,把外設(shè)的工作情況轉(zhuǎn)換成CPU可以讀取并處理的狀態(tài)信號。接口部件擔(dān)負(fù)著總線信號與外設(shè)信號的轉(zhuǎn)接工作。它一頭與外設(shè)相連,能夠從外設(shè)接收數(shù)據(jù)或向外設(shè)發(fā)出信號,另一頭連接在系統(tǒng)總線上,能夠直接接收來自總線的數(shù)據(jù)和控制信號,或者在適當(dāng)?shù)臅r候往總線發(fā)送數(shù)據(jù)。8.1.1外設(shè)接口CPU能夠與內(nèi)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人工拆搬合同范本
- 亞馬遜采購合同范例
- 書畫掛牌合同范例
- 醫(yī)療技術(shù)入股合同范本
- 供應(yīng)化糞池銷售合同范本
- 資金入股合同范本
- 2025年度建筑工程施工安全檢測合同范本
- 商業(yè)房屋全裝修短期租賃合同范本
- 會務(wù)承包服務(wù)合同范本
- 農(nóng)村股追加合同范本
- 2025年湖南九嶷職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 農(nóng)產(chǎn)品貯運(yùn)與加工考試題(附答案)
- 幼兒園開學(xué)教職工安全教育培訓(xùn)
- 學(xué)校財務(wù)年終工作總結(jié)4
- 鋼鐵是怎樣煉成的鋼鐵讀書筆記
- 2025年汽車加氣站作業(yè)人員安全全國考試題庫(含答案)
- 化工過程安全管理導(dǎo)則安全儀表管理課件
- 中國高血壓防治指南-解讀全篇
- 2024年監(jiān)控安裝合同范文6篇
- 2024年山東省高考政治試卷真題(含答案逐題解析)
- 煙葉復(fù)烤能源管理
評論
0/150
提交評論