第8章 輸入輸出方法 匯編語言程序設(shè)計(jì) 教學(xué)課件_第1頁
第8章 輸入輸出方法 匯編語言程序設(shè)計(jì) 教學(xué)課件_第2頁
第8章 輸入輸出方法 匯編語言程序設(shè)計(jì) 教學(xué)課件_第3頁
第8章 輸入輸出方法 匯編語言程序設(shè)計(jì) 教學(xué)課件_第4頁
第8章 輸入輸出方法 匯編語言程序設(shè)計(jì) 教學(xué)課件_第5頁
已閱讀5頁,還剩169頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第8章輸入輸出方法

8.1輸入輸出的基本概念

8.2無條件方式輸入輸出

8.3查詢方式輸入輸出

8.4中斷方式輸入輸出

本章要點(diǎn)

習(xí)題八返回章目錄第8章輸入輸出方法返回章目錄8.1輸入輸出的基本概念

從第2章的圖2.1可以看到,計(jì)算機(jī)的硬件系統(tǒng)由CPU、內(nèi)存、外設(shè)三大部分構(gòu)成,它們相互之間通過一組信息傳遞的公共通道──總線聯(lián)系在一起的。CPU和內(nèi)存構(gòu)成了計(jì)算機(jī)的主機(jī)部分,是計(jì)算機(jī)中的高速設(shè)備。而大多數(shù)外部設(shè)備都是慢速設(shè)備,用來把從主機(jī)以外采集到的數(shù)據(jù)送入主機(jī)內(nèi)部,或者把主機(jī)內(nèi)的數(shù)據(jù)傳遞到外部,外設(shè)中的外部存儲(chǔ)器還可以存儲(chǔ)大量的數(shù)據(jù)。那么,CPU作為計(jì)算機(jī)的核心,它又是如何控制外設(shè)的呢?8.1輸入輸出的基本概念

8.1.1外設(shè)接口外部設(shè)備的種類繁多,功能各不相同,控制的方法也各式各樣。很多外設(shè)由于速度與信號(hào)的關(guān)系,無法直接連接在總線上與主機(jī)進(jìn)行數(shù)據(jù)交換,需要在系統(tǒng)總線與外設(shè)之間設(shè)置一個(gè)“適配器”,又稱為“接口”,用于把CPU來的控制命令轉(zhuǎn)換成外設(shè)的控制信號(hào),把外設(shè)的工作情況轉(zhuǎn)換成CPU可以讀取并處理的狀態(tài)信號(hào)。接口部件擔(dān)負(fù)著總線信號(hào)與外設(shè)信號(hào)的轉(zhuǎn)接工作。它一頭與外設(shè)相連,能夠從外設(shè)接收數(shù)據(jù)或向外設(shè)發(fā)出信號(hào),另一頭連接在系統(tǒng)總線上,能夠直接接收來自總線的數(shù)據(jù)和控制信號(hào),或者在適當(dāng)?shù)臅r(shí)候往總線發(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)存寫一個(gè)數(shù)據(jù),總是先在地址總線上發(fā)出地址信號(hào),以選定操作對(duì)象,然后在控制總線上發(fā)出控制信號(hào),通知操作對(duì)象完成什么樣的操作,數(shù)據(jù)總線則提供被交換的數(shù)據(jù)進(jìn)行傳遞的通道。CPU總是通過總線,以發(fā)送地址信號(hào)的方式選擇操作對(duì)象,對(duì)內(nèi)存對(duì)外設(shè)接口都是如此。所以,計(jì)算機(jī)系統(tǒng)中對(duì)內(nèi)存進(jìn)行了編號(hào),就是內(nèi)存的物理地址,對(duì)外設(shè)接口也進(jìn)行了編號(hào),這個(gè)號(hào)碼稱作“外設(shè)端口號(hào)”。每一個(gè)端口號(hào)對(duì)應(yīng)外設(shè)接口中的一個(gè)存放字節(jié)型數(shù)據(jù)的元件,稱為一個(gè)“外設(shè)端口”。一個(gè)外設(shè)接口中往往需要多個(gè)外設(shè)端口,占據(jù)多個(gè)外設(shè)端口號(hào)。CPU控制外設(shè)就是通過從這些外設(shè)端口中讀取數(shù)據(jù)以及向它們發(fā)送數(shù)據(jù)實(shí)現(xiàn)的。CPU能夠與內(nèi)存進(jìn)行數(shù)據(jù)交換,也可以與外設(shè)接在計(jì)算機(jī)內(nèi)外數(shù)據(jù)交換過程中,外設(shè)總是處于從屬狀態(tài),它受來自總線信號(hào)的控制,按控制命令的要求完成相應(yīng)的操作,并且可以從主機(jī)接收或向主機(jī)提供數(shù)據(jù)。所以大多數(shù)外設(shè)接口從功能上可以分為控制部件、狀態(tài)部件和數(shù)據(jù)部件三大組成部分??刂撇考址Q為命令部件,專用于接收來自主機(jī)的操作命令,并轉(zhuǎn)換成對(duì)外設(shè)的控制信號(hào);狀態(tài)部件負(fù)責(zé)向主機(jī)轉(zhuǎn)達(dá)外設(shè)的當(dāng)前工作情況;數(shù)據(jù)部件是內(nèi)外數(shù)據(jù)交換的緩沖器,臨時(shí)存放需要傳遞的數(shù)據(jù)。在計(jì)算機(jī)內(nèi)外數(shù)據(jù)交換過程中,外設(shè)總是處于從屬通常,三大部件中的每個(gè)部件至少占據(jù)1個(gè)外設(shè)端口地址,每個(gè)端口都以字節(jié)為基本構(gòu)成單位,因而1個(gè)外設(shè)接口一般最少占用3個(gè)端口地址。但是,有些外設(shè)能夠接受的控制命令很少,只需要1字節(jié)中的1位或2位就夠了,這時(shí)可以用1個(gè)控制端口的8個(gè)位分別控制不同的外設(shè),把不同外設(shè)的接口集中在一起,共同占據(jù)一個(gè)外設(shè)端口號(hào)。另一方面,接口中的命令部件只用于接收控制命令,CPU對(duì)命令部件只寫不讀。狀態(tài)部件剛好相反,只用于向CPU提供狀態(tài)信息,CPU對(duì)它只讀不寫。因而有些接口把命令部件與狀態(tài)部件設(shè)計(jì)為共同占用1個(gè)外設(shè)端口號(hào),由總線上的“讀”或“寫”信號(hào)區(qū)分究竟哪個(gè)部件是當(dāng)前的數(shù)據(jù)傳遞對(duì)象。通常,三大部件中的每個(gè)部件至少占據(jù)1個(gè)外設(shè)端8.1.28088的獨(dú)立編址方式無論是內(nèi)存還是外設(shè)端口,都是以字節(jié)為基本的數(shù)據(jù)單位。當(dāng)總線上出現(xiàn)有效的地址信號(hào)時(shí),每個(gè)字節(jié)型內(nèi)存儲(chǔ)器或外設(shè)端口都能夠根據(jù)地址信號(hào),判斷自己是否被選中為數(shù)據(jù)傳遞的對(duì)象(完成這種判斷的是地址譯碼器),沒有被選中的自動(dòng)不參與本次總線上的數(shù)據(jù)傳遞。從這個(gè)角度說,只要為內(nèi)存和外設(shè)端口分別安排不同的地址,就可以從地址信號(hào)本身區(qū)分?jǐn)?shù)據(jù)傳遞的對(duì)象是內(nèi)存還是外設(shè)端口,從而把各個(gè)內(nèi)存字節(jié)與外設(shè)端口編排一套地址號(hào)碼,這種編排地址的方式稱為“統(tǒng)一編址”或“混合編址”。8.1.28088的獨(dú)立編址方式8088采用的是另一種編址方式。由于8088CPU在數(shù)據(jù)交換時(shí)除了能夠發(fā)出地址信號(hào)外,還有一根特別的信號(hào)線(IO/M)可以發(fā)出兩種不同的信號(hào)。當(dāng)這根信號(hào)線上發(fā)出高電位信號(hào)時(shí),表示當(dāng)前總線上是外設(shè)操作;反之,這根信號(hào)線上是低電位時(shí),表示當(dāng)前總線上是內(nèi)存操作。設(shè)計(jì)計(jì)算機(jī)系統(tǒng)時(shí)就可以利用這根信號(hào)線上的信號(hào),區(qū)分操作對(duì)象是內(nèi)存還是外設(shè)。這時(shí),各個(gè)內(nèi)存字節(jié)與外設(shè)端口可以分開編排兩套號(hào)碼,分別稱為內(nèi)存地址與外設(shè)地址。當(dāng)CPU需要讀寫數(shù)據(jù)時(shí),同時(shí)發(fā)出地址信號(hào)和IO/M信號(hào),這些信號(hào)一起送到地址譯碼器,地址信號(hào)選擇了具體的地址號(hào)碼,而IO/M信號(hào)則選擇內(nèi)存還是外設(shè)。這種把內(nèi)存和外設(shè)端口分開各自編址的方式稱為“獨(dú)立編址”。8088采用的是另一種編址方式。由于8088C

