四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10_第1頁(yè)
四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10_第2頁(yè)
四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10_第3頁(yè)
四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10_第4頁(yè)
四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10_第5頁(yè)
已閱讀5頁(yè),還剩329頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第十章輸入/輸出程序設(shè)計(jì)學(xué)習(xí)目的:1)掌握計(jì)算機(jī)接口的概念2)掌握CPU如何和外部設(shè)備接口交換信息各種方法,以及CPU控制外部設(shè)備正常運(yùn)轉(zhuǎn)的基本原理.3)理解接口設(shè)計(jì)的大致過(guò)程和方法.4)掌握端口訪問(wèn)指令的功能、使用方法、尋址方式5)能夠理解簡(jiǎn)單的接口控制程序。6)掌握必要的DOS調(diào)用和BIOS調(diào)用,并且能夠在程序設(shè)計(jì)中正確使用。第十章輸入/輸出程序設(shè)計(jì)110.1計(jì)算機(jī)接口的基本構(gòu)成和工作原理由于計(jì)算機(jī)的外部設(shè)備種類(lèi)豐富,處理速度差異較大,設(shè)備中使用的信號(hào)標(biāo)準(zhǔn)也各不相同,如果使用CPU直接對(duì)外部設(shè)備進(jìn)行控制將使計(jì)算機(jī)系統(tǒng)本身的設(shè)計(jì)變得非常復(fù)雜。為了方便的管理外部設(shè)備,協(xié)調(diào)外部設(shè)備和CPU間速度的差異,消除外部設(shè)備和CPU之間信號(hào)標(biāo)準(zhǔn)的差異,產(chǎn)生了接口的概念。10.1計(jì)算機(jī)接口的基本構(gòu)成和工作原理2(1)接口的概念接口,顧名思義,為了使兩種本來(lái)互相不匹配的事物能夠相互溝通而產(chǎn)生的一種中介。(例如,翻譯就起到這種作用)。計(jì)算機(jī)接口,由特定的電路結(jié)構(gòu)來(lái)實(shí)現(xiàn),具有兩面性,如下圖所示:(1)接口的概念3計(jì)算機(jī)接口:接收總線發(fā)來(lái)的地址信號(hào)。接收總線發(fā)來(lái)的控制信號(hào)和數(shù)據(jù);向總線發(fā)送狀態(tài)信號(hào)和數(shù)據(jù)設(shè)備接口:把設(shè)備的輸入信號(hào)轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)。把CPU輸出的二進(jìn)制數(shù)據(jù)轉(zhuǎn)換為設(shè)備信號(hào)。協(xié)調(diào)外部設(shè)備和CPU的速度差異端口:接口電路中一組存儲(chǔ)單元,CPU可以使用指令訪問(wèn)。包括狀態(tài)端口,控制端口,輸入或輸出數(shù)據(jù)端口。CPU和接口交換信息的樞紐。外部設(shè)備計(jì)算機(jī)系統(tǒng)總線控制狀態(tài)數(shù)據(jù)地址計(jì)算機(jī)接口:設(shè)備接口:端口:外部設(shè)備計(jì)算機(jī)系統(tǒng)總線控制狀態(tài)數(shù)4通常所說(shuō)的“設(shè)備接口”、“計(jì)算機(jī)接口”等名稱(chēng)都是泛指接口,沒(méi)有區(qū)別二者的具體含義。從設(shè)計(jì)角度上講,設(shè)備接口部分的電路設(shè)計(jì)是針對(duì)具體設(shè)備的,如果設(shè)備的信號(hào)機(jī)制和工作機(jī)理比較復(fù)雜,那么相應(yīng)設(shè)備接口的設(shè)計(jì)也就變得困難,調(diào)試過(guò)程也比較繁瑣。計(jì)算機(jī)接口(總線接口)的設(shè)計(jì)相對(duì)簡(jiǎn)單,按照具體計(jì)算機(jī)系統(tǒng)給定的總線標(biāo)準(zhǔn)來(lái)設(shè)計(jì),選擇所要使用的各種控制信號(hào)、地址信號(hào)、數(shù)據(jù)信號(hào),然后設(shè)計(jì)相應(yīng)的電路。端口是連接設(shè)備接口、計(jì)算機(jī)接口的樞紐,其設(shè)計(jì)必須考慮兩方面的可操作性和適應(yīng)性。通常所說(shuō)的“設(shè)備接口”、“計(jì)算機(jī)接口”等名稱(chēng)都是泛指接口,沒(méi)5接口內(nèi)經(jīng)常使用的端口狀態(tài)端口:一般是只讀的端口,為CPU提供接口當(dāng)前的工作狀態(tài),以便CPU判斷當(dāng)前應(yīng)該針對(duì)接口做一些什么操作.控制端口:一般是只寫(xiě)的端口,CPU通過(guò)設(shè)置控制端口,可以設(shè)定接口的工作方式,向接口發(fā)送各種操作命令.?dāng)?shù)據(jù)輸入端口:如果設(shè)備具有輸入功能,那么通過(guò)把輸入數(shù)據(jù)存放在輸入端口,等待CPU來(lái)讀取.?dāng)?shù)據(jù)輸出端口:如果設(shè)備具有輸出功能,那么CPU把輸出數(shù)據(jù)傳送到輸出端口作為接口的輸出數(shù)據(jù).在實(shí)際應(yīng)用中,各類(lèi)端口可能會(huì)在物理上重疊.接口內(nèi)經(jīng)常使用的端口6(2)接口的設(shè)計(jì)過(guò)程1)設(shè)計(jì)設(shè)備接口、總線接口的邏輯電路圖,選擇所需要的芯片,包括端口的分析和設(shè)計(jì)。(這里只是確定接口電路的邏輯結(jié)構(gòu))2)設(shè)計(jì)接口電路的實(shí)際電路圖,主要針對(duì)接口板卡中具體的線路布局。(這時(shí)板卡的實(shí)際形狀、走線細(xì)節(jié)、各個(gè)芯片在板卡中的實(shí)際位置,都已經(jīng)完全確定)??梢詤⒁?jiàn)后面的圖例。3)根據(jù)實(shí)際電路圖制作板卡樣品,在板卡樣品上插上或者焊接上對(duì)應(yīng)的芯片。(實(shí)際的接口電路已經(jīng)制作完成)(2)接口的設(shè)計(jì)過(guò)程7四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch1084)編制針對(duì)端口的接口控制程序,該程序要能夠完成接口電路的基本數(shù)據(jù)輸入、輸出功能。(簡(jiǎn)單的驅(qū)動(dòng)程序已經(jīng)編寫(xiě)完成)5)把板卡樣品插入總線插槽,運(yùn)行接口控制程序,調(diào)試板卡硬件以及控制程序本身,如果程序有錯(cuò)誤,那么修改程序;如果接口電路的設(shè)計(jì)有問(wèn)題,那么非常麻煩,需要回到設(shè)計(jì)的第一步重新開(kāi)始整個(gè)設(shè)計(jì)過(guò)程。4)編制針對(duì)端口的接口控制程序,該程序要能夠完成接口電路的基9(3)8086/8088CPU中訪問(wèn)端口的指令1)I/O端口的編址空間I/O端口和寄存器、內(nèi)存單元具有相同的特性,同屬于存儲(chǔ)單元,用于存放二進(jìn)制信息。只是這三種存儲(chǔ)單元所在的物理位置不同,寄存器位于CPU內(nèi)部,內(nèi)存單元位于內(nèi)部存儲(chǔ)器內(nèi)部,I/O端口位于接口電路當(dāng)中。(3)8086/8088CPU中訪問(wèn)端口的指令10一般來(lái)說(shuō),在各種計(jì)算機(jī)系統(tǒng)中,寄存器具有獨(dú)立的編址空間。在8086匯編語(yǔ)言中,對(duì)寄存器地址的引用和對(duì)內(nèi)存單元地址的引用有著明顯的差別,這種差別反映了二者具有不同的編址空間。對(duì)于I/O端口來(lái)說(shuō),有統(tǒng)一編址和獨(dú)立編址兩種方式,可能在不同的計(jì)算機(jī)系統(tǒng)中,使用不同的編址方式。一般來(lái)說(shuō),在各種計(jì)算機(jī)系統(tǒng)中,寄存器具有獨(dú)立的編址空間。11統(tǒng)一編址方式是指內(nèi)存單元和I/O端口共存于同一個(gè)地址空間內(nèi)。這種方式需要犧牲一部分內(nèi)存地址作為I/O端口的地址,I/O端口和內(nèi)存單元不會(huì)出現(xiàn)重復(fù)的地址。如果采用這種編址方式,訪問(wèn)內(nèi)存單元和I/O端口沒(méi)有任何區(qū)別,使用的指令、尋址方式、地址表示形式可以完全一致,唯一的區(qū)別就是具體邏輯地址的差異。統(tǒng)一編址方式是指內(nèi)存單元和I/O端口共存于同一個(gè)地址空間內(nèi)。12獨(dú)立編址方式是指I/O端口的地址和內(nèi)存單元的地址在不同的兩個(gè)地址空間。這種編址方式中,內(nèi)存單元地址和I/O端口地址毫不相干,二者可能出現(xiàn)重復(fù)的地址。訪問(wèn)內(nèi)存單元和I/O端口需要使用不同的指令,不同的控制信號(hào),由不同的指令來(lái)區(qū)別這兩個(gè)完全不同的地址空間。獨(dú)立編址方式是指I/O端口的地址和內(nèi)存單元的地址在不同的兩個(gè)13在8086/8088系統(tǒng)中,I/O端口主要采用獨(dú)立編址方式??刂菩盘?hào)方面,使用RD信號(hào)表示讀操作、使用WR信號(hào)表示寫(xiě)操作,同時(shí)使用M/IO信號(hào)區(qū)別兩個(gè)地址空間,該信號(hào)等于1時(shí),表示訪問(wèn)內(nèi)存單元,等于0時(shí)表示訪問(wèn)I/O端口。指令方面,訪問(wèn)端口和訪問(wèn)內(nèi)存單元使用兩套不同的指令,訪問(wèn)內(nèi)存單元的指令執(zhí)行時(shí)會(huì)使M/IO信號(hào)為1,訪問(wèn)I/O端口的指令執(zhí)行時(shí)會(huì)使該信號(hào)為0。在8086/8088系統(tǒng)中,I/O端口主要采用獨(dú)立編址方式。14說(shuō)8086主要采用獨(dú)立編址方式,是因?yàn)橛刑厥馇闆r存在。一般來(lái)說(shuō),在接口中具有獨(dú)特功能的存儲(chǔ)單元是經(jīng)典的端口。在接口中擁有連續(xù)地址的大塊存儲(chǔ)單元一般沒(méi)有被看作端口(例如顯示存儲(chǔ)器)。這種位于接口中的大塊存儲(chǔ)部件被看作內(nèi)存單元的一種。在8086中,對(duì)于顯存的訪問(wèn)和普通內(nèi)存的訪問(wèn)沒(méi)有區(qū)別,采用統(tǒng)一編址方式。在訪問(wèn)顯存的時(shí)候,需要犧牲一部分內(nèi)存空間。說(shuō)8086主要采用獨(dú)立編址方式,是因?yàn)橛刑厥馇闆r存在。152)訪問(wèn)端口的指令讀端口指令:把端口數(shù)據(jù)讀入CPU的寄存器中。INAL,XXHINAX,XXH上面這種格式為直接尋址方式,XXH是端口地址,范圍為0到255。2)訪問(wèn)端口的指令16INAL,DXINAX,DX間接尋址方式,端口地址由DX寄存器的內(nèi)容給出,變化范圍為0到65535。8086系統(tǒng)中,最多可以訪問(wèn)65536個(gè)端口。INAL,DX17寫(xiě)端口指令:把CPU寄存器中的數(shù)據(jù)送到端口保存。直接尋址方式:OUTXXH,ALOUTXXH,AX間接尋址方式:OUTDX,ALOUTDX,AX8086系統(tǒng)中,端口尋址方式只有直接尋址和間接尋址兩種,比內(nèi)存單元的尋址方式少得多。注意,8086系統(tǒng)中對(duì)端口訪問(wèn)沒(méi)有段基值的概念,生成物理地址時(shí)固定使用0作為段基值,因?yàn)槎丝诳臻g為64K,正好是一個(gè)段的大小.寫(xiě)端口指令:把CPU寄存器中的數(shù)據(jù)送到端口保存。1810.2接口的控制方式(1)程序控制方式編制程序?qū)涌谶M(jìn)行控制.在這種控制方式下,計(jì)算機(jī)與外設(shè)之間的信息交換完全在程序的控制下進(jìn)行,在什么時(shí)刻與什么樣的端口交換數(shù)據(jù)完全由應(yīng)用程序決定.程序控制方式按照其數(shù)據(jù)傳送特征,又可以分為兩種類(lèi)型.10.2接口的控制方式191)無(wú)條件傳送方式不需要了解接口是否已經(jīng)準(zhǔn)備好而直接進(jìn)行數(shù)據(jù)交換的方式.這種控制方式假定接口總是已經(jīng)準(zhǔn)備好數(shù)據(jù)交換,對(duì)于輸入設(shè)備,假定它始終存在輸入數(shù)據(jù);對(duì)于輸出設(shè)備,假定它始終能夠接收輸出數(shù)據(jù).這種接口控制適用于高速的外部設(shè)備(反應(yīng)速度比CPU塊),或者簡(jiǎn)單設(shè)備.1)無(wú)條件傳送方式20這種方式是CPU主動(dòng)進(jìn)行數(shù)據(jù)交換,什么時(shí)刻以什么方式進(jìn)行數(shù)據(jù)交換,完全由CPU?qǐng)?zhí)行的程序來(lái)決定,接口完全是被動(dòng)的.四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10212)程序查詢(xún)方式這種方式在CPU從接口讀取輸入數(shù)據(jù)或者把輸出數(shù)據(jù)發(fā)送到接口之前必須先檢查接口是否已經(jīng)準(zhǔn)備好.這種查詢(xún)過(guò)程是通過(guò)查詢(xún)接口中狀態(tài)端口來(lái)完成的,使用循環(huán)程序結(jié)構(gòu),不斷從狀態(tài)端口讀取數(shù)據(jù),判斷當(dāng)前狀態(tài)是否為“準(zhǔn)備好”.如果設(shè)備始終沒(méi)有準(zhǔn)備好,那么CPU就不斷執(zhí)行這段循環(huán)查詢(xún)程序;如果已經(jīng)準(zhǔn)備好,那么從數(shù)據(jù)輸入端口讀入所需要的數(shù)據(jù).2)程序查詢(xún)方式22這種接口控制方式仍然是CPU主動(dòng)進(jìn)行數(shù)據(jù)交換,接口只是提供一些狀態(tài)信息給CPU的處理過(guò)程提供參考,何時(shí)采用何種方式交換數(shù)據(jù)仍然由CPU決定.這種方式適合于慢速設(shè)備(處理速度總是比CPU慢,例如鍵盤(pán)、鼠標(biāo)).查詢(xún)過(guò)程有如下兩種:這種接口控制方式仍然是CPU主動(dòng)進(jìn)行數(shù)據(jù)交換,接口只是提供一23設(shè)備是否準(zhǔn)備好數(shù)據(jù)交換NY用這種循環(huán)結(jié)構(gòu)進(jìn)行數(shù)據(jù)交換,CPU只能針對(duì)當(dāng)前接口進(jìn)行操作,其他任何操作都不能執(zhí)行,除非退出這個(gè)接口控制程序。設(shè)備是否數(shù)據(jù)交換NY用這種循環(huán)結(jié)構(gòu)進(jìn)行數(shù)據(jù)交換,24設(shè)備是否準(zhǔn)備好進(jìn)行其他處理,或者執(zhí)行其他程序(如果操作系統(tǒng)支持)進(jìn)行數(shù)據(jù)交換NY用這種循環(huán)結(jié)構(gòu)進(jìn)行數(shù)據(jù)交換,CPU可以有一定的時(shí)間處理其他過(guò)程甚至執(zhí)行其他程序,但是這是以延緩數(shù)據(jù)交換為代價(jià)的。設(shè)備是否進(jìn)行其他處理,進(jìn)行數(shù)據(jù)交換NY用這種循環(huán)結(jié)構(gòu)進(jìn)行數(shù)據(jù)25這里舉一個(gè)實(shí)際的例子,包括了無(wú)條件傳送和程序查詢(xún)兩種接口控制方式,分別針對(duì)兩個(gè)特性不同的硬件設(shè)備。例.假設(shè)有一個(gè)4*4的小鍵盤(pán),和一個(gè)1*2的7段LED顯示器,要求設(shè)計(jì)大致的硬件邏輯并編程實(shí)現(xiàn)如下功能:按下一個(gè)數(shù)字鍵后,對(duì)應(yīng)數(shù)字顯示到低位LED上,低位LED原來(lái)的顯示內(nèi)容移到高位LED(如圖)這里舉一個(gè)實(shí)際的例子,包括了無(wú)條件傳送和程序查詢(xún)兩種接口控制260123456789ABCDEF0123456789ABCDEF27硬件邏輯:(1)鍵盤(pán)設(shè)計(jì):按照最簡(jiǎn)單的原理設(shè)計(jì)一個(gè)4*4的鍵盤(pán),其工作原理如下圖所示。硬件邏輯:284bit4bit4bit4bit1111(0)(1)(2)(3)(0)(1)(2)(3)(0)(1)(2)(3)101111111101(0)(1)(2)(3)高4低430H,只寫(xiě)低4高430H,只讀444bit4bit1111(0)(1)(2)(3)(029端口操作解釋?zhuān)海保?xiě)入操作(針對(duì)控制端口)向30H端口寫(xiě)入0FFH(全1):檢測(cè)每一個(gè)鍵是否出現(xiàn)“按下”的狀態(tài)。向30H端口寫(xiě)入02H(高4:0000,低4:0010):檢測(cè)第1列鍵中是否出現(xiàn)“按下”的狀態(tài)。向30H端口寫(xiě)入22H(高4:0010,低4:0010):檢測(cè)第1行和第一列鍵中是否出現(xiàn)“按下”狀態(tài)。端口操作解釋?zhuān)?02)讀入操作(針對(duì)狀態(tài)兼數(shù)據(jù)輸入端口)讀取30H號(hào)端口的信息,可以檢測(cè)鍵盤(pán)中有無(wú)“按下”的鍵,通過(guò)檢測(cè)高4位和低4位中“0”的位置,可以確定具體哪一個(gè)鍵被按下。注意鍵盤(pán)的使用限制:任何時(shí)刻至多只能有一個(gè)鍵處于“按下”狀態(tài),否則無(wú)法判斷具體被按下鍵的位置(只針對(duì)這里設(shè)計(jì)的鍵盤(pán))。2)讀入操作(針對(duì)狀態(tài)兼數(shù)據(jù)輸入端口)31(2)LED顯示器:硬件邏輯設(shè)計(jì)如下圖所示。四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch1032譯碼器譯碼器7bits7bits4bits4bits4bits4bits8bits,31H,讀/寫(xiě)高4低4顯示由譯碼器的7位輸出控制,1表示對(duì)應(yīng)發(fā)光管發(fā)光,0表示對(duì)應(yīng)發(fā)光管熄滅。譯碼器的7位輸出稱(chēng)為顯示代碼譯碼器把4bits表示的1位16進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)的顯示代碼譯碼器譯碼器7bits7bits4bits4bits4b33012345601436“2”的顯示代碼:01011011,可以考慮沒(méi)有譯碼器時(shí)把十六進(jìn)制數(shù)轉(zhuǎn)換為對(duì)應(yīng)顯示代碼的方法.七段顯示器無(wú)法區(qū)別“8”和“B”,必須添加更多的發(fā)光管012345601436“2”的顯示代碼:0101101134端口訪問(wèn)解釋?zhuān)合颍常保忍?hào)端口寫(xiě)入8位數(shù)據(jù),低4位數(shù)值為低位LED顯示器所要顯示的一位16進(jìn)制數(shù),高4位數(shù)值對(duì)應(yīng)高位LED顯示器所要顯示的一位16進(jìn)制數(shù)。從31H號(hào)端口讀入8位數(shù)據(jù),低4位和高4位分別為當(dāng)前兩位LED顯示器所顯示的一位16進(jìn)制數(shù)。端口訪問(wèn)解釋?zhuān)?5接口控制方式分析:(1)鍵盤(pán)控制:由于鍵盤(pán)的輸入數(shù)據(jù)不是任何時(shí)候都有的,需要判斷當(dāng)前是否有鍵按下,顯然適合使用程序查詢(xún)方式進(jìn)行控制。(2)LED顯示控制:LED顯示器是簡(jiǎn)單的設(shè)備,它總是可以立即顯示CPU送來(lái)的數(shù)據(jù),總是處于“準(zhǔn)備好”的狀態(tài),適合使用直接傳送方式進(jìn)行控制。接口控制方式分析:36技術(shù)細(xì)節(jié):如果讀?。常埃忍?hào)端口,檢測(cè)到其中出現(xiàn)了為“0”的數(shù)據(jù)位,對(duì)應(yīng)鍵盤(pán)的狀態(tài)可能有兩種:1)鍵盤(pán)抖動(dòng):電路上信號(hào)的抖動(dòng)、鍵盤(pán)的物理抖動(dòng)、按鍵的手指抖動(dòng),這些都是抖動(dòng)現(xiàn)象,特征是信號(hào)不穩(wěn)定,“0”數(shù)據(jù)位持續(xù)的時(shí)間較短,一般是幾個(gè)MS或者幾十個(gè)MS。2)按鍵:用戶(hù)確實(shí)按下了鍵盤(pán)中的某一個(gè)鍵,特征是信號(hào)穩(wěn)定,“0”數(shù)據(jù)位持續(xù)的時(shí)間較長(zhǎng),一般是幾百個(gè)MS。解決方法:第一次檢測(cè)到30H端口的“0”數(shù)據(jù)位以后,延時(shí)0.2S(200MS)左右,再一次檢測(cè)30H端口中的“0”數(shù)據(jù)位是否存在,如果仍然存在,解釋為“按鍵”狀態(tài),可以從30H端口讀取鍵盤(pán)的掃描代碼;如果不存在“0”數(shù)據(jù)位,那么解釋為“抖動(dòng)”現(xiàn)象,應(yīng)該繼續(xù)循環(huán)重新檢測(cè)鍵盤(pán)的狀態(tài)。技術(shù)細(xì)節(jié):37程序段如下: MOV AL,0FFH OUT 30H,ALLOP1: IN AL,30H CMP AL,0FFH JZ LOP1 NOP ;這里只是象征性延時(shí) NOP ;延時(shí)一般可用循環(huán)實(shí)現(xiàn) NOP IN AL,30H CMP AL,0FFH JZ LOP1程序段如下:38 XOR BL,BL PUSH AX AND AL,0FH MOV CX,3 SHR AL,1LOP2: JNC L1 INC BL SHR AL,1 LOOP LOP2 XOR BL,BL39L1: POP AX MOV CL,4 ROL AL,CL AND AL,0FH MOV CX,3 SHR AL,1LOP3: JNC L2 ADD BL,4 SHR AL,1 LOOP LOP3L1: POP AX40L2: IN AL,31H MOV CL,4 ROL AL,CLAND AL,0F0H AND BL,0FH OR AL,BL OUT 31H,AL JMP LOP1L2: IN AL,31H41可見(jiàn),在執(zhí)行上面程序時(shí),CPU沒(méi)有空閑時(shí)間執(zhí)行其他程序,始終在循環(huán)檢測(cè)鍵盤(pán)是否有鍵按下.可以想象這樣一種工作方式,小鍵盤(pán)上有鍵按下時(shí)才去執(zhí)行上述程序中的處理(接收鍵碼,把數(shù)據(jù)送到七段顯示器顯示);沒(méi)有鍵按下時(shí)CPU就可以執(zhí)行其他程序.這種工作方式稱(chēng)為中斷工作方式,可以避免CPU對(duì)設(shè)備接口的循環(huán)等待,大幅度提高計(jì)算機(jī)系統(tǒng)的工作效率.可見(jiàn),在執(zhí)行上面程序時(shí),CPU沒(méi)有空閑時(shí)間執(zhí)行其他程序,始終42(2)中斷控制方式(A)中斷的概念兩個(gè)人正在交談,突然來(lái)了一個(gè)電話,接電話的過(guò)程就是一個(gè)中斷過(guò)程(它打斷了談話),電話打完后,兩個(gè)人繼續(xù)交談,談話的恢復(fù)就是一個(gè)中斷返回過(guò)程.在計(jì)算機(jī)系統(tǒng)中,也存在著這樣的概念,CPU正在執(zhí)行一個(gè)程序,外部設(shè)備需要CPU讀取輸入數(shù)據(jù)或者發(fā)送輸出數(shù)據(jù),或者外部設(shè)備出了故障,需要CPU?qǐng)?zhí)行設(shè)備控制程序(中斷服務(wù)程序)進(jìn)行相應(yīng)的處理,此時(shí)就會(huì)產(chǎn)生中斷.(2)中斷控制方式43(B)中斷服務(wù)程序和中斷向量表中斷服務(wù)程序是系統(tǒng)提供的一段服務(wù)程序,針對(duì)某種設(shè)備接口的特定處理,或者一段完成系統(tǒng)功能的調(diào)用.每一個(gè)中斷服務(wù)程序都有自己的起始地址,包括段基值和偏移量.要執(zhí)行中斷服務(wù)程序就首先需要知道它的起始地址.在內(nèi)存中從0地址開(kāi)始的1K存儲(chǔ)空間中,存放的是中斷向量表.任何其他數(shù)據(jù)和程序都不能占用這部分空間.中斷向量表中按順序存放著各個(gè)中斷服務(wù)程序的起始地址,稱(chēng)為中斷入口地址,每一個(gè)入口地址占用4個(gè)字節(jié)的空間.總共有256個(gè)中斷入口地址,這也是8086/8088系統(tǒng)所能直接支持的最大中斷數(shù)目。(可以通過(guò)8259芯片級(jí)連的方式擴(kuò)充中斷數(shù)目).(B)中斷服務(wù)程序和中斷向量表44(B)中斷源和中斷類(lèi)型號(hào)引起中斷的原因稱(chēng)為中斷源(InterruptSource),中斷源分為如下幾種:內(nèi)中斷:來(lái)自CPU內(nèi)部的中斷.a(chǎn))執(zhí)行INT指令引起的中斷,也就是DOS或者BIOS中斷調(diào)用b)CPU內(nèi)部錯(cuò)誤引起的中斷,例如除法錯(cuò)誤引起的0型中斷.c)TF標(biāo)志位引起的單步中斷.(B)中斷源和中斷類(lèi)型號(hào)45外中斷:來(lái)自CPU外部,一般是來(lái)自設(shè)備接口的中斷.a(chǎn))非屏蔽中斷NMI(Non-MaskableInterrupt):通過(guò)NMI控制信號(hào)線傳送的中斷信號(hào),不受IF標(biāo)志控制,如果出現(xiàn)這種中斷,CPU在執(zhí)行完當(dāng)前指令以后,立即轉(zhuǎn)入中斷服務(wù)程序.這類(lèi)中斷一般用于處理緊急的設(shè)備故障,例如:電源掉電.b)可屏蔽中斷INTR:通過(guò)INTR控制信號(hào)線傳送的中斷信號(hào),可以由IF標(biāo)志控制是否屏蔽,除了這一點(diǎn)區(qū)別,其處理過(guò)程和NMI中斷一致.一般是外部設(shè)備請(qǐng)求進(jìn)行數(shù)據(jù)交換.外中斷:來(lái)自CPU外部,一般是來(lái)自設(shè)備接口的中斷.46中斷類(lèi)型號(hào)(簡(jiǎn)稱(chēng)中斷號(hào)):就是中斷源的編號(hào),如果是軟件中斷,由INT指令的參數(shù)N給出中斷類(lèi)型號(hào);如果是硬件中斷,那么由設(shè)備接口或者CPU內(nèi)部相應(yīng)硬件提供對(duì)應(yīng)的中斷類(lèi)型號(hào).在執(zhí)行中斷服務(wù)程序前,CPU會(huì)自動(dòng)根據(jù)中斷類(lèi)型號(hào)換算對(duì)應(yīng)的中斷服務(wù)程序入口地址.中斷類(lèi)型號(hào)(簡(jiǎn)稱(chēng)中斷號(hào)):就是中斷源的編號(hào),如果是軟件中斷,47(C)中斷的過(guò)程中斷過(guò)程大致分成如下幾個(gè)步驟:1.中斷請(qǐng)求:設(shè)備在需要CPU?qǐng)?zhí)行中斷服務(wù)程序時(shí),通過(guò)控制總線(狀態(tài)線)向CPU提出中斷請(qǐng)求,發(fā)中斷請(qǐng)求信號(hào)INTR.2.中斷響應(yīng):CPU決定何時(shí)響應(yīng)設(shè)備發(fā)出的中斷請(qǐng)求,當(dāng)前指令執(zhí)行完畢后(注意,中斷不能打斷指令的執(zhí)行),向設(shè)備接口發(fā)送中斷響應(yīng)信號(hào)INTA.設(shè)備接口收到INTA信號(hào)以后向數(shù)據(jù)總線發(fā)送8位中斷號(hào)(低8位).(C)中斷的過(guò)程48收到中斷號(hào)以后,按順序把標(biāo)志寄存器、CS、IP等寄存器的內(nèi)容壓入堆棧,把IF、TF標(biāo)志置0,然后執(zhí)行如下過(guò)程:CPU按照如下過(guò)程把中斷號(hào)n轉(zhuǎn)換為中斷入口地址.IP<=(4*n,4*n+1)CS<=(4*n+2,4*n+3)實(shí)際上,是把中斷向量表中的第n個(gè)中斷入口地址取出來(lái)送到IP和CS中.最后程序流程轉(zhuǎn)到中斷入口。收到中斷號(hào)以后,按順序把標(biāo)志寄存器、CS、IP等寄存器的內(nèi)容493.中斷處理中斷處理的過(guò)程也就是執(zhí)行中斷服務(wù)程序的過(guò)程。4.中斷返回中斷返回通過(guò)執(zhí)行IRET指令實(shí)現(xiàn),從堆棧中恢復(fù)IP、CS、標(biāo)志寄存器的內(nèi)容,返回到被中斷程序繼續(xù)執(zhí)行。3.中斷處理50d)中斷服務(wù)程序的編制和使用繼續(xù)使用前面的例子,對(duì)4*4的鍵盤(pán)和1*2的LED顯示器編制中斷服務(wù)程序,使用中斷控制方式來(lái)控制CPU和接口間的數(shù)據(jù)交換.由于要使用中斷控制,必須在鍵盤(pán)的硬件邏輯中加入中斷信號(hào)生成的邏輯模塊.d)中斷服務(wù)程序的編制和使用514bit4bit4bit4bit1111(0)(1)(2)(3)(0)(1)(2)(3)(0)(1)(2)(3)101111111101(0)(1)(2)(3)高4低430H,只寫(xiě)低4高430H,只讀8位到數(shù)據(jù)總線生成中斷請(qǐng)求8輸入1輸出與門(mén)INTR0有效8位中斷類(lèi)型號(hào)8位去數(shù)據(jù)總線低8位INTA0有效三態(tài)門(mén)444bit4bit1111(0)(1)(2)(3)(052把鍵盤(pán)接口的中斷類(lèi)型號(hào)分配為61H,避免與已經(jīng)有的系統(tǒng)中斷沖突.中斷類(lèi)型號(hào)的分布情況可以參見(jiàn)教材表10-3。有一些是用戶(hù)可以使用的,有一些則是系統(tǒng)保留的。注意:實(shí)際設(shè)計(jì)硬件時(shí),必須注意端口地址、中斷類(lèi)型號(hào)的分配,盡量不與其他硬件接口相沖突,最好設(shè)計(jì)為可以使用指令設(shè)置的端口地址和中斷類(lèi)型號(hào),這樣可以使硬件接口的適用性更強(qiáng)。把鍵盤(pán)接口的中斷類(lèi)型號(hào)分配為61H,避免與已經(jīng)有的系統(tǒng)中斷沖53中斷服務(wù)程序相對(duì)于查詢(xún)方式控制程序的特點(diǎn):不需要循環(huán)查詢(xún)接口的狀態(tài)端口,因?yàn)橐坏┯兄袛喟l(fā)生,一定有數(shù)據(jù)輸入(這里是有鍵按下)。只需要直接從數(shù)據(jù)端口讀取數(shù)據(jù)即可。由于LED顯示器的顯示總是和鍵盤(pán)的輸入聯(lián)系在一起的,所以不需要編制單獨(dú)的控制程序,對(duì)它的控制直接合并到對(duì)鍵盤(pán)進(jìn)行控制的中斷服務(wù)程序中即可。中斷服務(wù)程序相對(duì)于查詢(xún)方式控制程序的特點(diǎn):54中斷服務(wù)程序主體如下:(抖動(dòng)由硬件解決) STI ;一般允許處理其他中斷 IN AL,30H XOR BL,BL PUSH AX AND AL,0FH MOV CX,3 SHR AL,1LOP2: JNC L1 INC BL SHR AL,1 LOOP LOP2中斷服務(wù)程序主體如下:(抖動(dòng)由硬件解決)55L1: POP AX MOV CL,4 ROL AL,CL AND AL,0FH MOV CX,3 SHR AL,1LOP3: JNC L2 ADD BL,4 SHR AL,1 LOOP LOP3L1: POP AX56L2: IN AL,31H MOV CL,4 ROL AL,CL AND AL,0F0H AND BL,0FH OR AL,BL OUT 31H,AL ;向8259芯片發(fā)送EOI中斷結(jié)束命令 ;8259P0是8259命令端口的編號(hào) MOV AL,20H MOV DX,8259P0 OUT DX,AL ;中斷返回 IRETL2: IN AL,31H57中斷服務(wù)程序的載入由于隨時(shí)可能產(chǎn)生中斷,所以中斷服務(wù)程序一定是在操作系統(tǒng)剛開(kāi)始運(yùn)行的時(shí)候就已經(jīng)被裝入到內(nèi)存隨時(shí)準(zhǔn)備被調(diào)用。中斷服務(wù)程序是常駐內(nèi)存程序的一種。把中斷服務(wù)程序裝入內(nèi)存的過(guò)程稱(chēng)為載入過(guò)程。BIOS中斷服務(wù)程序是固化在BIOS芯片中的,所以不需要載入過(guò)程。中斷服務(wù)程序的載入58DOS中斷服務(wù)程序或者其他操作系統(tǒng)提供的中斷服務(wù)程序都需要載入過(guò)程,在操作系統(tǒng)剛開(kāi)始運(yùn)行的時(shí)候執(zhí)行這個(gè)過(guò)程,把相應(yīng)的中斷服務(wù)程序裝入到內(nèi)存中,并且按照裝入的中斷入口地址修改中斷向量表。只有正確的載入了中斷服務(wù)程序并且正確的設(shè)置了中斷向量表,中斷服務(wù)程序才可能被正確的執(zhí)行。所有用戶(hù)編制的中斷服務(wù)程序,也必須經(jīng)歷這樣一個(gè)載入過(guò)程才能正確運(yùn)行。DOS中斷服務(wù)程序或者其他操作系統(tǒng)提供的中斷服務(wù)程序都需要載59載入中斷服務(wù)程序需要使用另外一個(gè)程序來(lái)完成,稱(chēng)為中斷初始化程序。但是為了方便起見(jiàn),通常把初始化程序和中斷服務(wù)程序?qū)懗赏粋€(gè)程序。一般來(lái)說(shuō),中斷服務(wù)程序作為中斷程序的主體,中斷初始化程序作為中斷程序的框架。用戶(hù)自己實(shí)現(xiàn)的中斷服務(wù)都必須有這樣一個(gè)初始化過(guò)程,否則中斷服務(wù)仍然無(wú)法啟用。在這個(gè)例子中,中斷初始化程序(中斷程序的框架)如下:載入中斷服務(wù)程序需要使用另外一個(gè)程序來(lái)完成,稱(chēng)為中斷初始化程60 DATA SEGMENT ;8259芯片命令端口號(hào) 8259P0 EQU 40H ;8259芯片中斷屏蔽端口號(hào) 8259P1 EQU 41H …… DATA ENDS STACK1 SEGMENT STACK DW 30H DUP(0) STACK1 ENDS DATA SEGMENT61 CODE SEGMET

