第八章輸入輸出程序設(shè)計_第1頁
第八章輸入輸出程序設(shè)計_第2頁
第八章輸入輸出程序設(shè)計_第3頁
第八章輸入輸出程序設(shè)計_第4頁
第八章輸入輸出程序設(shè)計_第5頁
已閱讀5頁,還剩54頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第八章輸入輸出程序設(shè)計第一頁,共五十九頁,2022年,8月28日本章內(nèi)容提要I/O設(shè)備的數(shù)據(jù)傳送方式程序直接控制I/O方式中斷傳送方式第二頁,共五十九頁,2022年,8月28日8.1I/O設(shè)備的數(shù)據(jù)傳動方式1CPU與外設(shè)2直接存儲器存?。―MA)方式第三頁,共五十九頁,2022年,8月28日8.1.1CPU與外設(shè)與CPU進行數(shù)據(jù)交換的,除了存儲器外,還有輸入輸出設(shè)備(統(tǒng)稱為外設(shè))。輸入IN和輸出OUT指令,可以從外設(shè)讀取數(shù)據(jù)和向外設(shè)提供數(shù)據(jù)。由于外設(shè)種類繁多,其工作原理、數(shù)據(jù)格式、操作時序等各異,所以在處理器與外設(shè)之間還有一個協(xié)調(diào)兩者數(shù)據(jù)傳送的邏輯電路,稱為輸入輸出(I/O)接口電路。處理器并不直接操縱外設(shè),而是通過I/O接口來控制外設(shè)。第四頁,共五十九頁,2022年,8月28日I/O接口電路中的寄存器I/O接口電路呈現(xiàn)給程序員的,是各種可編程寄存器。這些寄存器可以分成三類:數(shù)據(jù)寄存器——它保存和處理與外設(shè)間交換的數(shù)據(jù);控制寄存器——處理器通過它對外設(shè)進行控制,也稱命令寄存器;狀態(tài)寄存器——外設(shè)的當前工作狀態(tài)通過它向處理器提供。在涉及外設(shè)操作的輸入輸出程序中,各種寄存器以I/O地址(端口)體現(xiàn);對應(yīng)三類寄存器分別稱為:數(shù)據(jù)端口、控制端口、狀態(tài)端口。第五頁,共五十九頁,2022年,8月28日CPU與外設(shè)數(shù)據(jù)傳送方式程序直接控制傳送方式程序查詢I/O方式中斷傳送方式直接存儲器存?。―MA)方式第六頁,共五十九頁,2022年,8月28日8.1.2直接存儲器存?。―MA)方式主要由硬件DMA控制器實現(xiàn)其傳送功能。DMA(directmemoryaccess)方式,也稱為成組數(shù)據(jù)傳送方式。主要用于一些高速的I/O設(shè)備。如磁帶、磁盤、A/D等設(shè)備。傳送數(shù)據(jù)時,每個字節(jié)一到達端口,就直接從接口送到存儲器;同樣,接口和它的DMA控制器也能直接從存儲器取出字節(jié)并把它送到I/O設(shè)備去。第七頁,共五十九頁,2022年,8月28日DMA工作原理DMA控制器(intel8237A)一般包括四個寄存器:

控制寄存器 狀態(tài)寄存器 地址寄存器 字節(jié)計數(shù)器在信息傳送前,應(yīng)初始化這些寄存器。

地址寄存器←要傳送的數(shù)據(jù)塊首地址;

字節(jié)寄存器←要傳送的數(shù)據(jù)長度(字節(jié)數(shù));