8.1.3控制外設(shè)的指令由于8088采取了獨(dú)立編址方式,就需要有特殊的指令控制對(duì)外設(shè)端口的操作。8088系統(tǒng)設(shè)計(jì)有兩條專用指令:IN和OUT。【指令格式】INd1,d2【功能】從d2指明的外設(shè)端口中讀取1字節(jié)或2字節(jié)數(shù)據(jù),送到操作數(shù)d1指出的地方。【說明】(1)8088系統(tǒng)限制d1只能是AL或AX。當(dāng)外設(shè)端口號(hào)不超過255時(shí),d2操作數(shù)可直接寫端口號(hào)碼,是外設(shè)的直接尋址方式;端口號(hào)超過255時(shí),必須先把端口號(hào)放在DX中,以DX作為d2操作數(shù),這是外設(shè)的間接尋址方式。8.1.3控制外設(shè)的指令(2)當(dāng)d1是AL時(shí),該指令從指定的端口中讀1字節(jié)數(shù)據(jù);當(dāng)d1是AX時(shí),CPU將從d2對(duì)應(yīng)的端口讀1字節(jié)數(shù)據(jù)到AL,從下一個(gè)端口號(hào)讀1字節(jié)數(shù)據(jù)到AH,即總共讀取16位數(shù)據(jù)送到AX中?!局噶罡袷健縊UTd1,d2【功能】把操作數(shù)d2指明的1字節(jié)或2字節(jié)數(shù)據(jù)送到d1對(duì)應(yīng)的外設(shè)端口中?!菊f明】(1)d2只能是AL或AX。當(dāng)外設(shè)端口號(hào)不超過255時(shí),d1操作數(shù)可直接寫端口號(hào)碼;端口號(hào)超過255時(shí),必須先把端口號(hào)放在DX中,以DX作為d1操作數(shù)。(2)當(dāng)d1是AL時(shí),該指令從指定的端口中讀1字(2)當(dāng)d2是AL時(shí),該指令把AL中的8位數(shù)據(jù)送往d1指定的外設(shè)端口;當(dāng)d2是AX時(shí),該指令把AL中的8位數(shù)據(jù)送到d1對(duì)應(yīng)的端口,把AH中的8位數(shù)據(jù)送往下一端口,即把16位數(shù)據(jù)送到d1對(duì)應(yīng)的端口及下一端口中。IN和OUT指令專門用于外設(shè)操作,必須與內(nèi)存操作嚴(yán)格區(qū)分開。下面的例8.1用來說明IN、OUT指令與內(nèi)存操作的MOV指令之間的差別,并請(qǐng)讀者體會(huì)在數(shù)據(jù)傳遞期間IO/M信號(hào)的作用。(2)當(dāng)d2是AL時(shí),該指令把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】說明下面各指令或程序段的功能?!窘狻浚?)先把立即數(shù)61H放到DX中,然后以DX中的61H作為外設(shè)端口號(hào),從相應(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號(hào)外設(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è)的性能。對(duì)于多數(shù)慢速外設(shè)而言,如果CPU傳送來的數(shù)據(jù)速度太快,外設(shè)來不及處理,就可能造成數(shù)據(jù)丟失;如果外設(shè)還沒有準(zhǔn)備好數(shù)據(jù),CPU就已經(jīng)發(fā)出了讀操作命令,將讀不到正確的數(shù)據(jù)。因此,計(jì)算機(jī)系統(tǒng)進(jìn)行內(nèi)外數(shù)據(jù)交換時(shí),必須根據(jù)外設(shè)的特點(diǎn)采用適當(dāng)?shù)男问???偟膩碚f,主機(jī)與外設(shè)之間數(shù)據(jù)交換的方法有4種:無條件方式、查詢方式、中斷方式、DMA方式。8.1.4輸入輸出方式

1.無條件方式又稱為直接方式,是指CPU可在任何時(shí)刻直接以外設(shè)操作指令與外部設(shè)備進(jìn)行數(shù)據(jù)傳遞。顯然,這種方式對(duì)外設(shè)有很高的要求,它必須能像內(nèi)存一樣時(shí)刻準(zhǔn)備著與CPU進(jìn)行數(shù)據(jù)傳遞,并且能夠跟上CPU的速度,保證傳送的信息的正確性。

2.查詢方式使用查詢方式工作的外設(shè)必須至少有兩個(gè)部件,其中之一是狀態(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檢測(cè)到外設(shè)已準(zhǔn)備好(Ready)后,可以與外設(shè)進(jìn)行一次數(shù)據(jù)交換。1.無條件方式3.中斷方式這是指每當(dāng)外設(shè)準(zhǔn)備好、能夠進(jìn)行數(shù)據(jù)傳遞時(shí),就向CPU發(fā)出一個(gè)特殊的請(qǐng)求信號(hào),稱為中斷請(qǐng)求信號(hào)。CPU收到中斷請(qǐng)求后,暫停當(dāng)前的工作,轉(zhuǎn)而執(zhí)行一段預(yù)先設(shè)計(jì)好的中斷服務(wù)程序,完成對(duì)外設(shè)的數(shù)據(jù)交換。執(zhí)行完中斷服務(wù)程序后,CPU仍回到被暫停的程序繼續(xù)執(zhí)行。

4.直接存儲(chǔ)器存取DMA(DirectMemoryAccess)方式這是一種不通過CPU,在內(nèi)存與外設(shè)之間直接進(jìn)行高速數(shù)據(jù)交換的方法。通常,系統(tǒng)總線是在CPU的控制之下,CPU總是作為數(shù)據(jù)傳遞的一方,內(nèi)存與外設(shè)其中之一作為另一方。當(dāng)大量的數(shù)據(jù)需要傳遞時(shí),在主機(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ù)傳遞必須有一個(gè)前提條件,就是CPU能夠讓出總線的控制權(quán),交由DMA方式數(shù)據(jù)傳遞的專用控制器控制,當(dāng)數(shù)據(jù)傳遞結(jié)束后,CPU再收回總線控制權(quán)。8088CPU支持這樣的總線操作方式,因而8088系統(tǒng)可以進(jìn)行DMA方式的數(shù)據(jù)傳遞??赡芡耆旁贑PU中,只能放在內(nèi)存中。在CPU控制下進(jìn)行大量DMA控制器專門用于控制內(nèi)存與外設(shè)之間的直接數(shù)據(jù)傳遞,但是它沒有數(shù)據(jù)處理能力。在一些計(jì)算機(jī)系統(tǒng)中還設(shè)計(jì)有帶有處理能力的專用數(shù)據(jù)傳送芯片,其工作方式與DMA方式很相似,也需要CPU在適當(dāng)?shù)臅r(shí)候讓出總線供其使用,這種數(shù)據(jù)傳遞方式稱為“專用處理機(jī)方式”。8088微型計(jì)算機(jī)不使用處理機(jī)方式進(jìn)行數(shù)據(jù)傳遞,DMA方式需要涉及計(jì)算機(jī)硬件的內(nèi)容過多,所以本書都不做詳細(xì)介紹。DMA控制器專門用于控制內(nèi)存與外設(shè)之間的直接系統(tǒng)總線端口61H:P7P6P5P4P3P2P1P0 1.193MHz定時(shí)器AB與門放大電路揚(yáng)聲器圖8.1揚(yáng)聲器與系統(tǒng)總線的連接8.2無條件方式輸入輸出計(jì)算機(jī)系統(tǒng)中的揚(yáng)聲器是一種簡(jiǎn)單的輸出設(shè)備,可以隨時(shí)從CPU接收控制命令。圖8.1是揚(yáng)聲器的連接原理圖。系統(tǒng)總線端口61H:P7P6P5P4P3揚(yáng)聲器發(fā)聲的基本原理是振動(dòng)。揚(yáng)聲器口上的一層薄膜在電信號(hào)控制下往復(fù)振動(dòng)產(chǎn)生聲音,每秒鐘振動(dòng)的次數(shù)就是所發(fā)出的聲音的頻率,振動(dòng)的幅度決定聲音的強(qiáng)度。由于控制揚(yáng)聲器的信號(hào)是二進(jìn)制的開關(guān)信號(hào),不能對(duì)流過揚(yáng)聲器的電流的大小進(jìn)行控制,因而不能控制揚(yáng)聲器薄膜的振幅,所以小揚(yáng)聲器只能發(fā)出固定強(qiáng)度的聲音。但開關(guān)信號(hào)變化的頻率是可控的,CPU正是通過控制開關(guān)信號(hào)的頻率,讓揚(yáng)聲器發(fā)出不同頻率的聲音。揚(yáng)聲器發(fā)聲的基本原理是振動(dòng)。揚(yáng)聲器口上的一層薄由圖8.1可以看到,控制揚(yáng)聲器的信號(hào)有兩個(gè)來源,它們通過與門之后送往放大電路并控制揚(yáng)聲器發(fā)聲。系統(tǒng)中的61H號(hào)端口是一個(gè)可讀寫的外設(shè)端口,能夠存放一字節(jié)數(shù)據(jù),其中的最低兩位就用來控制送往小揚(yáng)聲器的兩個(gè)信號(hào)源。最低位P0為0可以保證送往與門A輸入端的信號(hào)為高電位,這時(shí)只需要交替變化次低位P1的值,控制與門的另一個(gè)輸入端B端的信號(hào)即可。除此之外,還要控制P1變化的頻率,比如要讓揚(yáng)聲器發(fā)出500?Hz的聲音,就是要使P1位上的信號(hào)每秒鐘變化500次,即每0.002秒是一個(gè)變化周期,因而要讓P1位維持高電位(即置P1位為1)0.001秒,然后變成低電位,再維持0.001秒,如此交替變化。而發(fā)聲時(shí)間則通過控制P1位交替變化的次數(shù)來掌握,比如讓揚(yáng)聲器在1秒鐘內(nèi)保持發(fā)出500?Hz的聲音,就要讓P1位交替變化500次。由圖8.1可以看到,控制揚(yáng)聲器的信號(hào)有兩個(gè)來控制時(shí)間并不是件容易的事。如果要準(zhǔn)確控制時(shí)間,可以參照微機(jī)原理中有關(guān)定時(shí)器的內(nèi)容,采用后面說明的中斷方式。在此只是為了說明直接數(shù)據(jù)傳送的原理,故簡(jiǎn)化時(shí)間控制的方法,采用循環(huán)延遲的方式實(shí)現(xiàn)。需要說明的是,例8.2的程序雖然可以在各種檔次的PC機(jī)上運(yùn)行,但發(fā)出的聲音頻率有可能不一樣。這是因?yàn)椴煌瑱n次的機(jī)器執(zhí)行循環(huán)延遲所花費(fèi)的時(shí)間不同,而程序本身就是利用這個(gè)延遲來控制音頻的??刂茣r(shí)間并不是件容易的事。如果要準(zhǔn)確控制時(shí)間,【例8.2】利用無條件數(shù)據(jù)傳送方式,讓計(jì)算機(jī)的揚(yáng)聲器在1秒鐘內(nèi)保持發(fā)出500Hz的聲音?!窘狻客暾某绦蛉缦拢篸elnum=14000staSEGMENTSTACKDW1024DUP(0)staENDScodeSEGMENTASSUMECS:code,SS:sta【例8.2】利用無條件數(shù)據(jù)傳送方式,讓計(jì)算機(jī)的揚(yáng)聲delayPROCNEAR;時(shí)間延遲子程序,以CX中的值作為PUSHAX;循環(huán)次數(shù),做若干次的乘法產(chǎn)生時(shí)PUSHDX;間延遲的效果del:IMULAX;用乘法指令延遲,執(zhí)行時(shí)間較長(zhǎng)LOOPdelPOPDXPOPAXRETdelayENDPmain:MOVCX,500sou:PUSHCXdelayPROCNEAR;時(shí)間 INAL,61H;讀出原61H端口的數(shù)據(jù)ANDAL,11111100B;清最低兩位OUT61H,AL;送低電位到P1MOVCX,delnum;取控制延遲時(shí)間的循環(huán)次數(shù)值CALLdelayINAL,61HORAL,00000010B;置P1位為1OUT61H,ALMOVCX,delnum