ASSUME CS:CODE,DS:DATA,SS:STACK1INT61H: ..….;中斷服務(wù)程序START: MOV AL,0FFH OUT 30H,AL ;初始化鍵盤(pán)掃描 ;下面是設(shè)置中斷入口地址 ;修改中斷向量表 MOV AL,61H MOV AH,25H MOV DS,SEG INT61H MOV DX,OFFSET INT61H INT 21H CODE SEGMET62 ;消除8259上的中斷屏蔽,允許中斷 MOV AL,0 MOV DX,8259P1 OUT DX,AL STI ;CPU內(nèi)部允許中斷 ;下面使程序駐留內(nèi)存,并且返回DOS MOV AX,3100H MOV DX,$-INT61 INT 21H CODE ENDS END START ;消除8259上的中斷屏蔽,允許中斷63使用中斷調(diào)用,避免程序?qū)涌诘难h(huán)查詢(xún)操作,采用接口主動(dòng)提出請(qǐng)求進(jìn)行數(shù)據(jù)交換的方式,使CPU的工作效率大幅度提高。在現(xiàn)有的計(jì)算機(jī)設(shè)備中,除了數(shù)據(jù)傳輸速度極快,數(shù)據(jù)傳輸量極大的設(shè)備以外,多數(shù)設(shè)備采用中斷工作方式和CPU進(jìn)行數(shù)據(jù)交換。一般來(lái)說(shuō),中斷服務(wù)程序都是由相應(yīng)硬件接口的開(kāi)發(fā)廠商提供的,它們?yōu)椴僮飨到y(tǒng)提供方便的中斷調(diào)用。用戶(hù)也可以使用這些中斷調(diào)用來(lái)完成特定的硬件功能。使用中斷調(diào)用,避免程序?qū)涌诘难h(huán)查詢(xún)操作,采用接口主動(dòng)提出64(3)DMA控制方式(直接存儲(chǔ)器存取方式)和程序控制、中斷控制不同,DMA控制方式對(duì)接口采用全硬件的控制機(jī)制,不執(zhí)行任何程序。原理:一個(gè)設(shè)備接口試圖通過(guò)總線直接向另一個(gè)設(shè)備發(fā)送數(shù)據(jù)(一般是大批量的數(shù)據(jù)),它會(huì)先向CPU發(fā)送DMA請(qǐng)求信號(hào),CPU收到該信號(hào)后,會(huì)按DMA信號(hào)的優(yōu)先級(jí)和提出DMA請(qǐng)求的先后順序響應(yīng)DMA信號(hào)。CPU對(duì)某個(gè)設(shè)備接口響應(yīng)DMA請(qǐng)求時(shí),會(huì)讓出總線控制權(quán),提出請(qǐng)求的設(shè)備接口可以通過(guò)總線直接進(jìn)行數(shù)據(jù)傳送(不通過(guò)CPU),數(shù)據(jù)傳送完畢后,設(shè)備接口會(huì)向CPU發(fā)送DMA結(jié)束信號(hào),交還總線控制權(quán)。注意:DMA請(qǐng)求信號(hào)可能會(huì)打斷一條指令的執(zhí)行,使它暫時(shí)停止執(zhí)行,數(shù)據(jù)傳送完畢后才恢復(fù)該指令的執(zhí)行。(3)DMA控制方式(直接存儲(chǔ)器存取方式)6510.3DOS系統(tǒng)功能調(diào)用操作系統(tǒng)為了使用戶(hù)能夠更方便的使用硬件設(shè)備,使用戶(hù)在不了解硬件具體工作原理的情況下也能夠使用硬件設(shè)備,都會(huì)提供豐富的系統(tǒng)功能調(diào)用。通過(guò)使用系統(tǒng)功能調(diào)用,用戶(hù)不需要了解接口的工作原理,不需要熟悉接口中各個(gè)端口的功能和使用方法,只需要傳遞系統(tǒng)調(diào)用需要的入口參數(shù),按照規(guī)定取得出口參數(shù),就可以完成幾乎所有的硬件操作。在匯編語(yǔ)言這個(gè)開(kāi)發(fā)平臺(tái)上,系統(tǒng)功能調(diào)用是以中斷服務(wù)程序的形式給出來(lái)的。用戶(hù)通過(guò)使用INT指令執(zhí)行系統(tǒng)調(diào)用。10.3DOS系統(tǒng)功能調(diào)用66系統(tǒng)調(diào)用就是中斷當(dāng)中的軟中斷,它的程序組織形式就是中斷服務(wù)程序,中斷服務(wù)程序入口地址也是存放在中斷向量表當(dāng)中。系統(tǒng)調(diào)用分為兩個(gè)層面,低層為BIOS調(diào)用,高層為DOS調(diào)用。DOS調(diào)用建立在BIOS調(diào)用的基礎(chǔ)之上。四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch1067由于早期的硬件設(shè)備種類(lèi)比較單一,所以底層的、常用的硬件接口控制程序(硬中斷服務(wù)程序、BIOS系統(tǒng)調(diào)用)都被固化在BIOS芯片中。抽象級(jí)別更高的,使用更方便的硬件控制程序(DOS調(diào)用)由操作系統(tǒng)實(shí)現(xiàn)。如果是用戶(hù)自己設(shè)計(jì)的硬件接口,相應(yīng)的設(shè)備驅(qū)動(dòng)程序(包括硬中斷服務(wù)程序、系統(tǒng)調(diào)用),都只能通過(guò)中斷向量表中未被使用的中斷類(lèi)型號(hào)。由于早期的硬件設(shè)備種類(lèi)比較單一,所以底層的、常用的硬件接口控68下面介紹一些常用的DOS調(diào)用(主要介紹INT21H):(一)有關(guān)鍵盤(pán)輸入和字符顯示的DOS調(diào)用下面介紹一些常用的DOS調(diào)用(主要介紹INT21H):69(1)單字符輸入1)01H號(hào)子功能MOV AH,01H ;指定功能號(hào)INT 21H ;系統(tǒng)調(diào)用從鍵盤(pán)讀取一個(gè)字符,執(zhí)行INT指令后,只要用戶(hù)不按鍵,那么始終等待,用戶(hù)按下一個(gè)鍵以后,系統(tǒng)調(diào)用把該鍵對(duì)應(yīng)的ASCII碼送到AL保存,并且送到顯示器顯示,然后退出系統(tǒng)調(diào)用,返回主程序.(1)單字符輸入7001H號(hào)子功能可以檢測(cè)CTRL+C鍵,如果用戶(hù)在系統(tǒng)調(diào)用執(zhí)行時(shí)按下CTRL+C,那么系統(tǒng)調(diào)用會(huì)終止主程序,返回操作系統(tǒng).能夠?qū)崿F(xiàn)單字符輸入的還有21H號(hào)DOS調(diào)用的06H、07H、08H號(hào)子功能。07H:和01H號(hào)子功能大致相同,只是不回顯鍵入的字符,也不檢測(cè)CTRL+C鍵。08H:和01H號(hào)子功能大致相同,要檢測(cè)CTRL+C鍵,但是不回顯鍵入的字符。01H號(hào)子功能可以檢測(cè)CTRL+C鍵,如果用戶(hù)在系統(tǒng)調(diào)用執(zhí)行7106H:這個(gè)子功能既能用于鍵盤(pán)輸入,又能用于顯示輸出。初始化入口參數(shù)時(shí),把DL寄存器的內(nèi)容置為0FFH,表示輸入功能。它會(huì)先檢測(cè)鍵盤(pán)的輸入緩沖區(qū)(隊(duì)列,09H硬中斷服務(wù)程序把接收到的鍵碼按先后順序存放于此)是否有輸入數(shù)據(jù),如果有輸入數(shù)據(jù),取出隊(duì)首的字符并送到AL保存;如果沒(méi)有輸入數(shù)據(jù),把0保存到AL。06H子功能不會(huì)等待用戶(hù)按鍵,適合用于鍵盤(pán)狀態(tài)的檢測(cè)。06H:這個(gè)子功能既能用于鍵盤(pán)輸入,又能用于顯示輸出。初始化72單個(gè)字符輸入的例子:參見(jiàn)教材P229的例10.4.1(2)字符串輸入0AH號(hào)子功能:從鍵盤(pán)上接收一個(gè)字符串,保存到入口參數(shù)指定的緩沖區(qū)中,并在顯示器上同步回顯用戶(hù)輸入的字符串。用戶(hù)在緩沖區(qū)的第0個(gè)字節(jié)給出輸入字符串的最大字符數(shù),如果在輸入時(shí)已經(jīng)達(dá)到規(guī)定最大字符數(shù),該子功能會(huì)停止接收鍵入,并等待用戶(hù)鍵入最后的回車(chē)鍵。在執(zhí)行0AH子功能時(shí),只要按下回車(chē)鍵就表示字符串輸入完畢。單個(gè)字符輸入的例子:參見(jiàn)教材P229的例10.4.173字符串輸入完畢后,系統(tǒng)調(diào)用會(huì)把實(shí)際輸入的字符數(shù)填入緩沖區(qū)的第1個(gè)字節(jié)。注意:輸入字符串內(nèi)容是從緩沖區(qū)的第2個(gè)字節(jié)開(kāi)始存放的,見(jiàn)教材P230的圖10-5。從鍵盤(pán)輸入字符串可以通過(guò)單個(gè)字符輸入的功能調(diào)用和循環(huán)程序結(jié)構(gòu)結(jié)合實(shí)現(xiàn);也可以通過(guò)0AH子功能調(diào)用來(lái)實(shí)現(xiàn)。例子:參見(jiàn)教材P230的例10.4.2字符串輸入完畢后,系統(tǒng)調(diào)用會(huì)把實(shí)際輸入的字符數(shù)填入緩沖區(qū)的第74(3)清除鍵盤(pán)緩沖區(qū)0CH號(hào)子功能:清除鍵盤(pán)緩沖區(qū),然后執(zhí)行(AL)指定的子功能(可以為01H、06H、07H、08H、0AH)。使用這個(gè)子功能主要是為了在執(zhí)行其他子功能前消除以前的鍵盤(pán)輸入。例如:MOV AH,0CHMOV AL,01HINT 21H清除鍵盤(pán)緩沖區(qū)以后執(zhí)行01H號(hào)子功能,從鍵盤(pán)接收一個(gè)新的按鍵。(3)清除鍵盤(pán)緩沖區(qū)75(4)檢驗(yàn)鍵盤(pán)狀態(tài)0BH:檢驗(yàn)鍵盤(pán)的當(dāng)前狀態(tài),如果有鍵被按下,把0FFH保存到AL;如果沒(méi)有鍵被按下,把00H保存到AL。如果需要查詢(xún)鍵盤(pán)的狀態(tài),或者以查詢(xún)方式控制鍵盤(pán),可以使用這一個(gè)子功能。下面是一個(gè)等待按鍵的子程序:LOP: MOV AH,0BH INT 21H INC AL JNZ LOP RET (4)檢驗(yàn)鍵盤(pán)狀態(tài)76(5)顯示單個(gè)字符02H:用戶(hù)把需要顯示的ASCII碼存放到DL中,功能號(hào)02H送入AH中,然后調(diào)用21H號(hào)DOS系統(tǒng)調(diào)用,就可以在當(dāng)前光標(biāo)位置顯示這個(gè)字符。這個(gè)子功能在執(zhí)行時(shí)要檢測(cè)CTRL+BREAK按鍵,如果在執(zhí)行子功能時(shí),用戶(hù)已經(jīng)按下了CTRL+BREAK,那么它會(huì)結(jié)束主程序,返回操作系統(tǒng)。MOV AH,02HMOV DL,要顯示的ASCII碼INT 21H(5)顯示單個(gè)字符7706H:如果入口參數(shù)DL中存放的不是0FFH,而是一個(gè)ASCII碼,那么它將在當(dāng)前光標(biāo)位置顯示這個(gè)字符。這個(gè)子功能不檢測(cè)CTRL+BREAK按鍵。MOV AH,06HMOV DL,要顯示的ASCII碼INT 21H字符顯示的例子:教材P231例10.4.306H:如果入口參數(shù)DL中存放的不是0FFH,而是一個(gè)ASC78(6)顯示字符串09H:顯示指定位置的字符串,字符串一定要以‘$‘符號(hào)結(jié)尾.MOV AH,09HLEA DX,STRING1INT 21H默認(rèn)STRING1字符串在DS指向的段中.(6)顯示字符串79例從鍵盤(pán)輸入一個(gè)字符串,大寫(xiě)字母變小寫(xiě)字母,小寫(xiě)字母變大寫(xiě)字母,然后顯示出來(lái).DATA SEGMENTMAXLEN DB 20ACTLEN DB ?STRING1 DB 21 DUP(0)NLCR DB 0AH,0DH,'$'DATA ENDSSTACK1 SEGMENT STACK DW 30HSTACK1 ENDS例從鍵盤(pán)輸入一個(gè)字符串,大寫(xiě)字母變小寫(xiě)字母,小寫(xiě)字母變大寫(xiě)80CODE SEGMENTASSUMESS:STACK1,CS:CODE,DS:DATABEGIN: MOV AX,DATA MOV DS,AX MOV AH,0AH LEA DX,MAXLEN INT 21H MOV BL,ACTLEN XOR BH,BH MOV STRING1[BX],'$'CODE SEGMENT81 MOV CL,ACTLEN XOR CH,CH MOV SI,0LOP: MOV AL,STRING1[SI] CMP AL,41H JAE CON1 JMP NEXT1CON1: CMP AL,5AH JBE CON2 JMP NEXT1CON2: ADD STRING1[SI],20H JMP NEXT2NEXT1: CMP AL,61H JAE CON3 JMP NEXT2CON3: CMP AL,7AH JBE CON4 JMP NEXT2CON4: SUB STRING1[SI],20HNEXT2: INC SI LOOP LOP MOV CL,ACTLEN82 MOV AH,09H LEA DX,NLCR INT 21H MOV AH,09H LEA DX,STRING1 INT 21H MOV AH,4CH INT 21HCODE ENDSEND BEGIN MOV AH,09H83(二)基于文件操作的磁盤(pán)功能調(diào)用(1)基于FCB(FileControlBlock)的磁盤(pán)功能調(diào)用1)FCB的概念是由DOS操作系統(tǒng)維護(hù)的一種數(shù)據(jù)結(jié)構(gòu),用戶(hù)程序通過(guò)修改FCB中特定的字段,結(jié)合相應(yīng)的DOS系統(tǒng)調(diào)用,可以完成建立文件、打開(kāi)文件、讀文件記錄、寫(xiě)文件記錄、關(guān)閉文件等基本的文件操作。FCB的數(shù)據(jù)組織可以參照教材P233表10-4。(二)基于文件操作的磁盤(pán)功能調(diào)用842)使用FCB進(jìn)行文件操作的原理把文件看作由數(shù)據(jù)塊組成的序列,每個(gè)數(shù)據(jù)塊包含128?jìng)€(gè)文件記錄。文件記錄的大小在FCB相關(guān)字段定義。把文件記錄看作最小的文件操作單位,每次讀寫(xiě)文件的操作都是以文件記錄為單位進(jìn)行的。數(shù)據(jù)緩沖區(qū):由用戶(hù)程序定義,并通過(guò)特定系統(tǒng)調(diào)用向操作系統(tǒng)聲明的內(nèi)存空間。數(shù)據(jù)緩沖區(qū)的空間至少要大于等于一個(gè)文件記錄的大小。執(zhí)行讀操作時(shí),系統(tǒng)調(diào)用從文件中讀出的文件記錄自動(dòng)保存在數(shù)據(jù)緩沖區(qū);執(zhí)行寫(xiě)操作時(shí),系統(tǒng)調(diào)用會(huì)自動(dòng)把數(shù)據(jù)緩沖區(qū)中的文件記錄寫(xiě)入文件。2)使用FCB進(jìn)行文件操作的原理85通過(guò)FCB中“當(dāng)前塊號(hào)”、“當(dāng)前記錄號(hào)”,系統(tǒng)調(diào)用可以確定當(dāng)前讀寫(xiě)操作在文件中的位置,讀寫(xiě)操作完畢以后,系統(tǒng)調(diào)用會(huì)自動(dòng)修改FCB中的這些參數(shù)。使用FCB對(duì)文件進(jìn)行讀寫(xiě)操作可以分為順序存取、隨機(jī)存取、隨機(jī)分塊存取三種方式。四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10863)使用FCB建立文件、打開(kāi)文件、關(guān)閉文件,以及建立文件緩沖區(qū)的方法首先應(yīng)該在數(shù)據(jù)段定義FCB,并在相關(guān)字段填上正確的內(nèi)容;同時(shí)在數(shù)據(jù)段定義數(shù)據(jù)緩沖區(qū)。四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch1087在當(dāng)前目錄建立一個(gè)新文件(16H號(hào)子功能,教材P234上面):MOV AH,16HMOV DX,SEG FCBRECMOV DS,DXMOV DX,OFFSETFCBRECINT 21H進(jìn)行系統(tǒng)調(diào)用之前,必須正確初始化兩個(gè)入口參數(shù),FCB的段基值必須保存在DS,偏移量必須保存在DX。而且必須保證FCB中“文件名”、“文件擴(kuò)展名”等字段已經(jīng)正確初始化。出口參數(shù):如果(AL)=00H,表示新文件已經(jīng)建立成功;如果(AL)=0FFH,表示磁盤(pán)空間不夠,新文件沒(méi)有被建立。在當(dāng)前目錄建立一個(gè)新文件(16H號(hào)子功能,教材P234上面)88在當(dāng)前目錄打開(kāi)一個(gè)已經(jīng)存在的文件(0FH號(hào)子功能,教材P237下面):MOV AH,0FHMOV DX,SEG FCBRECMOV DS,DXMOV DX,OFFSET FCBRECINT 21H入口參數(shù):和建立文件的16H號(hào)子功能一致,需要提供FCB的段基值和偏移量。出口參數(shù):如果FCB中“文件名”、“文件擴(kuò)展名”指出的文件存在,文件打開(kāi)成功,(AL)=00H;如果文件不存在,打開(kāi)失敗,(AL)=0FFH。文件打開(kāi)成功后,0FH號(hào)子功能會(huì)修改FCB中的相應(yīng)內(nèi)容,例如文件長(zhǎng)度、當(dāng)前塊號(hào)、當(dāng)前記錄號(hào)等等。在當(dāng)前目錄打開(kāi)一個(gè)已經(jīng)存在的文件(0FH號(hào)子功能,教材P2389關(guān)閉一個(gè)文件(10H號(hào)子功能,教材P235上面):MOV AH,10HMOV DX,SEG FCBRECMOV DS,DXMOV DX,OFFSET FCBRECINT 21H入口參數(shù):和前面的系統(tǒng)調(diào)用一致,需要提供FCB的段基值和偏移量。出口參數(shù):如果文件正確關(guān)閉,(AL)=00H;如果文件不能關(guān)閉(例如,關(guān)閉文件前改變了當(dāng)前目錄,或者改變了當(dāng)前驅(qū)動(dòng)器),(AL)=0FFH。注意:使用FCB對(duì)文件進(jìn)行操作時(shí),只能使用當(dāng)前目錄,不能使用相對(duì)目錄或者絕對(duì)路徑。關(guān)閉一個(gè)文件(10H號(hào)子功能,教材P235上面):90建立數(shù)據(jù)緩沖區(qū)(1AH號(hào)子功能):MOV AH,1AHMOV DX,SEG DTAMOV DS,DXMOV DX,OFFSET DTAINT 21H入口參數(shù):把數(shù)據(jù)緩沖區(qū)的段基值送到DS,首地址偏移量送到DX。出口參數(shù):無(wú)。一定要保證數(shù)據(jù)緩沖區(qū)的空間至少能夠裝入一個(gè)記錄(記錄的大小由FCB中相應(yīng)字段定義,該字段由用戶(hù)程序維護(hù))。數(shù)據(jù)緩沖區(qū)一旦建立,以后使用FCB進(jìn)行文件操作時(shí)都是使用這個(gè)緩沖區(qū),除非重新建立新的數(shù)據(jù)緩沖區(qū)。建立數(shù)據(jù)緩沖區(qū)(1AH號(hào)子功能):914)使用FCB的順序存取方式向文件中讀寫(xiě)記錄。寫(xiě)記錄(15H號(hào)子功能,教材P234下面):MOV AH,15HMOV DX,SEG FCBRECMOV DS,DXMOV DX,OFFSET FCBRECINT 21H功能:按照FCB中指定的當(dāng)前塊號(hào)、當(dāng)前記錄號(hào),確定寫(xiě)操作的位置,把數(shù)據(jù)緩沖區(qū)中首地址開(kāi)始的一個(gè)記錄空間寫(xiě)入文件,并把修改FCB中當(dāng)前塊號(hào)、當(dāng)前記錄號(hào)、文件長(zhǎng)度等字段。入口參數(shù):把FCB的段基值、偏移量分別送到DS和DX。4)使用FCB的順序存取方式向文件中讀寫(xiě)記錄。92出口參數(shù):(AL)=00H:寫(xiě)記錄成功(AL)=01H:磁盤(pán)滿(mǎn),寫(xiě)記錄失?。ǎ粒蹋剑埃玻龋簲?shù)據(jù)緩沖區(qū)空間不夠,寫(xiě)記錄失敗出口參數(shù):93讀記錄(14H號(hào)子功能,教材P237下面):MOV AH,14HMOV DX,SEG FCBRECMOV DS,DXMOV DX,OFFSET FCBRECINT 21H功能:按照FCB中指定的當(dāng)前塊號(hào)、當(dāng)前記錄號(hào),確定讀操作的位置,把數(shù)據(jù)緩沖區(qū)中首地址開(kāi)始的一個(gè)記錄空間寫(xiě)入文件,并把修改FCB中當(dāng)前塊號(hào)、當(dāng)前記錄號(hào)等字段。入口參數(shù):把FCB的段基值、偏移量分別送到DS和DX。讀記錄(14H號(hào)子功能,教材P237下面):94出口參數(shù):(AL)=00H:讀記錄成功(AL)=01H:當(dāng)前讀操作的位置在文件尾,讀記錄失敗(AL)=02H:數(shù)據(jù)緩沖區(qū)空間不夠,讀記錄失敗(AL)=03H:已經(jīng)讀取到文件的最后一個(gè)記錄(可能并沒(méi)有讀取到一個(gè)完整記錄,在數(shù)據(jù)緩沖區(qū)中用0填補(bǔ)沒(méi)有數(shù)據(jù)的記錄空間)出口參數(shù):95使用順序存取方式讀寫(xiě)文件的例子:教材P235例10.4.4四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10965)以FCB的隨機(jī)存取方式讀寫(xiě)文件使用這種方式讀寫(xiě)文件不需要順序的訪問(wèn)每一個(gè)記錄,只需要給出當(dāng)前要訪問(wèn)的相對(duì)記錄號(hào),就可以任意指定文件中的讀寫(xiě)位置。用戶(hù)程序在讀寫(xiě)文件記錄時(shí),需要在FCB中指定“隨機(jī)記錄號(hào)”字段的內(nèi)容(該字段是由用戶(hù)程序維護(hù)的)。系統(tǒng)調(diào)用在使用“隨機(jī)記錄號(hào)”對(duì)文件進(jìn)行訪問(wèn)時(shí)會(huì)先把它轉(zhuǎn)換為塊號(hào)、塊內(nèi)記錄號(hào)的格式(順序存取方式使用的存取位置格式),然后再進(jìn)行具體的讀寫(xiě)操作。5)以FCB的隨機(jī)存取方式讀寫(xiě)文件97隨機(jī)方式讀文件(21H號(hào)子功能):MOV AH,21HMOV DX,SEGFCBRECMOV DS,DXMOV DX,OFFSETFCBRECINT 21H執(zhí)行上面程序片段之前,需要使用系統(tǒng)調(diào)用聲明數(shù)據(jù)緩沖區(qū)的位置;需要初始化FCB中的相關(guān)數(shù)據(jù),特別需要給出正確的隨機(jī)記錄號(hào)。入口參數(shù)、出口參數(shù)和順序方式讀文件的14H子功能完全一致。隨機(jī)方式讀文件(21H號(hào)子功能):98隨機(jī)方式寫(xiě)文件(22H號(hào)子功能):MOV AH,22HMOV DX,SEGFCBRECMOV DS,DXMOV DX,OFFSETFCBRECINT 21H入口參數(shù)、出口參數(shù)和順序方式寫(xiě)文件的15H號(hào)子功能完全一致。隨機(jī)方式寫(xiě)文件(22H號(hào)子功能):996)以隨機(jī)分塊存取方式讀寫(xiě)文件這種文件讀寫(xiě)方式和隨即存取方式很相似,所不同的是它能一次讀取或?qū)懭攵鄠€(gè)記錄(注意,這里的數(shù)據(jù)緩沖區(qū)空間要設(shè)置得足夠大)。讀操作通過(guò)27H號(hào)子功能實(shí)現(xiàn),寫(xiě)操作通過(guò)28H號(hào)子功能實(shí)現(xiàn),比隨機(jī)存取方式多一個(gè)入口參數(shù):需要把讀取或?qū)懭氲挠涗泜€(gè)數(shù)送到CX保存。其他方面,隨機(jī)分塊存取方式和隨機(jī)存取方式幾乎完全相同。6)以隨機(jī)分塊存取方式讀寫(xiě)文件100(2)基于文件句柄的磁盤(pán)功能調(diào)用使用FCB對(duì)文件進(jìn)行操作時(shí),只能針對(duì)當(dāng)前目錄下的文件,而且需要維護(hù)FCB中的部分?jǐn)?shù)據(jù),使用不是很方便.在DOS2.0以后的DOS版本,都提供基于文件句柄的磁盤(pán)功能調(diào)用,只要給出文件的完整路徑,通過(guò)系統(tǒng)調(diào)用創(chuàng)建、打開(kāi)文件后,得到文件句柄,就可以針對(duì)任意指定的文件進(jìn)行讀寫(xiě)操作,而且不需要維護(hù)FCB。使用句柄對(duì)文件進(jìn)行操作,已經(jīng)和高級(jí)語(yǔ)言中文件的操作方法很接近。(2)基于文件句柄的磁盤(pán)功能調(diào)用1011)有關(guān)參數(shù)的解釋?zhuān)ǎ模希诱{(diào)用的入口、出口參數(shù))A)ASCIIZ字符串用于保存所操作文件的完整路徑,是一個(gè)普通的字符串,但是它一定以0字節(jié)結(jié)尾。PATHNAME DB ‘C:\MASM\TEST\TEST.DAT’,0在創(chuàng)建或打開(kāi)文件時(shí)需要ASCIIZ字符串作為入口參數(shù)。1)有關(guān)參數(shù)的解釋?zhuān)ǎ模希诱{(diào)用的入口、出口參數(shù))102B)文件屬性用于定義文件的特征,用一個(gè)字節(jié)來(lái)表示,每一個(gè)數(shù)據(jù)位對(duì)應(yīng)一種特征(參見(jiàn)教材P240下面)。在創(chuàng)建新文件的時(shí)候需要指明文件屬性,把它作為入口參數(shù)。一個(gè)文件可以同時(shí)擁有多種屬性,只要在創(chuàng)建文件時(shí)把文件屬性字節(jié)中相應(yīng)的數(shù)據(jù)位置1即可。B)文件屬性103C)文件句柄是一個(gè)16位的二進(jìn)制編號(hào),操作系統(tǒng)中當(dāng)前所有被打開(kāi)文件都有這樣一個(gè)編號(hào)(相當(dāng)于被打開(kāi)文件的身份證)。通過(guò)文件句柄,操作系統(tǒng)可以找到關(guān)于該文件的所有信息,包括文件類(lèi)型、存取方式、文件指針等等(這些信息是由操作系統(tǒng)維護(hù)的)。用戶(hù)程序不需要知道文件的詳細(xì)信息,只需要給完成讀寫(xiě)操作的系統(tǒng)調(diào)用提供文件句柄作為入口參數(shù),就可以完成對(duì)應(yīng)文件的讀寫(xiě)操作。在創(chuàng)建文件、打開(kāi)文件的系統(tǒng)調(diào)用中,文件句柄是出口參數(shù)。C)文件句柄104在操作系統(tǒng)中,總是存在一些特殊的設(shè)備文件(一些標(biāo)準(zhǔn)輸入、輸出設(shè)備被看作是文件),只要操作系統(tǒng)還在運(yùn)行,這些文件總是打開(kāi)的。操作系統(tǒng)提供這些設(shè)備文件的句柄,用戶(hù)程序可以直接使用這些句柄對(duì)標(biāo)準(zhǔn)輸入、輸出設(shè)備進(jìn)行讀寫(xiě)操作,通過(guò)文件讀寫(xiě)的方式完成數(shù)據(jù)的輸入和輸出。具體的特殊文件句柄參見(jiàn)教材P241在操作系統(tǒng)中,總是存在一些特殊的設(shè)備文件(一些標(biāo)準(zhǔn)輸入、輸出105D)存取代碼在打開(kāi)文件或者移動(dòng)文件指針時(shí),需要指明存取代碼作為入口參數(shù)。(AL)=00H:只讀方式(AL)=01H:只寫(xiě)方式(AL)=02H:讀寫(xiě)方式D)存取代碼106E)錯(cuò)誤代碼在執(zhí)行某一個(gè)基于句柄的系統(tǒng)調(diào)用時(shí),如果出現(xiàn)了錯(cuò)誤,系統(tǒng)調(diào)用會(huì)把CF標(biāo)志置1,并且把錯(cuò)誤代碼送到AX保存。如果沒(méi)有錯(cuò)誤,系統(tǒng)調(diào)用會(huì)把CF標(biāo)志置0。具體錯(cuò)誤代碼的含義可以參見(jiàn)教材P241下面。E)錯(cuò)誤代碼1072)使用ASCIIZ字符串指定的路徑創(chuàng)建文件,并且獲得該文件的句柄(3CH號(hào)子功能)MOV AH,3CHMOV CX,20HLEA DX,PATHNAMEINT 21HJC CERRORMOV HANDLESAV,AX默認(rèn)PATHNAME在DS指向的段中。文件句柄一定要妥善保存,因?yàn)橐院蟮奈募僮鞫际鞘褂镁浔鷣?lái)實(shí)現(xiàn),不再使用ASCIIZ字符串。2)使用ASCIIZ字符串指定的路徑創(chuàng)建文件,并且獲得該文1083)使用ASCIIZ字符串指明的文件路徑打開(kāi)文件,并且取得該文件的句柄(3DH號(hào)子功能)MOV AH,3DHMOV AL,00HLEA DX,PATHNAMEINT 21HJC OERRORMOV HANDLESAV,AX默認(rèn)PATHNAME在DS指向的段中。3)使用ASCIIZ字符串指明的文件路徑打開(kāi)文件,并且取得1094)使用文件句柄讀文件中的數(shù)據(jù)(3FH號(hào)子功能)MOV AH,3FHMOV BX,HANDLESAVMOV CX,512LEA DX,DATAAREAINT 21HJC RERRORCMP AX,0JE ENDFILE默認(rèn)數(shù)據(jù)緩沖區(qū)DATAAREA在DS指向的段中出口參數(shù)解釋?zhuān)喝绻茫疲剑?,那么讀操作失敗,(AX)為錯(cuò)誤碼;如果CF=0,讀操作成功,(AX)不為0,則解釋為實(shí)際讀入的字節(jié)數(shù)(可能小于或等于入口參數(shù)(CX)指定的字節(jié)數(shù)),(AX)=0,那么沒(méi)有讀入任何數(shù)據(jù),已經(jīng)到了文件尾。4)使用文件句柄讀文件中的數(shù)據(jù)(3FH號(hào)子功能)1105)使用文件句柄向文件中寫(xiě)入數(shù)據(jù)(40H號(hào)子功能)MOV AH,40HMOV BX,HANDLESAVMOV CX,256LEA DX,DATAAREAINT 21HJC WERRORCMP AX,256JNE WFERROR默認(rèn)數(shù)據(jù)緩沖區(qū)DATAAREA在DS指向的段中出口參數(shù)解釋?zhuān)喝绻茫疲剑?,表示?xiě)操作失敗,(AX)為錯(cuò)誤代碼;如果CF=0,表示寫(xiě)操作成功,(AX)為實(shí)際寫(xiě)入文件中的字節(jié)數(shù)(可能等于或小于入口參數(shù)(CX)指定的字節(jié)數(shù)),如果實(shí)際寫(xiě)入字節(jié)數(shù)小于要求寫(xiě)入的字節(jié)數(shù),可能是磁盤(pán)空間滿(mǎn)所造成的,程序中需要當(dāng)作一種錯(cuò)誤來(lái)處理。5)使用文件句柄向文件中寫(xiě)入數(shù)據(jù)(40H號(hào)子功能)1116)使用文件句柄關(guān)閉文件(3E號(hào)子功能)MOV AH,3EHMOV BX,HANDLESAVINT 21H出口參數(shù)解釋?zhuān)海茫疲剑北硎娟P(guān)閉文件失敗,(AX)中的錯(cuò)誤代碼解釋失敗原因;CF=0表示文件正常關(guān)閉。6)使用文件句柄關(guān)閉文件(3E號(hào)子功能)112有了上面這些基本操作,使用句柄對(duì)文件進(jìn)行讀寫(xiě)操作已經(jīng)可以實(shí)現(xiàn)。通過(guò)使用其他的一些子功能,可以使基于句柄的文件操作變得更加豐富。41H:刪除文件42H:移動(dòng)文件指針43H:檢測(cè)或者改變文件屬性有關(guān)這方面的系統(tǒng)調(diào)用可以參見(jiàn)教材P366的附錄三。但是這些資料很不全面,如果需要具體應(yīng)用,還要查找其他相關(guān)書(shū)籍。使用句柄方式操作文件的例子:教材P243的例10.4.5有了上面這些基本操作,使用句柄對(duì)文件進(jìn)行讀寫(xiě)操作已經(jīng)可以實(shí)現(xiàn)113(三)打印功能調(diào)用這里僅介紹打印單個(gè)字符的打印功能(05H號(hào)子功能)。MOV AH,05HMOV DL,ASCII碼或者控制字符INT 21H除了可以打印標(biāo)準(zhǔn)的ASCII碼字符以外,05H號(hào)子功能還可以處理針對(duì)打印過(guò)程的控制字符(控制以后的打印格式等等,可能并沒(méi)有實(shí)際打印某個(gè)字符)。具體的控制字符可以參見(jiàn)教材P247的表10-5和表10-6。例子:教材P247的例10.4.6(三)打印功能調(diào)用114第十章BIOS系統(tǒng)調(diào)用部分通常所說(shuō)的BIOS(BaseInputOutputSystem)是系統(tǒng)主板上一塊8K容量的ROM(ReadOnlyMemory),基本硬件接口對(duì)應(yīng)的中斷服務(wù)程序和相關(guān)的底層系統(tǒng)調(diào)用都固化在這塊芯片中。由于空間有限,BIOS中的匯編語(yǔ)言程序都設(shè)計(jì)得短小精干,十分巧妙。DOS操作系統(tǒng)中有一個(gè)名叫IBMBIO.SYS系統(tǒng)文件,是BIOS的擴(kuò)展部分它保存了擴(kuò)展硬件接口的部分中斷服務(wù)程序和相關(guān)的系統(tǒng)調(diào)用,在計(jì)算機(jī)系統(tǒng)啟動(dòng)時(shí),操作系統(tǒng)會(huì)把它加載到內(nèi)存中。第十章BIOS系統(tǒng)調(diào)用部分115到了WINDOWS時(shí)代,硬件越來(lái)越復(fù)雜,種類(lèi)越來(lái)越豐富,使用BIOS中的標(biāo)準(zhǔn)中斷服務(wù)程序和系統(tǒng)調(diào)用遠(yuǎn)遠(yuǎn)不能滿(mǎn)足需求。僅限于擴(kuò)充一個(gè)IMBBIO.SYS也是遠(yuǎn)遠(yuǎn)不夠的。一般由硬件生產(chǎn)廠商提供驅(qū)動(dòng)程序,WINDOWS操作系統(tǒng)會(huì)把驅(qū)動(dòng)程序中的必要部分加載到內(nèi)存,用驅(qū)動(dòng)程序中的中斷入口地址替換中斷向量表中原本指向BIOS中斷服務(wù)程序的中斷入口。BIOS的作用越來(lái)越小,但是在系統(tǒng)剛啟動(dòng)那一階段,所執(zhí)行的檢測(cè)基本硬件、使用基本硬件的系統(tǒng)調(diào)用,仍然在BIOS中,因?yàn)槟莻€(gè)階段操作系統(tǒng)還未加載到系統(tǒng)中。BIOS在計(jì)算機(jī)系統(tǒng)中仍然具有一些不可替代的作用。到了WINDOWS時(shí)代,硬件越來(lái)越復(fù)雜,種類(lèi)越來(lái)越豐富,使用116(1)鍵盤(pán)調(diào)用(16H號(hào)調(diào)用)有關(guān)鍵盤(pán)的中斷調(diào)用中,除了BIOS中09H號(hào)中斷服務(wù)程序直接訪問(wèn)鍵盤(pán)接口中的端口外,其余的無(wú)論是DOS調(diào)用還是BIOS調(diào)用,都是以?xún)?nèi)存中的鍵盤(pán)緩沖區(qū)為訪問(wèn)對(duì)象。四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch101171)00H號(hào)子功能功能:等待按鍵,把所按鍵的ASCII碼(由顯卡解釋的顯示編碼)和掃描碼(反映按鍵物理位置的鍵盤(pán)編碼)分別返回到AL和AH中。使用方法:MOV AH,0INT 16H注意:該調(diào)用不帶回顯,BIOS調(diào)用目標(biāo)非?;A(chǔ)和明確,針對(duì)鍵盤(pán)的調(diào)用就只針對(duì)鍵盤(pán),不會(huì)針對(duì)其它設(shè)備。BIOS調(diào)用是面向設(shè)備的,DOS調(diào)用是面向應(yīng)用的。1)00H號(hào)子功能1182)01H號(hào)子功能功能:檢測(cè)鍵盤(pán)緩沖區(qū)有無(wú)數(shù)據(jù),如果沒(méi)有數(shù)據(jù),把ZF標(biāo)志置1;如果有數(shù)據(jù),把ZF標(biāo)志置0,并且把隊(duì)首的ASCII碼返回到AL中。使用方法:MOV AH,01HINT 16H特別注意,該調(diào)用返回鍵盤(pán)緩沖區(qū)的隊(duì)首ASCII碼后,并不把它從鍵盤(pán)緩沖區(qū)清除掉,如果使用循環(huán)結(jié)構(gòu)取按鍵的ASCII碼就有可能出錯(cuò)誤。2)01H號(hào)子功能119例如:LOP1:MOV AH,01H INT 16H JZ LOP1 MOV DL,AL MOV AH,02H INT 21H JMP LOP1始終只能取到第一個(gè)按鍵的ASCII碼,因?yàn)樵撟址阪I盤(pán)緩沖區(qū)始終未能被清除。例如:120正確的寫(xiě)法:LOP1:MOV AH,01H INT 16H JZ LOP1 MOV AH,00H INT 16H MOV DL,AL MOV AH,02H INT 21H JMP LOP1第0號(hào)子功能會(huì)在讀取隊(duì)首ASCII碼之后清掉該字符。正確的寫(xiě)法:1213)02H號(hào)子功能功能:返回鍵盤(pán)狀態(tài)字節(jié),存放到AL中。狀態(tài)字節(jié)各個(gè)數(shù)據(jù)位的含義參見(jiàn)教材P249下面的圖。使用方法:MOV AH,02HINT 16H關(guān)于鍵盤(pán)BIOS調(diào)用的例子參見(jiàn)教材P249的例10.5.13)02H號(hào)子功能122(2)有關(guān)顯示的BIOS調(diào)用1)顯示器的工作原理(補(bǔ)充內(nèi)容)顯象管通過(guò)電場(chǎng)或者磁場(chǎng)來(lái)控制陰極射線管發(fā)射的電子流方向,使電子流擊中屏幕的不同部位,形成完整的圖像顯示。電場(chǎng)控制是通過(guò)電容來(lái)實(shí)現(xiàn)的,如下圖所示:(2)有關(guān)顯示的BIOS調(diào)用123控制電子流水平方向偏轉(zhuǎn)角度控制電子流垂直方向偏轉(zhuǎn)角度控制通過(guò)電場(chǎng)實(shí)現(xiàn)假定電子流正常方向是垂直于顯示平面向外虛線框?yàn)榧俣ǖ娘@示范圍,圓圈表示沒(méi)有任何電場(chǎng)時(shí),電子流擊中的部位控制控制電子流垂直方向偏轉(zhuǎn)角度控制通過(guò)假定電子流虛線框?yàn)榧俣?24電子流的偏轉(zhuǎn)也可以通過(guò)磁場(chǎng)來(lái)控制,具體使用的器件是兩個(gè)電感,一個(gè)用于控制水平方向的偏轉(zhuǎn)角度,一個(gè)用于控制垂直方向的偏轉(zhuǎn)角度。如下圖所示:四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10125四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10126只要控制電容上的電荷量或者控制電感線圈的電流大小,就可以實(shí)現(xiàn)任意的角度控制。電子流垂直方向的角度控制稱(chēng)為幀掃描控制(逐行掃描的顯示器中)或者場(chǎng)掃描控制(隔行掃描的顯示器中);水平方向的角度控制稱(chēng)為行掃描控制。針對(duì)兩個(gè)方向上的角度控制,顯示器內(nèi)部提供了兩種控制信號(hào):幀掃描信號(hào)和行掃描信號(hào),具體可能是電壓,也可能是電流,這取決于具體顯示器本身的設(shè)計(jì),這里不作具體解釋。只要控制電容上的電荷量或者控制電感線圈的電流大小,就可以實(shí)現(xiàn)127幀(場(chǎng))掃描信號(hào)幀(場(chǎng))掃描過(guò)程(正程)幀(場(chǎng))掃描回程,電子流會(huì)被消隱信號(hào)阻礙,不能到達(dá)屏幕行掃描信號(hào),也包含正程和回程幀(場(chǎng))掃描信號(hào)和行掃描信號(hào)的頻率必須配合恰當(dāng),一個(gè)幀掃描正程或回程必須包含整數(shù)個(gè)行掃描全程(包括正程和回程),否則得不到正確的顯示。00幀(場(chǎng))掃描信號(hào)幀(場(chǎng))掃描過(guò)程(正程)幀(場(chǎng))掃描回程,行128逐行顯示的掃描過(guò)程:逐行顯示的掃描過(guò)程:129逐行掃描過(guò)程:后期出現(xiàn)的顯示器基本上都是這種掃描方式,一次垂直掃描顯示一幅完整的圖像。由于人眼需要25幀/秒的幀掃描速度才能感覺(jué)到圖像的連貫性,所以這種顯示器使用的電子器件較為先進(jìn),一般采用電容控制,掃描速度很快。四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10130隔行掃描過(guò)程:早期的顯示器或者電視機(jī)都采用這種掃描方式,一幀圖像需要兩次連續(xù)的垂直掃描過(guò)程(場(chǎng)掃描)才能完成,一次用于掃描顯示圖像的奇數(shù)行,一次用于掃描顯示偶數(shù)行。如果能夠達(dá)到25場(chǎng)/秒的速度,由于奇偶行交替掃描,利用電子流打擊屏幕后發(fā)光點(diǎn)不會(huì)立即消失的特征,給人一種“假連貫”的感覺(jué),實(shí)際上是有閃爍現(xiàn)象的。隔行掃描過(guò)程:早期的顯示器或者電視機(jī)都采用這種掃描方式,一幀131顯示器的掃描頻率是由顯卡直接控制的,采用自動(dòng)跟蹤技術(shù),由顯卡發(fā)出幀掃描和行掃描的同步信號(hào),顯示器則自動(dòng)跟蹤接收到的同步信號(hào),調(diào)整幀掃描和行掃描的頻率。四川大學(xué)計(jì)算機(jī)學(xué)院匯編語(yǔ)言課件ch10132顯卡發(fā)出的掃描同步信號(hào)掃描信號(hào)(幀或行都是如此)顯卡發(fā)出的掃描同步信號(hào)掃描信號(hào)(幀或行都是如此)133幀掃描和行掃描頻率的確定是通過(guò)設(shè)置顯卡中的幀掃描控制端口和行掃描控制端口來(lái)實(shí)現(xiàn)。一般只需要把表示掃描頻率的整數(shù)寫(xiě)入控制端口就可以改變掃描頻率。顯示器所能支持的掃描(刷新)頻率和顯卡里能設(shè)置的掃描頻率是兩回事情,但是顯示器總是依靠跟蹤顯卡發(fā)出的掃描同步信號(hào)來(lái)進(jìn)行掃描過(guò)程的。幀掃描和行掃描頻率的確定是通過(guò)設(shè)置顯卡中的幀掃描控制端口和行134顯示器所能支持的最高掃描頻率是由自身所使用電子器件的性能決定的,一般出廠時(shí)都附有技術(shù)指標(biāo)。如果超過(guò)最高掃描頻率,則可能對(duì)顯示器中的某些元件造成永久性的損壞。顯卡所能支持的最高掃描(刷新)頻率是由顯卡本身的處理速度決定的,它能自己檢查當(dāng)前所要設(shè)置的掃描頻率是否為自己支持的,如果不支持,它會(huì)拒絕設(shè)置。顯示器所能支持的最高掃描頻率是由自身所使用電子器件的性能決定135在目前的很多顯示器中,顯示器的掃描過(guò)程完全是通過(guò)跟蹤顯卡發(fā)出的掃描同步信號(hào)來(lái)實(shí)現(xiàn)的,沒(méi)有自主權(quán)。試想一下這樣的情況,顯卡的性能憂(yōu)于顯示器,它能支持比當(dāng)前所使用顯示器更高的掃描頻率。如果通過(guò)操作系統(tǒng)或自己編制的應(yīng)用程序向顯卡的掃描控制端口寫(xiě)入了顯示器不支持的高掃描頻率。那么顯示器會(huì)強(qiáng)行跟蹤這種高頻率的掃描同步信號(hào),處于超負(fù)荷的工作狀態(tài),可能會(huì)損壞顯示器中的部分元件(損壞時(shí)間不一定)。直接針對(duì)顯卡編制程序的時(shí)候需要特別小心。在目前的很多顯示器中,顯示器的掃描過(guò)程完全是通過(guò)跟蹤顯卡發(fā)出136分辨率:指所顯示圖形或圖像的精細(xì)程度,顯示器當(dāng)前把屏幕分為多少行,每行分為多少個(gè)像素。像素:簡(jiǎn)單的解釋?zhuān)褪请娮恿髟谄聊簧洗驌艉罅粝碌陌l(fā)光點(diǎn),是組成圖像的基本單位,當(dāng)然有時(shí)不是這樣解釋。和掃描頻率一致,顯示器和顯卡所能支持的最大分辨率可能不相同。分辨率:指所顯示圖形或圖像的精細(xì)程度,顯示器當(dāng)前把屏幕分為多137對(duì)于灰度顯示器,控制電子流打擊屏幕的速度,就可以控制所顯示圖像中每個(gè)像素的亮度,通過(guò)電場(chǎng)控制可以實(shí)現(xiàn),電場(chǎng)的方向和電子流的發(fā)射方向相反。對(duì)于彩色顯示器,它有三個(gè)電子噴槍?zhuān)譃榧t、藍(lán)、綠三種基本顏色,稱(chēng)為三原色。三個(gè)電子槍在屏幕上打出三個(gè)彩色亮點(diǎn),呈“品”字形狀,把它看作一個(gè)象素??刂迫牟煌炼冉M合,可以生成各種顏色的像素,如果三原色中的每種顏色有X個(gè)亮度等級(jí),那么總共可以表達(dá)的顏色數(shù)目是X的三次方個(gè)。對(duì)于灰度顯示器,控制電子流打擊屏幕的速度,就可以控制所顯示圖138無(wú)論所顯示的是灰度圖像還是彩色圖像,像素值都是按照行列順序存放在顯存中。根據(jù)顯示模式的不同,一個(gè)像素可能只占用一個(gè)字節(jié),也可能占用多個(gè)字節(jié)。對(duì)于隔行顯示器來(lái)說(shuō),顯卡必須使用隔行顯示模式,一幀圖像中的像素分奇偶場(chǎng)分別存放在顯存中的特定位置。無(wú)論所顯示的是灰度圖像還是彩色圖像,像素值都是按照行列順序存139顯示存儲(chǔ)器訪問(wèn)仲裁邏輯地址線數(shù)據(jù)線控制線CPU的訪問(wèn)來(lái)自系統(tǒng)總線顯示邏輯的訪問(wèn)來(lái)自顯卡內(nèi)部普通顯存工作原理顯示存儲(chǔ)器訪問(wèn)地址線數(shù)據(jù)線控制線CPU的訪問(wèn)顯示邏輯的訪問(wèn)普140顯示存儲(chǔ)器0訪問(wèn)仲裁邏輯地址線數(shù)據(jù)線控制線CPU的訪問(wèn)來(lái)自系統(tǒng)總線顯示邏輯的訪問(wèn)來(lái)自顯卡內(nèi)部雙幀切換技術(shù)顯示存儲(chǔ)器1顯示存儲(chǔ)器0訪問(wèn)地址線數(shù)據(jù)線控制線CPU的訪問(wèn)顯示邏輯的訪問(wèn)141文本方式下,字符顯示原理:每一個(gè)字符的圖像模板(X*Y的點(diǎn)陣)被按照一定的順序固化在顯卡的ROM芯片中,要顯示一個(gè)字符時(shí),顯卡的字符顯示邏輯會(huì)按照給定的ASCII碼(圖像模板的編號(hào))在ROM中查找對(duì)應(yīng)的圖像模板,然后用該模板控制顯示器中陰極射線管發(fā)射的電子流,從而顯示出字符的形狀。只有文本方式下的字符顯示在是這樣的顯示原理,如果是在圖形顯示方式下,那么實(shí)際上是應(yīng)用程序把字符作為小圖像在顯示。WINDOWS等圖形界面的操作系統(tǒng),都自己構(gòu)造了字符的圖像模板,并且提供了多種字體,并沒(méi)有使用顯卡提供的基本圖像模板。文本方式下,字符顯示原理:142上面所說(shuō)的顯示過(guò)程都是針對(duì)像素顯示器,基于圖像的顯示原理,但是它也可以用于顯示圖形。還有另一種顯示器,稱(chēng)為矢量顯示器,這種顯示器很少,一般用于專(zhuān)業(yè)的圖形顯示,基于圖形顯示的原理。矢量顯示器的掃描機(jī)制和像素顯示器是一致的,沒(méi)有幀掃描和行掃描的概念,它的掃描過(guò)程是由所顯示的圖形來(lái)決定的。相關(guān)細(xì)節(jié)可以查閱課外資料。上面所說(shuō)的顯示過(guò)程都是針對(duì)像素顯示器,基于圖像的顯示原理,但1432)BIOS的顯示調(diào)用(10H號(hào)系統(tǒng)調(diào)用)設(shè)置顯示模式(00H號(hào)子功能)功能:設(shè)置當(dāng)前的顯示模式。使用方法:MOV AH,00HMOV AL,顯示模式編號(hào)INT 10H關(guān)于顯示編號(hào)與具體顯示模式的對(duì)應(yīng)可以參見(jiàn)教材P372中有關(guān)00H號(hào)子功能的說(shuō)明。例子:教材P251上面2)BIOS的顯示調(diào)用(10H號(hào)系統(tǒng)調(diào)用)144讀取當(dāng)前顯示模式編號(hào)(0FH子功能)功能:取得當(dāng)前顯示模式編號(hào)存放在AL中,當(dāng)前顯示模式對(duì)應(yīng)的列數(shù)存放在AH中,當(dāng)前顯示頁(yè)面的編號(hào)存放在BH中。在文本顯示模式下,才有顯示頁(yè)面的概念。顯存中有多個(gè)頁(yè)面,當(dāng)前顯示在屏幕上的只是其中一個(gè),一般只使用第0個(gè)頁(yè)面。有時(shí)可以通過(guò)切換顯示頁(yè)面來(lái)快速的改變所顯示內(nèi)容。使用方法:MOV AH,0FHINT 10H主要用途:在應(yīng)用程序改變顯示模式前,需要先保存原有的顯示模式,以便應(yīng)用程序退出時(shí)恢復(fù)以前的顯示模式。讀取當(dāng)前顯示模式編號(hào)(0FH子功能)145置光標(biāo)類(lèi)型(01H號(hào)子功能)功能:光標(biāo)最大由16行像素(編號(hào)為0到15)組成,通過(guò)指定光標(biāo)的起始行和結(jié)束行,可以確定光標(biāo)的粗細(xì),方位(靠上或靠下)。使用方法:MOV AH,01HMOV CH,光標(biāo)起始行號(hào)(低3位表示)MOV CL,光標(biāo)結(jié)束行號(hào)(低3位表示)INT 21H注意:只有在文本顯示模式下,才有光標(biāo)的概念。置光標(biāo)類(lèi)型(01H號(hào)子功能)146置光標(biāo)位置(02H):功能:設(shè)置光標(biāo)當(dāng)前位置,也就是下一次字符顯示的位置,僅在文本顯示模式下可用。使用方法:MOV AH,02HMOV BH,頁(yè)號(hào)(當(dāng)前頁(yè)號(hào)可用0FH子功能獲得)MOV DH,行號(hào)MOV DL,列號(hào)INT 10H置光標(biāo)位置(02H):147讀光標(biāo)位置(03H)功能:獲取指定顯示頁(yè)面中當(dāng)前的光標(biāo)位置,僅在文本方式下可用。出口參數(shù):光標(biāo)行號(hào)保存在DH中,列號(hào)保存在DL中,光標(biāo)起始行保存在CH中。使用方法:MOV AH,03HMOV BH,頁(yè)號(hào)INT 10H注意:每一個(gè)頁(yè)面都有一個(gè)光標(biāo)位置,字符顯示一般總是在當(dāng)前頁(yè)面的光標(biāo)位置進(jìn)行的。讀光標(biāo)位置(03H)148設(shè)置當(dāng)前顯示頁(yè)面(05H)功能:改變當(dāng)前所顯示的頁(yè)面,可以在文本顯示模式下立即改變顯示內(nèi)容。使用方法:MOV AH,05HMOV AL,頁(yè)面編號(hào)INT 10H設(shè)置當(dāng)前顯示頁(yè)面(05H)149清屏或文本上卷(06H)功能:在文本模式下清除某個(gè)矩形范圍內(nèi)的顯示內(nèi)容,或者在某個(gè)矩形范圍內(nèi)對(duì)文本實(shí)行上卷操作。使用方法:MOV AH,06HMOV AL,上卷行數(shù)(為0時(shí)表示清除)MOV BH,卷入行屬性MOV CH,矩形范圍左上角行號(hào)MOV CL,矩形范圍左上角列號(hào)MOV DH,矩形范圍右上角行號(hào)MOV DL,矩形范圍右上角列號(hào)INT 10H清屏或文本上卷(06H)150清屏或文本下卷(07H)功能:在文本模式下清除某個(gè)矩形范圍內(nèi)的顯示內(nèi)容,或者在某個(gè)矩形范圍內(nèi)對(duì)文本實(shí)行下卷操作。使用方法:MOV AH,07HMOV AL,下卷行數(shù)(為0時(shí)表示清除)MOV BH,卷入行屬性MOV CH,矩形范圍左上角行號(hào)MOV CL,矩形范圍左上角列號(hào)MOV DH,矩形范圍右上角行號(hào)MOV DL,矩形范圍右上角列號(hào)INT 10H清屏或文本下卷(07H)151寫(xiě)像素(0CH)功能:在圖形顯示模式下,對(duì)指定像素坐標(biāo)寫(xiě)入像素值(一個(gè)字節(jié),如果是灰度圖像,表示亮度,如果是256色彩色圖像,表示顏色)。使用方法:MOV AH,0CHMOV DX,行號(hào)MOV CX,列號(hào)MOV AL,像素值INT 16H寫(xiě)像素(0CH)152讀像素(0DH)功能:在圖形顯示模式下,獲取指定坐標(biāo)

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論