狀態(tài)寄存器←控制字,指出數(shù)據(jù)是輸入還是輸出,并啟動DMA操作。每個字節(jié)傳送后,地址寄存器加1,字節(jié)計數(shù)器減1。第八頁,共五十九頁,2022年,8月28日DMA傳送步驟由系統(tǒng)完成以下步驟:⑴DMA控制器向CPU發(fā)出HOLD信號,請求使用總線。⑵CPU發(fā)出響應(yīng)信號HOLD給DMA控制器,并將總線讓出,這時CPU放棄了對總線的控制,而DMA控制器獲得了總線控制權(quán)。⑶傳輸數(shù)據(jù)的存儲器地址(在地址寄存器中)通過總線發(fā)出。⑷傳輸?shù)淖止?jié)數(shù)通過數(shù)據(jù)總線進行傳送。⑸地址寄存器加1,以指向下一個要傳送的字節(jié)。⑹字節(jié)計數(shù)器減1。⑺如字節(jié)計數(shù)器非0,轉(zhuǎn)向第3步。⑻否則,DMA控制器撤銷總線請求信號HOLD,傳送結(jié)束第九頁,共五十九頁,2022年,8月28日8.2程序直接控制I/O方式1I/O端口2I/O指令3I/O程序舉例第十頁,共五十九頁,2022年,8月28日8.2.1I/O端口80x86中,I/O端口獨立編址,允許設(shè)置64K(65535)個8位端口,或32K(32768)個16位端口。CPU和內(nèi)存通過I/O端口與外設(shè)進行通信。表8.1列出了部分端口地址(十六進制)。第十一頁,共五十九頁,2022年,8月28日8.2.2I/O指令I(lǐng)N/OUT指令,即可傳送字節(jié)又可傳送字,使用的寄存器必須是AL或AX。直接尋址:尋址0~255號端口。間接尋址:所有端口,使用DX寄存器。IN AX,28HMOV DATA_WORD,AXIN AL,27HTEST AL,00000100HJNZ ERRORMOV DX,126HIN AL,DX ;端口126H OR AL,80H ;第7位控制成組數(shù)據(jù)傳送OUT DX,AL第十二頁,共五十九頁,2022年,8月28日8.2.3I/O程序舉例例8.1發(fā)聲子程序SOUND例8.2 查詢方式

打印字符程序PRT_CHAR例8.3 查詢方式 控制數(shù)據(jù)輸入第十三頁,共五十九頁,2022年,8月28日8.3中斷傳送方式18086的中斷分類2中斷向量表3中斷過程4中斷優(yōu)先級和中斷嵌套5中斷處理過程第十四頁,共五十九頁,2022年,8月28日中斷的相關(guān)概念

中斷是CPU和外設(shè)進行數(shù)據(jù)傳送的有效辦法。它可以避免因反復(fù)查詢外設(shè)狀態(tài)而浪費的時間,從而提高CPU的效率。中斷是一種使CPU中止正在執(zhí)行的程序而轉(zhuǎn)去處理特殊事件的操作。中斷源——引起中斷的事件。外部中斷(硬件中斷)——由外設(shè)控制器或協(xié)處理器引起的中斷。內(nèi)部中斷(軟件中斷)——由程序中安排的中斷指令I(lǐng)NT產(chǎn)生的中斷,或由CPU的某些錯誤結(jié)果產(chǎn)生的中斷。8080/8088的中斷源如圖8.3所示。第十五頁,共五十九頁,2022年,8月28日8.3.18086的中斷分類軟件中斷硬件中斷第十六頁,共五十九頁,2022年,8月28日1.軟件中斷軟件中斷又稱內(nèi)中斷。它通常由三種情況引起:由中斷指令I(lǐng)NT引起;由于CPU的某些錯誤引起;為調(diào)試程序(DEBUG)設(shè)置的中斷。第十七頁,共五十九頁,2022年,8月28日(1)中斷指令I(lǐng)NT引起的內(nèi)中斷CPU執(zhí)行完一條INTn指令后,會立即產(chǎn)生中斷,并調(diào)用系統(tǒng)中相應(yīng)的中斷處理程序來完成中斷功能,n指出中斷類型號。INT指令可以指定0~0FFH中的任何類型號。除系統(tǒng)占用的類型號之外,用戶還可利用為用戶保留的類型號擴充新的中斷處理功能。INTn、INTO、除法錯中斷都不能被禁止,而且比任何外部中斷的優(yōu)先級都高。第十八頁,共五十九頁,2022年,8月28日(2)處理CPU某種錯誤的中斷除法錯中斷:INT0在執(zhí)行除法時,如果除數(shù)為0或商超過了寄存器所能表達的范圍,則產(chǎn)生一個類型為0的中斷。溢出中斷:INTO 中斷類型號為4若溢出標志OF=1,則產(chǎn)生溢出中斷;否則,不產(chǎn)生中斷,CPU繼續(xù)運行原程序。該中斷的處理程序,主要是打印出一個錯誤信息,在處理結(jié)束后,不返回原程序繼續(xù)執(zhí)行,而是把控制權(quán)交給操作系統(tǒng)。如: ADD AX,VALUE INTO ;測試加法溢出第十九頁,共五十九頁,2022年,8月28日(3)為調(diào)試程序(DEBUG)設(shè)置的中斷