INAL,61HCALLdelayPOPCXLOOPsouMOVAX,4C00HINT21HcodeENDSENDmain從這個(gè)例子可以看出,對(duì)揚(yáng)聲器的控制是不需要任何條件的,程序中在向61H號(hào)端口送數(shù)據(jù)時(shí)根本不考慮揚(yáng)聲器是否準(zhǔn)備好、是否可接收數(shù)據(jù)等問題。由端口61H到放大電路構(gòu)成了揚(yáng)聲器的接口電路,該接口以系統(tǒng)總線上送來的信號(hào)驅(qū)動(dòng)薄膜的振動(dòng),按無條件方式進(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ù)端口寫一個(gè)數(shù)據(jù)或向命令端口發(fā)一個(gè)操作命令(b)查詢方式輸出操作流程(a)查詢方式輸入操作流程讀狀態(tài)端口 Ready?從數(shù)據(jù)端口讀一個(gè)數(shù)據(jù)處理完?NYNYY讀狀態(tài)端口 Ready?處理完?NYN向數(shù)據(jù)端口寫打印機(jī)是一種可以按查詢方式工作的輸出外設(shè),它與主機(jī)連接的接口部件是打印機(jī)適配器,也就是平常所說的“標(biāo)準(zhǔn)并行接口”或“并口”。打印機(jī)接口中的三大部件齊備,它們各自占據(jù)一個(gè)外設(shè)端口號(hào)碼,分別是:數(shù)據(jù)部件──378H;狀態(tài)部件──379H;控制部件──37AH。狀態(tài)端口各位的含義如下:BusyACKPESELECTERROR

D7 D6 D5 D4 D3 D2 D1D0打印機(jī)是一種可以按查詢方式工作的輸出外設(shè),它(1)D7位:是打印機(jī)的“忙”信號(hào)。這一位為0表示打印機(jī)當(dāng)前正處于“忙”狀態(tài),為1表示打印機(jī)不忙。(2)D6位:是打印機(jī)送回的認(rèn)可信號(hào)。當(dāng)打印機(jī)從接口中正確接收1字節(jié)數(shù)據(jù)后,就送回一個(gè)低電位的認(rèn)可信號(hào),這個(gè)信號(hào)只維持很短的時(shí)間,然后又恢復(fù)高電位。(3)D5位:缺紙信號(hào)。這一位為1表示打印機(jī)無紙,因而無法打印,為0時(shí)表示正常工作。(4)D4位:聯(lián)機(jī)信號(hào)。這一位為1表示正處于聯(lián)機(jī)工作狀態(tài),為0表示沒有聯(lián)機(jī),這時(shí)不能工作。(5)D3位:出錯(cuò)信號(hào)。為0表示打印機(jī)內(nèi)部出現(xiàn)錯(cuò)誤,不能工作,為1則正常。(1)D7位:是打印機(jī)的“忙”信號(hào)。這一位為0表示控制端口各位的含義如下:INTSELECTINITAutoFeedSTBD7D6 D5 D4 D3 D2 D1 D0

(1)D4位:允許中斷信號(hào)。將該位置1,允許打印機(jī)以中斷方式工作,為0則不允許。(2)D3位:聯(lián)機(jī)命令。置1將設(shè)置打印機(jī)的聯(lián)機(jī)工作方式,控制打印機(jī)時(shí)總是把這一位置1,否則打印機(jī)不能正常工作。打印機(jī)正常打印時(shí)這一位需要保持1??刂贫丝诟魑坏暮x如下:INTSELECTINITAuto(3)D2位:初始化信號(hào)。正常工作時(shí)總是把這一位置1,需要把打印機(jī)重新初始化時(shí),則在這一位先清0再置1,并且要維持清0的時(shí)間0.05秒以上。初始化又稱作打印機(jī)復(fù)位,復(fù)位時(shí)可觀察到的現(xiàn)象是打印頭回到最左邊。(4)D1位:自動(dòng)走紙。置1要求打印機(jī)在打印完一行后(回車時(shí))自動(dòng)走紙,清0時(shí)則需要向打印機(jī)輸出換行符(0AH)控制走紙。這一位通常被置為0。(5)D0位:選通信號(hào)。CPU通過在這一位上先置1再清0,通知打印機(jī)從數(shù)據(jù)部件中取走一字節(jié)數(shù)據(jù)并打印。把圖8.2中查詢輸出的流程稍做修改,可以作為控制打印機(jī)以查詢方式工作的程序流程,如圖8.3所示。(3)D2位:初始化信號(hào)。正常工作時(shí)總是把這一位置計(jì)數(shù)器清0讀狀態(tài)端口Ready?送數(shù)據(jù)到數(shù)據(jù)端口送先高后低的STB信號(hào)打印完?計(jì)數(shù)器加1,取下一數(shù)據(jù)NYYN結(jié)束圖8.3查詢方式控制打印機(jī)計(jì)數(shù)器清0讀狀態(tài)端口Ready?送數(shù)據(jù)到數(shù)據(jù)端口送先【例8.3】控制打印機(jī)以查詢方式工作,打印26個(gè)英文字母,共打印30行。【解】staSEGMENTSTACKDB1024DUP(0)staENDSdataSEGMENTprintDB'abcdefghijklmnopqrstuvwxyz',0DH,0AHdataENDScodeSEGMENTASSUMECS:code,SS:sta,DS:data【例8.3】控制打印機(jī)以查詢方式工作,打印26initPROCNEAR;打印機(jī)初始化程序MOVDX,37AHMOVAL,08HOUTDX,ALMOVCX,1000init1:LOOPinit1;延遲,維持初始化信號(hào)一段時(shí)間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ù)端口號(hào)MOVAL,[BX]OUTDX,AL;送數(shù)據(jù)到數(shù)據(jù)端口暫存MOVDX,37AHMOVAL,0DHstart:MOVAX,dataOUTDX,AL ;置STB信號(hào)為1 DECALOUTDX,AL;置STB信號(hào)為0CMPBYTEPTR[BX],0AHJZnewlineINCBXJMPnextnewline:LOOPagainMOVAX,4C00HINT21HcodeENDSENDstartOUTDX,AL ;置S8.4中斷方式輸入輸出把例8.3的程序拿到計(jì)算機(jī)上去執(zhí)行,可以發(fā)現(xiàn)從鍵盤上發(fā)出程序執(zhí)行命令后,光標(biāo)會(huì)停在命令的下一行閃爍,并且打印機(jī)開始工作,直到打印機(jī)打印完所有內(nèi)容后才會(huì)出現(xiàn)系統(tǒng)提示符。也就是說,在打印期間,系統(tǒng)是不能做其它事情的。分析一下例8.3的程序可以發(fā)現(xiàn),它是讓高速的CPU去適應(yīng)低速的打印機(jī),讓CPU反復(fù)不停地查問打印機(jī)的狀態(tài),直到打印機(jī)準(zhǔn)備好。由于兩者的速度差很大,很可能會(huì)出現(xiàn)CPU查問成千上萬次以后才能等到打印機(jī)準(zhǔn)備好的信號(hào),送出1個(gè)字節(jié)的數(shù)據(jù)。顯然,這種數(shù)據(jù)傳遞方式的效率是極低的。8.4中斷方式輸入輸出設(shè)想讓CPU把反復(fù)查問的時(shí)間利用起來去做別的事情,而讓打印機(jī)在準(zhǔn)備好接收一個(gè)數(shù)據(jù)時(shí)就向CPU發(fā)出一個(gè)信號(hào)。當(dāng)CPU接到這個(gè)信號(hào)時(shí),暫時(shí)停止正在執(zhí)行的工作,以很短的時(shí)間為打印機(jī)送出下一個(gè)數(shù)據(jù),然后恢復(fù)原工作。這樣,盡管打印的速度并沒有提高,但把高性能的CPU解放出來,可以做其它的事情,從而提高了整個(gè)系統(tǒng)的工作效率。中斷式數(shù)據(jù)傳遞正是基于這種思想。設(shè)想讓CPU把反復(fù)查問的時(shí)間利用起來去做別的8.4.1中斷的基本概念

1.中斷CPU暫停正在執(zhí)行的程序,轉(zhuǎn)去完成另一件工作,完成后再回到原來的程序繼續(xù)執(zhí)行的現(xiàn)象稱為中斷。

2.中斷源能夠?qū)е翪PU中斷的事件稱為中斷源。如果引發(fā)中斷的事件來自CPU的內(nèi)部,這樣的中斷源稱為內(nèi)中斷源,比如CPU執(zhí)行了一個(gè)會(huì)產(chǎn)生溢出的除法操作,就會(huì)產(chǎn)生一個(gè)內(nèi)部中斷。如果是由CPU外部的信號(hào)引發(fā)中斷,這種中斷源稱為外中斷源,打印機(jī)申請(qǐng)中斷就是一種外中斷源。8.4.1中斷的基本概念3.中斷源分類按照引發(fā)中斷的中斷源的位置不同,8088系統(tǒng)把中斷源分為內(nèi)中斷源和外中斷源兩大類。來自CPU內(nèi)部的中斷請(qǐng)求是內(nèi)中斷源,8088系統(tǒng)的內(nèi)中斷源有除法溢出、執(zhí)行中斷指令和單步中斷(CPU每執(zhí)行一條指令都產(chǎn)生一次的中斷請(qǐng)求,主要用于程序的調(diào)試)。外中斷源是來自CPU芯片外的中斷請(qǐng)求信號(hào),8088芯片有兩個(gè)引腳可以接收外中斷請(qǐng)求信號(hào),分別是NMI和INTR,并且8088對(duì)這兩個(gè)引腳上的中斷請(qǐng)求信號(hào)的處理方式不太一樣。根據(jù)中斷信號(hào)來自哪一個(gè)引腳,外中斷源又再分為兩類:把中斷請(qǐng)求信號(hào)通過NMI引腳送往CPU的中斷源稱為不可屏蔽外中斷源,INTR上的則稱為可屏蔽外中斷源。也可以按產(chǎn)生中斷請(qǐng)求的方式不同,把中斷源分為軟件中斷源和硬件中斷源,由它們導(dǎo)致的中斷又分別稱為軟中斷和硬中斷。除法溢出中斷、單步中斷是內(nèi)中斷源中的硬中斷源,外中斷源都是硬中斷源。軟中斷則是由指令系統(tǒng)中的中斷指令導(dǎo)致的中斷。3.中斷源分類4.中斷號(hào)在計(jì)算機(jī)系統(tǒng)中,各種中斷源都被統(tǒng)一地編排了一個(gè)互不相同的號(hào)碼,用以唯一地標(biāo)識(shí)一個(gè)中斷源,這個(gè)號(hào)碼稱為中斷號(hào)。在8088系統(tǒng)中,中斷號(hào)的有效范圍是0到255。常用的中斷號(hào)與中斷源的對(duì)應(yīng)關(guān)系見表8.1。5.中斷源識(shí)別由于中斷源有不同的類型,向CPU申請(qǐng)中斷的方式也各不相同。當(dāng)CPU知道有中斷請(qǐng)求后,還必須判斷出究竟是幾號(hào)中斷請(qǐng)求。CPU確定中斷號(hào)的過程稱為中斷源識(shí)別。如果中斷請(qǐng)求來自CPU內(nèi)部,CPU內(nèi)有相應(yīng)機(jī)制可以取到內(nèi)中斷請(qǐng)求的中斷號(hào);如果是不可屏蔽外中斷請(qǐng)求,系統(tǒng)只安排了唯一的中斷號(hào)(2號(hào));當(dāng)中斷請(qǐng)求來自CPU的INTR外引腳時(shí),情況就比較復(fù)雜了。4.中斷號(hào)