單步中斷:為尋找程序中的問題,進行單步工作(一次只執(zhí)行一條指令)。類型號為1。當單步標志位TF=1時,每條指令執(zhí)行后,CPU會自動產(chǎn)生單步中斷。使用單步中斷可以逐條指令地跟蹤程序的流程,觀察CPU每執(zhí)行一條指令后,各個寄存器及有關(guān)存儲單元的變化,從而指出和確定產(chǎn)生錯誤的原因。

斷點中斷:將程序分段,為每段設(shè)置一個斷點。中斷類型號為3。當CPU執(zhí)行到斷點時便產(chǎn)生中斷,可以檢查各寄存器及有關(guān)存儲單元的內(nèi)容。斷點可以設(shè)置在程序的任何的地方。第二十頁,共五十九頁,2022年,8月28日2.硬件中斷硬件中斷又稱外中斷。硬件中斷主要有兩種來源:非屏蔽中斷(NMI)——為電源錯、內(nèi)存或I/O總線的奇偶等異常事件的中斷保留的。中斷類型號為2??善帘沃袛唷獊碜愿鞣N外設(shè)的中斷。由外設(shè)的請求引起的中斷。可屏蔽中斷受中斷標志IF控制;非屏蔽中斷和IF位無關(guān)。第二十一頁,共五十九頁,2022年,8月28日可屏蔽中斷從外設(shè)發(fā)出中斷請求到CPU響應(yīng)中斷,有兩個控制條件起決定性作用:

該外設(shè)的中斷請求是否屏蔽——由中斷屏蔽寄存器(IMR)控制。