6.中斷優(yōu)先級(jí)由于8088共支持256個(gè)中斷源,尤其是包括若干硬中斷源,各種中斷源就有同時(shí)提出中斷請(qǐng)求的可能。當(dāng)多個(gè)中斷申請(qǐng)同時(shí)送到8088時(shí),CPU必須能分別輕重緩急妥善處理。CPU分辨各中斷源優(yōu)先次序的方式是預(yù)先把所有中斷源進(jìn)行分級(jí),稱為中斷優(yōu)先級(jí)。當(dāng)CPU遇到同時(shí)有兩個(gè)或兩個(gè)以上的中斷申請(qǐng)時(shí),就按它們的優(yōu)先級(jí)次序,先為級(jí)別最高的中斷源服務(wù)。6.中斷優(yōu)先級(jí)8088把所有中斷源劃分為4個(gè)等級(jí),以0級(jí)為最高,依次降低等級(jí)。各中斷源的等級(jí)劃分情況是:0級(jí)──除單步中斷以外的內(nèi)中斷源;1級(jí)──不可屏蔽外中斷源;2級(jí)──可屏蔽外中斷源;3級(jí)──單步中斷。不同級(jí)別中的兩個(gè)中斷源同時(shí)申請(qǐng)中斷時(shí),CPU可以根據(jù)級(jí)別高低決定服務(wù)的先后次序。但同級(jí)中的兩個(gè)中斷源同時(shí)申請(qǐng)又如何處理呢?在0級(jí)中斷源中,所有中斷源由CPU執(zhí)行指令產(chǎn)生的,只有執(zhí)行DIV或IDIV指令時(shí)才有可能產(chǎn)生08088把所有中斷源劃分為4個(gè)等級(jí),以0級(jí)為號(hào)中斷請(qǐng)求,執(zhí)行一條中斷指令只能產(chǎn)生一個(gè)中斷號(hào),而CPU在任何時(shí)刻只能執(zhí)行一條指令,所以不可能同時(shí)有兩個(gè)或兩個(gè)以上的0級(jí)中斷請(qǐng)求。1級(jí)與3級(jí)中斷源分別各有一個(gè),不涉及同時(shí)產(chǎn)生中斷請(qǐng)求的問題,只有2級(jí)比較麻煩。所有可屏蔽外中斷源都處于中斷優(yōu)先級(jí)中的2級(jí),這些外中斷源都必須通過CPU的INTR引腳向CPU提出中斷申請(qǐng),如果它們當(dāng)中出現(xiàn)同時(shí)申請(qǐng)的現(xiàn)象,將由中斷控制器處理。在8088系統(tǒng)中,中斷控制器可以把它管轄的所有可屏蔽外中斷源再進(jìn)行內(nèi)部分級(jí),當(dāng)同時(shí)出現(xiàn)多個(gè)中斷申請(qǐng)時(shí),由中斷控制器判別相互間優(yōu)先級(jí)的高低,并把其中最高級(jí)別的可屏蔽中斷請(qǐng)求通過INTR送達(dá)CPU。號(hào)中斷請(qǐng)求,執(zhí)行一條中斷指令只能產(chǎn)生一個(gè)中斷號(hào),而CPU在任7.中斷屏蔽如果某個(gè)中斷源發(fā)出中斷請(qǐng)求后,CPU置之不理,繼續(xù)完成自己的工作,這種現(xiàn)象稱為中斷屏蔽。8088系統(tǒng)中對(duì)各種中斷分類處理,0級(jí)和1級(jí)中斷是不能被屏蔽的,當(dāng)CPU收到0級(jí)或1級(jí)中斷請(qǐng)求時(shí),必須立刻放下正在執(zhí)行的程序進(jìn)行中斷處理;但2級(jí)或3級(jí)中斷就有被屏蔽的可能。3級(jí)中斷是否屏蔽由標(biāo)志寄存器中的TF標(biāo)志位決定,當(dāng)TF=0時(shí),CPU將不響應(yīng)單步中斷請(qǐng)求。指令系統(tǒng)中沒有專門指令可以直接針對(duì)TF標(biāo)志位操作,但可以通過PUSHF和POPF指令達(dá)到修改TF值的目的。2級(jí)中斷是否屏蔽受兩個(gè)方面的控制:一是標(biāo)志寄存器的IF標(biāo)志位,如果IF=0,所有的2級(jí)中斷源都被屏蔽;另一個(gè)可控制2級(jí)中斷屏蔽的是中斷控制器,中斷控制器是作為8088系統(tǒng)的一個(gè)外設(shè),CPU可以通過命令的形式通知中斷控制器屏蔽掉幾號(hào)中斷請(qǐng)求,這種方式可以只屏蔽2級(jí)中斷源中的某幾個(gè)而不是屏蔽所有2級(jí)中斷。7.中斷屏蔽8.中斷服務(wù)程序CPU響應(yīng)中斷就是暫停正在執(zhí)行的程序,轉(zhuǎn)而為中斷源進(jìn)行相應(yīng)的服務(wù),稱為中斷服務(wù)。中斷服務(wù)當(dāng)然是通過執(zhí)行一段程序來實(shí)現(xiàn)的。CPU響應(yīng)某個(gè)中斷時(shí)去執(zhí)行的程序稱為“中斷服務(wù)程序”或“中斷處理程序”。顯然,如果要系統(tǒng)正常工作,中斷服務(wù)程序就必須長(zhǎng)期保存在內(nèi)存中,保證CPU隨時(shí)可以執(zhí)行它。CPU在兩種情況下會(huì)轉(zhuǎn)去執(zhí)行中斷服務(wù)程序,一是正在執(zhí)行的程序中遇到了一條中斷指令(INT指令),二是硬中斷源產(chǎn)生了中斷請(qǐng)求且沒有被屏蔽。第二種情況是由硬件中斷源引起的中斷,也就是說,不需要CPU去執(zhí)行什么專用指令,只要出現(xiàn)沒被屏蔽的硬中斷申請(qǐng),就會(huì)導(dǎo)致CPU去執(zhí)行相應(yīng)的中斷服務(wù)程序。8.中斷服務(wù)程序各個(gè)中斷源都對(duì)應(yīng)地有自己的中斷服務(wù)程序,當(dāng)機(jī)器啟動(dòng)完成后,這些中斷服務(wù)程序是操作系統(tǒng)或ROMBIOS中的程序段。這些中斷服務(wù)程序也是可以修改的,只要用戶程序能夠把一段程序長(zhǎng)期保留在內(nèi)存中(即常駐內(nèi)存),并且通知CPU這就是某個(gè)中斷的中斷服務(wù)程序。各個(gè)中斷源都對(duì)應(yīng)地有自己的中斷服務(wù)程序,當(dāng)機(jī)器

9.中斷向量既然每個(gè)中斷服務(wù)程序都放在內(nèi)存中,當(dāng)然就有其入口地址,這樣,當(dāng)CPU響應(yīng)中斷時(shí)才能知道轉(zhuǎn)到哪里去執(zhí)行中斷服務(wù)程序。入口地址是一個(gè)完整的邏輯地址,包括16位的段地址和16位的偏移地址,由總共32位數(shù)據(jù)構(gòu)成,需要占據(jù)4個(gè)字節(jié)的存儲(chǔ)空間。把中斷服務(wù)程序的入口地址的各個(gè)字節(jié)按照一定的規(guī)則排列起來,構(gòu)成的一個(gè)有特定含義的數(shù)據(jù)組合稱為“中斷向量”或“中斷矢量”。8088系統(tǒng)規(guī)定其中斷服務(wù)程序入口地址的4個(gè)字節(jié)的排列規(guī)則是:(偏移地址低字節(jié),偏移地址高字節(jié),段地址低字節(jié),段地址高字節(jié))為了說明的方便,中斷向量通常都用十六進(jìn)制書寫。比如某中斷服務(wù)程序的入口地址在F000:EF05處,表示成中斷向量就是:(05,EF,00,F0)9.中斷向量10.中斷向量表8088系統(tǒng)中共有256個(gè)中斷源,每個(gè)中斷源都有自己的中斷向量,把所有這些中斷向量集中起來,按照中斷號(hào)由0到255的順序,從內(nèi)存物理地址為0處開始依次存放,構(gòu)成一張“中斷向量表”。每個(gè)計(jì)算機(jī)系統(tǒng)的中斷向量表都有自己固定的位置和長(zhǎng)度,8088系統(tǒng)是把這張表放在內(nèi)存的最低端,共占用1024個(gè)字節(jié)。圖8.4是中斷向量表的示意圖。10.中斷向量表00000 0號(hào)中斷服務(wù)程序偏移地址低字節(jié)00001 0號(hào)中斷服務(wù)程序偏移地址高字節(jié)00002 0號(hào)中斷服務(wù)程序段地址低字節(jié)000030號(hào)中斷服務(wù)程序段地址高字節(jié)000041號(hào)中斷服務(wù)程序偏移地址低字節(jié)00005 1號(hào)中斷服務(wù)程序偏移地址高字節(jié)00006 1號(hào)中斷服務(wù)程序段地址低字節(jié)00007 1號(hào)中斷服務(wù)程序段地址高字節(jié)000082號(hào)中斷服務(wù)程序偏移地址低字003FF0FFH號(hào)中斷服務(wù)程序段地址高字節(jié)…00000 0號(hào)中斷服務(wù)程序偏移地址低字節(jié)00001 11.中斷嵌套在CPU執(zhí)行一個(gè)低級(jí)別的中斷服務(wù)程序時(shí),如果系統(tǒng)中又產(chǎn)生了一個(gè)高級(jí)別的中斷請(qǐng)求,這時(shí)系統(tǒng)會(huì)暫停低級(jí)中斷服務(wù),優(yōu)先處理高級(jí)別中斷,處理完后再繼續(xù)低級(jí)中斷服務(wù)。這種高級(jí)別中斷打斷低級(jí)別中斷服務(wù)的現(xiàn)象稱為中斷嵌套。中斷嵌套的典型例子是,在一個(gè)中斷服務(wù)程序中,需要在屏幕上顯示一些信息,屏幕顯示需要用到后面將要說明的10H號(hào)中斷調(diào)用,因此在中斷服務(wù)程序中就會(huì)寫有INT10H指令。這是一條內(nèi)中斷調(diào)用指令,是最高級(jí)別的中斷,在執(zhí)行到該指令時(shí),系統(tǒng)會(huì)轉(zhuǎn)去先進(jìn)行10H號(hào)中斷服務(wù),在屏幕上進(jìn)行顯示,10H號(hào)中斷返回后,再繼續(xù)原先低級(jí)別的中斷服務(wù)。11.中斷嵌套

8.4.2中斷處理過程不論是軟中斷還是硬中斷,當(dāng)CPU響應(yīng)中斷時(shí),自動(dòng)完成下列操作:(1)取中斷號(hào)n(中斷源識(shí)別)。(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個(gè)字節(jié)的n號(hào)中斷的中斷向量,設(shè)取出的數(shù)據(jù)依次是b0、b1、b2、b3,把(b1,b0)拼成一個(gè)字型數(shù)據(jù)送到IP中,(b3,b2)拼成一個(gè)字型數(shù)據(jù)送到CS中。8.4.2中斷處理過程(7)按CS:IP的新值繼續(xù)執(zhí)行。這些操作是由硬件自動(dòng)完成的,是CPU響應(yīng)中斷這一過程中密不可分的幾個(gè)步驟,不能把它們拆開來,理解作依次執(zhí)行幾條指令的結(jié)果。響應(yīng)中斷的過程中,有三個(gè)字型數(shù)據(jù)被入棧保護(hù),其中包括CS和IP。CS與IP的專職就是存放下一條指令的邏輯地址,它們的值被入棧保護(hù),就意味著將來可以從棧中取出保存的值,恢復(fù)被中斷的程序繼續(xù)執(zhí)行,就像子程序調(diào)用與返回一樣。響應(yīng)過程中的第(6)個(gè)操作是把CS和IP修改為n號(hào)中斷向量的值,也就是把CS和IP改為n號(hào)中斷服務(wù)程序的入口地址,繼而轉(zhuǎn)入中斷服務(wù)程序執(zhí)行。當(dāng)中斷服務(wù)完成后,在服務(wù)程序的最后有一條特別的指令I(lǐng)RET作為結(jié)束。該指令將把中斷時(shí)入棧保存的三個(gè)字型數(shù)據(jù)分別恢復(fù)到原出處,使CPU從中斷服務(wù)程序轉(zhuǎn)回到中斷時(shí)的程序繼續(xù)執(zhí)行。(7)按CS:IP的新值繼續(xù)執(zhí)行。

8.4.3與中斷有關(guān)的指令在中斷的有關(guān)概念描述中多次提到軟中斷是CPU執(zhí)行中斷指令時(shí)產(chǎn)生的中斷,除了中斷指令外,中斷服務(wù)程序結(jié)束時(shí)也需要執(zhí)行一條特殊的指令,以告訴CPU中斷服務(wù)到此為止。關(guān)于2級(jí)中斷的屏蔽標(biāo)志位IF還有兩條專用指令,分別說明如下?!局噶罡袷健縄NTn【功能】產(chǎn)生一次n號(hào)中斷請(qǐng)求。由于這是中斷指令,屬于內(nèi)中斷,具有最高級(jí)別,CPU必然響應(yīng),因此該指令將導(dǎo)致一次n號(hào)中斷處理過程。具體的操作見8.4.2節(jié)中的中斷響應(yīng)時(shí)硬件自動(dòng)完成的動(dòng)作。8.4.3與中斷有關(guān)的指【說明】(1)指令格式中的n是一個(gè)立即數(shù),用以代表中斷號(hào),有效范圍是0到255。(2)這是一條放在用戶程序中的指令,與隨時(shí)可能發(fā)生的硬件中斷不同,這是程序員有意識(shí)地安排在程序中的一個(gè)中斷,因而程序員很清楚這個(gè)中斷指令執(zhí)行的效果。這樣使用的中斷,其服務(wù)程序往往是系統(tǒng)預(yù)先編寫好的一些專用子程序,完成一些特定的服務(wù)功能,供用戶程序使用,就比如DOS提供的服務(wù)程序讓用戶程序以INT?21H指令去調(diào)用一樣。這類程序段與子程序不同的是,它們?cè)谙到y(tǒng)啟動(dòng)時(shí)就已進(jìn)入內(nèi)存中,不需要像子程序那樣與調(diào)用它的程序相聯(lián)接。因此,習(xí)慣上又把這類程序段稱為中斷服務(wù)子程序,當(dāng)作子程序一樣使用,只是調(diào)用方式不同而已?!菊f明】(3)指令格式中的n只要求在0到255之間,沒有其它的限制。也就是說,不論是哪一個(gè)中斷源,包括應(yīng)該由硬件引起的外中斷源,只要知道它的中斷號(hào),就可以用一條INT指令產(chǎn)生一次中斷調(diào)用。但對(duì)硬件中斷對(duì)應(yīng)的0號(hào)、8號(hào)到0FH號(hào),以及70H到77H號(hào),用INT指令去調(diào)用可能產(chǎn)生一些意想不到的結(jié)果,也有可能造成死機(jī)。【指令格式】IRET【功能】從棧中彈出3個(gè)字,第1個(gè)彈出的送到IP,第2個(gè)到CS,第3個(gè)到PSW。(3)指令格式中的n只要求在0到255之間,沒有【說明】這是專門為中斷服務(wù)程序設(shè)計(jì)的一條指令,通常是中斷服務(wù)程序的最后一條指令,它的功能與中斷響應(yīng)時(shí)硬件自動(dòng)完成的動(dòng)作相對(duì)應(yīng),從而保證不論是硬中斷還是軟中斷,在中斷服務(wù)結(jié)束后,CPU都能回到正確的位置繼續(xù)執(zhí)行?!局噶罡袷健緾LI【功能】把標(biāo)志寄存器的IF標(biāo)志位清0,使CPU不響應(yīng)可屏蔽外中斷?!局噶罡袷健縎TI【功能】把標(biāo)志寄存器的IF標(biāo)志位置1,允許CPU響應(yīng)可屏蔽外中斷?!菊f明】這是專門為中斷服務(wù)程序設(shè)計(jì)的一條指令,通常是中CLI與STI指令總是配合使用,使得計(jì)算機(jī)系統(tǒng)在某一段時(shí)間內(nèi)不響應(yīng)任何可屏蔽外中斷請(qǐng)求。CLI是屏蔽掉所有2級(jí)中斷的簡(jiǎn)單方法,但在應(yīng)用時(shí)請(qǐng)小心,如果用戶程序執(zhí)行過程中屏蔽了所有2級(jí)中斷,將使得系統(tǒng)不能從鍵盤、鼠標(biāo)等輸入設(shè)備上接收數(shù)據(jù),這將使操作人員失去對(duì)機(jī)器的控制。所以,總是在屏蔽2級(jí)中斷一段時(shí)間以后再把它打開。在程序中屏蔽中斷的一個(gè)很好的理由,是不想要自己的程序在需要連續(xù)執(zhí)行時(shí)被硬件服務(wù)打斷,這通常是用在程序中需要執(zhí)行一些不能暫停的任務(wù)的情況下。CLI與STI指令總是配合使用,使得計(jì)算機(jī)系統(tǒng)