CPU是否允許響應(yīng)中斷——由標志寄存器(FLAGS)中的中斷允許位IF控制。第二十二頁,共五十九頁,2022年,8月28日中斷屏蔽寄存器中斷屏蔽寄存器的端口地址是21H,如圖8.4所示。中斷屏蔽寄存器可分別控制某個可屏蔽中斷源。在編寫中斷程序時,應(yīng)在主程序的初始化部分設(shè)置好中斷屏蔽寄存器,以確定允許用中斷方式工作的外部設(shè)備。;系統(tǒng)重設(shè)鍵盤中斷IN AL,21HMOV AL,11111101BOUT 21H,AL第二十三頁,共五十九頁,2022年,8月28日控制CPU的中斷允許標志IFCPU是否響應(yīng)中斷還與中斷允許標志IF有關(guān)。IF=0,CPU禁止響應(yīng)任何外設(shè)的中斷(關(guān)中斷);IF=1,允許CPU響應(yīng)外設(shè)的中斷請求(開中斷)。中斷允許標志IF是控制所有可屏蔽中斷的。當任何類型的中斷發(fā)生時,當前的FLAGS要入棧保存,然后清除IF位,進入中斷處理程序,如果允許在一個中斷處理程序的執(zhí)行過程中發(fā)生硬中斷,則必須用一條STI指令開中斷。當中斷返回時,恢復(fù)了原FLAGS的值,其中IF=1,則允許硬中斷再次發(fā)生。STI 設(shè)置中斷允許位(IF=1)CLI 清除中斷允許位(IF=0)第二十四頁,共五十九頁,2022年,8月28日中斷命令寄存器在一次中斷處理結(jié)束之前,還應(yīng)給8259A的可編程中斷控制器的中斷命令寄存器發(fā)出中斷結(jié)束命令(EOI:endofinterrupt),否則以后將屏蔽掉對同級中斷或低級中斷的處理。中斷命令寄存器的I/O端口地址為20H(如圖8.4所示)。在中斷處理過程中,也可利用EOI命令清除當前中斷請求,以響應(yīng)同級或低級中斷。;結(jié)束硬件中斷MOV AL,20HOUT 20H,AL第二十五頁,共五十九頁,2022年,8月28日8.3.2中斷向量表每個中斷都有一個中斷類型號。80x86可處理256種類型的中斷,類型號為0~0FFH。中斷向量表就是各類型中斷處理程序的入口地址表。存儲器的最低1.5KB,從0000~5FFH為系統(tǒng)占用,其中,最低的1KB,從0000~003FFH存放中斷向量表。256個中斷向量,每個中斷向量占4個字節(jié)。每類中斷向量的地址=中斷類型號×4。圖8.5給出了中斷向量表。表8.2給出了中斷向量表地址分配。圖8.6展示了中斷操作步驟。第二十六頁,共五十九頁,2022年,8月28日中斷操作步驟中斷操作步驟:取中斷類型號;計算中斷向量地址;取中斷向量,偏移地址送IP,段地址送DS;轉(zhuǎn)入中斷處理程序;中斷返回到INT指令的下一條指令。第二十七頁,共五十九頁,2022年,8月28日為中斷類型N設(shè)置中斷向量 MOV AX,0 MOV ES,AX MOV BX,N*4 MOV AX,OFFSETINTHAND MOV ES:WORDPTR[BX],AX MOV AX,SEGINTHAND MOV ES:WORDPTR[BX+2],AX …INTHAND: … IRET用戶可以利用保留的中斷類型號擴充自己需要的中斷功能,對新增加的中斷功能要在中斷類型表中建立相應(yīng)的中斷向量。第二十八頁,共五十九頁,2022年,8月28日使用DOS功能調(diào)用(21H)存取中斷向量例8.4 使用DOS功能調(diào)用存取中斷向量第二十九頁,共五十九頁,2022年,8月28日8.3.3中斷過程當中斷發(fā)生時,由中斷機構(gòu)自動完成下列操作:取中斷類型號N;標志寄存器(FLAGS)內(nèi)容入棧;當前代碼段寄存器(CS)內(nèi)容入棧;當前指令指針寄存器(IP)內(nèi)容入棧;禁止硬件中斷和單步中斷(IF=0,TF=0);從中斷向量表中取4×N的字內(nèi)容送IP,取4×N+2的字內(nèi)容送CS;轉(zhuǎn)中斷處理程序。如圖8.7的中斷過程示意圖。第三十頁,共五十九頁,2022年,8月28日8.3.4中斷優(yōu)先級和中斷嵌套8086規(guī)定的中斷優(yōu)先級次序為:優(yōu)先級 高 軟件中斷(除法錯,INTO,INT) 非屏蔽中斷(NMI) 可屏蔽中斷(INTR) 低 單步中斷可屏蔽中斷的優(yōu)先權(quán)分為八級,正常情況下,優(yōu)先級次序是:IR0,IR1,IR2,IR3,IR4,IR5,IR6,IR7定時器 打印機優(yōu)先級高 低第三十一頁,共五十九頁,2022年,8月28日8259A的中斷命令寄存器控制優(yōu)先級8259A的中斷命令寄存器的第6、7位控制各種中斷請求的優(yōu)先級次序。R SL0 0 正常優(yōu)先級方式0 1 清除由L2~L0指定的中斷請求1 0 各中斷優(yōu)先級依次左循環(huán)一個位置1 1 各中斷優(yōu)先級依次循環(huán)到由L2~L0指定的中斷 請求到達最低優(yōu)先級位置上 ;使優(yōu)先級次序再左循環(huán)一個位置MOV AL,10100000OUT 20H,AL ;IR6,IR7,IR0,IR1,IR2,IR3,IR4,IR5第三十二頁,共五十九頁,2022年,8月28日中斷嵌套中斷嵌套:正在運行的中斷處理程序,又被其他中斷源中斷的情況。80x86沒有規(guī)定中斷嵌套的深度(中斷程序又被中斷的層次),實際受堆棧容量的限制。一個中斷處理程序,在開中斷的情況下,可以被優(yōu)先級高于它的中斷源中斷。只有發(fā)出了EOI命令,清除正在執(zhí)行的中斷請求,才可以響應(yīng)同級或低級的中斷。