8.4.4系統(tǒng)提供的中斷服務(wù)子程序當(dāng)計(jì)算機(jī)啟動(dòng)成功之后,內(nèi)存中已經(jīng)存放了很多具有固定功能的子程序,操作系統(tǒng)DOS提供的以INT21H的形式調(diào)用的子程序只是其中的一部分,還有一部分是BIOS中斷服務(wù)子程序,以及已裝載的程序所提供的功能。DOS提供的中斷服務(wù)子程序分成很多子功能,完成各個(gè)子功能的程序段都集中放在一起,并且有一個(gè)總控程序,構(gòu)成了一個(gè)整體。整個(gè)中斷服務(wù)子程序的入口地址放在了21H號(hào)中斷向量中。這是一個(gè)軟件中斷,調(diào)用方式是INT指令,并規(guī)定調(diào)用時(shí)AH中必須放子功能號(hào),不同的子功能還需要有不同的入口參數(shù)。前面章節(jié)中已經(jīng)講述了其中的1號(hào)、2號(hào)、9號(hào)、0AH號(hào)和4CH號(hào)子功能,實(shí)際上DOS提供給用戶程序使用的子功能很多,包括如何讀寫文件、如何申請(qǐng)和釋放內(nèi)存、如何修改中斷向量、如何取得及修改系統(tǒng)當(dāng)前的日期和時(shí)間等等,不能一一列舉。8.4.4系統(tǒng)提供的中斷服務(wù)子程序BIOS是固化在計(jì)算機(jī)的內(nèi)存ROM芯片中的程序,其中包括計(jì)算機(jī)啟動(dòng)時(shí)最初執(zhí)行的一些程序,從設(shè)備自檢、系統(tǒng)初始化,到引導(dǎo)操作系統(tǒng)。BIOS中還有很大一部分是提供了一些可供用戶程序使用的中斷服務(wù)子程序,這些子程序都用于對(duì)外部設(shè)備的直接控制,主要涉及鍵盤、顯示器、打印機(jī)、串行通訊等,由于這些設(shè)備的控制方法比較復(fù)雜,如果讓應(yīng)用程序直接用輸入輸出命令去控制,就會(huì)給程序的編制帶來巨大的障礙。而這些設(shè)備的控制程序雖然較長(zhǎng),但都有一個(gè)固定的模式,適合于做成公共子程序的形式供各個(gè)程序調(diào)用,BIOS中就是存放著這樣的子程序。各個(gè)主要的輸入輸出設(shè)備都有相應(yīng)的子程序,這些子程序分在了各個(gè)中斷服務(wù)程序當(dāng)中,包括10H、14H、16H、17H號(hào)等幾個(gè)中斷。BIOS是固化在計(jì)算機(jī)的內(nèi)存ROM芯片中的程8.4.5中斷與子程序的比較子程序是程序設(shè)計(jì)的一種常用方法,一般是把具有固定功能、在程序中無規(guī)律重復(fù)使用的程序段做成子程序,在需要的地方調(diào)用;中斷是計(jì)算機(jī)系統(tǒng)支持的一種重要功能,當(dāng)發(fā)生中斷時(shí),系統(tǒng)執(zhí)行一段特定的程序。根據(jù)中斷源的不同,需要把中斷分為軟件中斷與硬件中斷分別看待,軟件中斷、硬件中斷與子程序之間有一些共同之處:(1)都需要相應(yīng)程序段的支持。發(fā)生子程序調(diào)用時(shí),系統(tǒng)轉(zhuǎn)去執(zhí)行一段子程序,并在執(zhí)行完后返回調(diào)用處繼續(xù)執(zhí)行;發(fā)生中斷時(shí),系統(tǒng)也是轉(zhuǎn)去執(zhí)行一段中斷服務(wù)程序,執(zhí)行完后返回中斷點(diǎn)繼續(xù)執(zhí)行。被調(diào)用的程序段一定要在內(nèi)存中。8.4.5中斷與子程序的比較(2)軟件中斷與子程序都由特定指令調(diào)用。軟件中斷由指令I(lǐng)NTn調(diào)用,子程序調(diào)用指令是“CALL子程序名”。不論是中斷還是子程序調(diào)用,都會(huì)使系統(tǒng)修改CS和IP從而實(shí)現(xiàn)轉(zhuǎn)向。(3)發(fā)生調(diào)用時(shí),系統(tǒng)自動(dòng)記載返回地址。不論是中斷還是子程序調(diào)用,系統(tǒng)在轉(zhuǎn)入子程序/中斷服務(wù)程序之前,都會(huì)把返回地址(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號(hào)中斷向量在中斷向量表中的偏移地址 PUSHF CALL FARPTR[BX] ;以子程序調(diào)用的CALL指令去調(diào)用21H號(hào)中斷服務(wù)子程序(5)可以用子程序調(diào)用代替軟件中斷的調(diào)用指令。IN特別的是,這種用法很不合常規(guī),并且上述程序段中的最后一條指令在MASM5.0下會(huì)出現(xiàn)語法錯(cuò)誤。解決這個(gè)問題的方法是,編程人員手工地把這條指令翻譯成機(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)用,而硬件中斷是由硬件提出申請(qǐng),不需要任何指令。(2)系統(tǒng)保護(hù)的值不同。中斷調(diào)用時(shí),系統(tǒng)會(huì)把標(biāo)志寄存器、CS和IP入棧保存,而子程序調(diào)用時(shí),系統(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)存的哪一個(gè)地方,也不需要把中斷服務(wù)程序與調(diào)用它的程序拼裝到一起。子程序的共享方式比較豐富,但有一點(diǎn),就是被調(diào)用的子程序必須與調(diào)者拼裝在一起,形成最終的執(zhí)行文件。(5)在內(nèi)存中存在的時(shí)間不同。中斷服務(wù)程序通常是長(zhǎng)期保留在內(nèi)存中,而子程序是隨可執(zhí)行文件一起進(jìn)入內(nèi)存,當(dāng)可執(zhí)行文件執(zhí)行完后,子程序所占用的內(nèi)存也隨之釋放。(4)共享方式不同。硬件中斷的服務(wù)程序不能被其它*8.4.6編寫中斷服務(wù)程序中斷服務(wù)程序一般是長(zhǎng)期保留在內(nèi)存中的,在用戶程序結(jié)束后還能夠被其它應(yīng)用程序調(diào)用,或者是CPU在響應(yīng)硬件中斷時(shí)調(diào)用。因此,編寫一個(gè)中斷服務(wù)子程序還需要掌握以下技術(shù):如何讓一段程序常駐內(nèi)存,如何修改中斷向量使其指向新的中斷服務(wù)程序。8.4.6.1常駐內(nèi)存技術(shù)內(nèi)存是由操作系統(tǒng)管理的,DOS專門為駐留程序設(shè)計(jì)了一個(gè)功能調(diào)用?!抉v留方法】在AH中放31H,在DX中放需要駐留的程序的節(jié)長(zhǎng)度,然后以INT21H指令調(diào)用DOS的結(jié)束并駐留子功能。*8.4.6編寫中斷服務(wù)程序【說明】(1)駐留前要告訴DOS,駐留程序的長(zhǎng)度是多少。方法是把駐留長(zhǎng)度放在DX中,長(zhǎng)度單位是“節(jié)”而不是字節(jié),1節(jié)等于16個(gè)字節(jié)。如果需要駐留的程序長(zhǎng)度是n字節(jié),則DX的值可通過下面的計(jì)算式算得:DX=(n÷10H)+1+10H其中(n÷10H)+1是計(jì)算出駐留程序需要多少“節(jié)”,加1是為了預(yù)防駐留程序以字節(jié)計(jì)算的長(zhǎng)度不是16的整數(shù)倍。再加16節(jié)是因?yàn)槊總€(gè)程序在調(diào)入內(nèi)存時(shí),操作系統(tǒng)都為它安排了一個(gè)稱為“程序段前綴(PSP)”的專用內(nèi)存區(qū),并且放在程序的前面,這個(gè)程序段前綴的長(zhǎng)度是256字節(jié),剛好16節(jié),它必須與需要駐留的程序一起駐留在內(nèi)存?!菊f明】如果一個(gè)應(yīng)用程序中編寫了一段程序需要常駐內(nèi)存,總是把這段程序?qū)懺诖a段的最前面,如果數(shù)據(jù)段也需要駐留,則應(yīng)該數(shù)據(jù)段在前,代碼段在后。計(jì)算駐留長(zhǎng)度時(shí),應(yīng)該把數(shù)據(jù)段的長(zhǎng)度加上代碼段中駐留部分的長(zhǎng)度一起計(jì)算。比如,一個(gè)應(yīng)用程序由代碼段、數(shù)據(jù)段、堆棧段構(gòu)成,數(shù)據(jù)段的各個(gè)變量總共占據(jù)200個(gè)字節(jié),代碼段中需要駐留的部分有500個(gè)字節(jié),則段的編排次序應(yīng)該是數(shù)據(jù)段、代碼段、堆棧段,因?yàn)槎褩6问遣恍枰v留的,駐留節(jié)長(zhǎng)度是:

如果一個(gè)應(yīng)用程序中編寫了一段程序需要常駐內(nèi)存數(shù)據(jù)段:200B÷16+1=13節(jié)代碼段:500B÷16+1=32節(jié)PSP:16節(jié)──────────────總計(jì):66節(jié)因此,調(diào)用DOS的31H號(hào)子功能進(jìn)行程序駐留前,必須把DX置為66,即42H。數(shù)據(jù)段:200B÷16+1=13節(jié)8.4.6.2修改中斷向量的技術(shù)由于中斷向量共有4個(gè)字節(jié),8088指令系統(tǒng)中最多只能一次送16位的字型數(shù)據(jù)到內(nèi)存,所以修改中斷向量至少要用兩條指令才能完成。在修改中斷向量時(shí)還必須保證一點(diǎn),就是不能允許在修改過程中(只修改了其中的1個(gè)字時(shí))產(chǎn)生相應(yīng)號(hào)的中斷請(qǐng)求,因?yàn)檫@時(shí)中斷向量還是一種不完整的狀態(tài)。即使產(chǎn)生了相應(yīng)的中斷請(qǐng)求也必須能屏蔽掉,保證修改的連續(xù)性和中斷向量的完整性。比較好的方法是利用DOS提供的一個(gè)子功能進(jìn)行修改?!驹O(shè)置中斷向量】入口參數(shù):AH=25HAL=中斷號(hào)DS:DX=新的中斷服務(wù)程序的入口地址調(diào)用:INT21H8.4.6.2修改中斷向量的技術(shù)8.4.6.3中斷編程實(shí)例8088系統(tǒng)中有一個(gè)定時(shí)器,它每隔約0.05秒向CPU發(fā)出一次8號(hào)中斷請(qǐng)求,這是一個(gè)硬中斷,不受程序的控制。8號(hào)中斷服務(wù)程序中有一條調(diào)用1CH號(hào)中斷的指令,而1CH號(hào)中斷是一個(gè)可供用戶使用的中斷,它只由8號(hào)中斷調(diào)用,與硬中斷有類似的效果。下面就利用1CH號(hào)中斷,編寫一個(gè)時(shí)鐘程序?!纠?.4】編寫一個(gè)時(shí)鐘程序,要求把時(shí)鐘信號(hào)顯示在屏幕的右上角,并在程序結(jié)束后常駐內(nèi)存。

8.4.6.3中斷編程實(shí)例【分析】由于系統(tǒng)每隔0.05秒就產(chǎn)生一次1CH號(hào)中斷,因此在1CH號(hào)中斷服務(wù)程序中應(yīng)該有一個(gè)0到20的計(jì)數(shù)器,初值為20。每次中斷調(diào)用該服務(wù)程序時(shí),就把計(jì)數(shù)器的值減1,當(dāng)計(jì)數(shù)器的值沒減到0時(shí),說明還沒有中斷20次,即不足1秒鐘,因而不需要更新鐘的讀數(shù)。當(dāng)計(jì)數(shù)值到0后,就需要讓時(shí)鐘向前走1秒,把秒數(shù)加1,若滿60秒則向分鐘數(shù)進(jìn)1,分鐘數(shù)滿60后再向小時(shí)數(shù)進(jìn)1,小時(shí)數(shù)滿24就清0,并且要把已走了1秒的鐘的當(dāng)前讀數(shù)顯示在屏幕上。另外,為了計(jì)數(shù)下一秒,還要把0到20的計(jì)數(shù)器重新置初值20。處理完這些工作后,中斷結(jié)束并返回。主程序需要完成以下工作:把1CH號(hào)中斷向量改為新的中斷服務(wù)程序的入口地址,讓新的中斷服務(wù)程序常駐內(nèi)存。