如圖8.8所示:正常優(yōu)先級方式下,優(yōu)先級中斷和中斷嵌套發(fā)生時的處理過程。第三十三頁,共五十九頁,2022年,8月28日8.3.5中斷處理程序主程序為響應(yīng)中斷所做的準備工作以及硬件(包括CPU和外設(shè)接口)自動完成以下動作:第三十四頁,共五十九頁,2022年,8月28日中斷響應(yīng)的特殊情況注意:設(shè)備發(fā)到CPU的中斷請求信號在時間上是隨機的,只要未被屏蔽的設(shè)備本身的狀態(tài)是準備好或空閑的,它就會向CPU請求中斷,如果此時CPU正在執(zhí)行一條指令,那么要等到這條指令執(zhí)行完后,才響應(yīng)中斷。加封鎖的指令(如LOCKMOVAX,BX)應(yīng)看作一條指令;對加重復(fù)前綴的指令(如REPMOVSB)要作為一個整體來處理,執(zhí)行一次重復(fù)串指令即可響應(yīng)中斷;對MOV、POP指令,如果處理對象是段寄存器,那么執(zhí)行完本條指令后,接著再執(zhí)行一條指令才響應(yīng)中斷。對STI和IRET指令,也要在該指令執(zhí)行完后,再執(zhí)行一條指令才響應(yīng)中斷。第三十五頁,共五十九頁,2022年,8月28日中斷處理子程序中斷處理子程序的編寫步驟:保存寄存器內(nèi)容;如允許嵌套,則開中斷(STI);處理中斷;關(guān)中斷(CLI);送中斷結(jié)束命令(EOI)給中斷命令寄存器;恢復(fù)寄存器內(nèi)容;返回被中斷的程序(IRET)。注意:CPU產(chǎn)生一次中斷,I/O設(shè)備只完成一個字節(jié)(或字)的輸入輸出,所以中斷處理程序所用的指針變量或數(shù)據(jù)變量一般應(yīng)設(shè)置存儲單元來保存。第三十六頁,共五十九頁,2022年,8月28日中斷程序設(shè)計舉例例8.5 響鈴 P300-303例8.6 鍵盤輸入、打印機輸出 P303-310例8.7 P310-313除數(shù)為0的中斷處理程序 第三十七頁,共五十九頁,2022年,8月28日練習(xí)與作業(yè)P313-314習(xí)題練習(xí): 8.5、8.6提交作業(yè): 8.12第三十八頁,共五十九頁,2022年,8月28日I/O接口電路示意圖處理器數(shù)據(jù)寄存器狀態(tài)寄存器控制寄存器輸入輸出設(shè)備數(shù)據(jù)總線控制總線地址總線外設(shè)數(shù)據(jù)狀態(tài)信號控制信號I/O接口電路第三十九頁,共五十九頁,2022年,8月28日表8.1I/O端口地址分配第四十頁,共五十九頁,2022年,8月28日

例8.1發(fā)聲程序-1這是一個最基本的控制揚聲器發(fā)出聲音的子程序。通過I/O指令使設(shè)備控制寄存器(I/O端口地址為61H)的第一位交替為0和1,而端口61H的第1位和揚聲器的脈沖門相連(見圖8.1),當?shù)?位由0變?yōu)?,延遲一會又由1變?yōu)?時,脈沖門就先打開后關(guān)閉,產(chǎn)生了一個脈沖電流。這個脈沖電流被放大后送到揚聲器使之發(fā)出了聲音。61H端口的第0位和一個振蕩器(2號定時器)相連,現(xiàn)在不用振蕩器產(chǎn)生聲音,所以把第0位置零。第四十一頁,共五十九頁,2022年,8月28日