【分析】由于系統(tǒng)每隔0.05秒就產(chǎn)生一次1CH【解】codeSEGMENTASSUMECS:code,DS:codeclockPROCFARDECCS:[x];計(jì)數(shù)器減1JZc2;滿1秒轉(zhuǎn)JMPcend;不足1秒,直接轉(zhuǎn)中斷結(jié)束c2:PUSHDSPUSHESPUSHAXPUSHBXPUSHCX【解】PUSHDXPUSHSIPUSHDI;保護(hù)現(xiàn)場(chǎng)PUSHCSPOPDSMOV[x],20;對(duì)0到20的計(jì)數(shù)器重新賦初值INC[s];秒數(shù)加1CMP[s],60JBc1;不滿60秒轉(zhuǎn)MOV[s],0;計(jì)滿60秒后,秒數(shù)清0INC[m];分鐘數(shù)加1CMP[m],60PUSHDXJBc1;不滿60分鐘轉(zhuǎn)MOV[m],0;計(jì)滿60分鐘后,分鐘數(shù)清0INC[h];小時(shí)數(shù)加1CMP[h],24JBc1;不滿24小時(shí)轉(zhuǎn)MOV[h],0 ;計(jì)滿24小時(shí)后,小時(shí)數(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í)數(shù)拆分成兩位ASCII送入變量t處MOV[t+6],AX;把秒鐘數(shù)拆分成兩位AMOVCX,8CLDMOVAX,0B800HMOVES,AX;取顯示緩沖區(qū)段地址MOVAH,1FH;時(shí)鐘讀數(shù)的字符屬性,蘭底,高亮度白字LEASI,[t]MOVDI,71*2MOVCX,8c3:LODSBSTOSWLOOPc3;以直寫屏方式顯示,參見下一章POPDI POPSIPOPDXPOPCXPOPBXPOPAXPOPESPOPDSc3:LODSBcend:IRETtDB'00:00:00';存放時(shí)鐘讀數(shù)的變量hDB0;計(jì)小時(shí)數(shù)的變量mDB0;計(jì)分鐘數(shù)的變量sDB0;計(jì)秒鐘數(shù)的變量xDB20;0到20次的計(jì)數(shù)變量clockENDPmain:MOVAX,codeMOVDS,AXMOVAH,2CHcend:IRETINT21H;取當(dāng)前系統(tǒng)時(shí)間MOV[h],CH;置小時(shí)數(shù)初值MOV[m],CL;置分鐘數(shù)初值MOV[s],DH;置秒鐘數(shù)初值LEADX,clockMOVAX,251CHINT21H;置1CH號(hào)中斷向量,使指向CLOCK子程序MOVAX,3100HLEADX,mainINT21HMOVCL,4SHRDX,CLADDDX,11H;計(jì)算駐留程序的節(jié)長(zhǎng)度INT21H;結(jié)束并駐留RETcodeENDSENDmainMOVCL,4本

點(diǎn)輸入輸出設(shè)備是計(jì)算機(jī)對(duì)外發(fā)揮作用的途徑。不同的外設(shè)有各自的特點(diǎn),需要不同的控制方法,但總的來說,外設(shè)都需要通過一個(gè)接口部件與計(jì)算機(jī)的主機(jī)相連。接口負(fù)責(zé)主機(jī)內(nèi)外的信號(hào)轉(zhuǎn)達(dá),接口通常包括命令部件、數(shù)據(jù)部件和狀態(tài)部件三大組成部分,每個(gè)部件占用一個(gè)或多個(gè)端口地址。輸入輸出的主要方式有4種。直接方式適用于那些能與主機(jī)速度相匹配的外設(shè),查詢和中斷方式則用于速度較慢、控制較復(fù)雜的外設(shè),而DMA方式提供了一種不通過CPU直接在主機(jī)與內(nèi)存之間進(jìn)行高速數(shù)據(jù)傳遞的方法。用戶可以編寫程序?qū)σ灾苯臃绞?、查詢方式、中斷方式工作的外設(shè)進(jìn)行操作控制。中斷是CPU的一種重要工作方式,由中斷源發(fā)出中斷請(qǐng)求信號(hào)開始,經(jīng)過中斷源識(shí)別、現(xiàn)場(chǎng)保護(hù)、執(zhí)行中斷服務(wù)程序、現(xiàn)場(chǎng)恢復(fù)的過程,使CPU在完成中斷服務(wù)后能接著被中斷的程序繼續(xù)執(zhí)行。本章要點(diǎn)習(xí)

八8.1用圖8.5的例子解釋中斷處理的全過程。8.2現(xiàn)實(shí)生活中有如下現(xiàn)象:某人的辦公桌上放了紅色和白色兩部電話機(jī)、一臺(tái)收錄機(jī),他正在聽一段錄音。試把下列各項(xiàng)與計(jì)算機(jī)的中斷相對(duì)比:(1)電話鈴響。(2)判斷是哪一部電話響鈴。(3)兩部電話同時(shí)響鈴時(shí)先接紅色。(4)按下錄音機(jī)暫停鍵。(5)接電話。(6)按起錄音機(jī)暫停鍵。習(xí)題八(7)電話鈴響但不接電話。(8)拔掉白色電話機(jī)的電話線。(9)接聽白色電話時(shí)紅色電話機(jī)響鈴,放下白色電話去接紅色電話。8.3在例8.2的基礎(chǔ)上,編寫一個(gè)控制計(jì)算機(jī)的揚(yáng)聲器發(fā)聲的子程序,以發(fā)出聲音的頻率和維持發(fā)聲時(shí)間的長(zhǎng)短為兩個(gè)入口參數(shù)。8.4控制計(jì)算機(jī)上的揚(yáng)聲器發(fā)出音樂聲,樂曲自選。8.5IRET指令與RET指令有什么異同?能否用RET

2或者RET指令代替中斷服務(wù)程序的結(jié)束指令I(lǐng)RET?為什么?8.6為例8.4的時(shí)鐘程序增加一項(xiàng)功能:每當(dāng)整點(diǎn)時(shí)(即分鐘數(shù)和秒鐘數(shù)都為0)時(shí),讓揚(yáng)聲器產(chǎn)生一次報(bào)時(shí)聲。(7)電話鈴響但不接電話。8.7設(shè)計(jì)以中斷方式驅(qū)動(dòng)打印機(jī)的程序流程圖。8.8比較4種輸入輸出方式的特點(diǎn),并說明為什么使用直接方式的外設(shè)并不多。8.9說明一般接口的基本構(gòu)成,分別列舉三大部件的作用。8.10有下面的程序段:PUSHAXMOVAH,1INT21HMOVDL,ALPOPAX當(dāng)系統(tǒng)執(zhí)行到MOV

DL,AL指令時(shí),定時(shí)器產(chǎn)生了一次8號(hào)中斷請(qǐng)求,且IF=1。試說明該程序段執(zhí)行期間堆棧的變化情況。8.7設(shè)計(jì)以中斷方式驅(qū)動(dòng)打印機(jī)的程序流程圖。第8章輸入輸出方法

8.1輸入輸出的基本概念

8.2無條件方式輸入輸出

8.3查詢方式輸入輸出

8.4中斷方式輸入輸出

本章要點(diǎn)

習(xí)題八返回章目錄第8章輸入輸出方法返回章目錄8.1輸入輸出的基本概念

從第2章的圖2.1可以看到,計(jì)算機(jī)的硬件系統(tǒng)由CPU、內(nèi)存、外設(shè)三大部分構(gòu)成,它們相互之間通過一組信息傳遞的公共通道──總線聯(lián)系在一起的。CPU和內(nèi)存構(gòu)成了計(jì)算機(jī)的主機(jī)部分,是計(jì)算機(jī)中的高速設(shè)備。而大多數(shù)外部設(shè)備都是慢速設(shè)備,用來把從主機(jī)以外采集到的數(shù)據(jù)送入主機(jī)內(nèi)部,或者把主機(jī)內(nèi)的數(shù)據(jù)傳遞到外部,外設(shè)中的外部存儲(chǔ)器還可以存儲(chǔ)大量的數(shù)據(jù)。那么,CPU作為計(jì)算機(jī)的核心,它又是如何控制外設(shè)的呢?8.1輸入輸出的基本概念

8.1.1外設(shè)接口外部設(shè)備的種類繁多,功能各不相同,控制的方法也各式各樣。很多外設(shè)由于速度與信號(hào)的關(guān)系,無法直接連接在總線上與主機(jī)進(jìn)行數(shù)據(jù)交換,需要在系統(tǒng)總線與外設(shè)之間設(shè)置一個(gè)“適配器”,又稱為“接口”,用于把CPU來的控制命令轉(zhuǎn)換成外設(shè)的控制信號(hào),把外設(shè)的工作情況轉(zhuǎn)換成CPU可以讀取并處理的狀態(tài)信號(hào)。接口部件擔(dān)負(fù)著總線信號(hào)與外設(shè)信號(hào)的轉(zhuǎn)接工作。它一頭與外設(shè)相連,能夠從外設(shè)接收數(shù)據(jù)或向外設(shè)發(fā)出信號(hào),另一頭連接在系統(tǒng)總線上,能夠直接接收來自總線的數(shù)據(jù)和控制信號(hào),或者在適當(dāng)?shù)臅r(shí)候往總線發(fā)送數(shù)據(jù)。8.1.1外設(shè)接口CPU能夠與內(nèi)

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論