例8.1發(fā)聲程序-2;入口參數(shù):聲音頻率BX=6000,發(fā)聲延遲CX=1000。 SOUND PROC NEAR PUSH AX PUSH DX MOV DX,CX IN AL,61H AND AL,11111100BTRIG: XOR AL,2 OUT 61H,AL MOV CX,BX ;控制脈沖門開關(guān)DELAY: ;的時間

第四十二頁,共五十九頁,2022年,8月28日

例8.1發(fā)聲程序-3 LOOP DELAY DEC DX JNE TRIG POP DX POP AX RETSOUND ENDP第四十三頁,共五十九頁,2022年,8月28日

圖8.1設(shè)備控制器通常一個外設(shè)的數(shù)據(jù)端口是8位的,而狀態(tài)與控制信息只需一位或兩位,所以不同外設(shè)的狀態(tài)和控制位可共用一個端口。61H端口的0、1位是控制揚聲器的,2~7位分別控制其他外部設(shè)備。第四十四頁,共五十九頁,2022年,8月28日程序查詢I/O方式這種CPU與外設(shè)交換信息的方式稱為查詢方式或等待方式。造成CPU必須查詢等待的主要原因是許多外設(shè)工作速度比較低。查詢方式的優(yōu)點:可以用程序安排幾個輸入輸出設(shè)備的先后優(yōu)先次序,最先查詢的設(shè)備,其工作的優(yōu)先級也最高。查詢方式的缺點:浪費了CPU的時間,而且由查詢轉(zhuǎn)向相應(yīng)的處理陳許的時間較長,尤其是在設(shè)備比較多的情況下。為了提高CPU的工作效率,可以采用中斷方式傳送數(shù)據(jù)。第四十五頁,共五十九頁,2022年,8月28日

例8.2打印字符程序-1采用查詢方式的打印字符程序。程序通過反復(fù)讀取并測試打印機的狀態(tài)來控制輸出。數(shù)據(jù)寄存器的端口地址為378H,狀態(tài)寄存器的端口地址為379H,控制寄存器的端口地址為37AH。它們各位的含義如圖8.2所示。第四十六頁,共五十九頁,2022年,8月28日

例8.2打印字符程序-2 .modelsmall .stack .datamess db ‘Printerisnormal’,0dh,0ahcount equ $-mess .code .startup mov si,offsetmess mov cx,countnext: mov dx,379hwait: in al,dx test al,80h測試狀態(tài)寄存器的第7位,如果為0,表示打印機忙,這時CPU不能送出打印數(shù)據(jù);所以程序再次循環(huán),直到第7位變?yōu)?,表示打印機空閑,程序才從數(shù)據(jù)區(qū)讀取一個字符送到打印機的數(shù)據(jù)寄存器。并由控制器發(fā)出一個選通信號(端口37AH的第0位),控制打印機將這個字符打印輸出。第四十七頁,共五十九頁,2022年,8月28日

例8.2打印字符程序-3 je wait mov al,[si] mov dx,378h out dx,al mov dx,37ah mov al,0dh out dx,al inc si loop next .exit 0 end第四十八頁,共五十九頁,2022年,8月28日

圖8.2打印機的狀態(tài)寄存器和控制寄存器第四十九頁,共五十九頁,2022年,8月28日

例8.3輪流查詢-1CPU要從3個設(shè)備輪流輸入數(shù)據(jù),PROC1、PROC2、PROC3分別是設(shè)備1、設(shè)備2和設(shè)備3的數(shù)據(jù)輸入程序,它們的狀態(tài)寄存器的端口地址分別是STAT1、STAT2、STAT3,這三個狀

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論