




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
匯編語言程序設(shè)計第10章匯編語言程序設(shè)計第10章110.1概述在微型計算機(jī)中,CPU與外部設(shè)備之間的信息傳送是通過接口進(jìn)行的,每個接口由一組寄存器組成,這些寄存器用來存放命令、狀態(tài)和數(shù)據(jù),為了對這些寄存器進(jìn)行存取,它們都分配有一個稱為I/O端口的地址編碼。在80x86系統(tǒng)中,I/O端口編址在一個獨立的地址空間中,這個空間對80x86來講,允許設(shè)置64K個8位端口或32K個16位端口;80386和80486提供了一個獨立的I/O地址空間。I/O地址空間由216(64K)個可獨立編址的8位端口(即64KB)組成。任意兩個連續(xù)的8位端口可作為16位端口處理;4個連續(xù)的8位端口可作為32位端口處理。10.1概述在微型計算機(jī)中,CPU2最新匯編語言程序設(shè)計第10章課件3最新匯編語言程序設(shè)計第10章課件4最新匯編語言程序設(shè)計第10章課件5最新匯編語言程序設(shè)計第10章課件6最新匯編語言程序設(shè)計第10章課件7最新匯編語言程序設(shè)計第10章課件8
4.舉例
INAL,0FAH ;從端口0FAH輸入8位數(shù)到ALINEAX,28H ;將端口28H、29H、2AH和2BH的32位數(shù)送EAXMOVDX,3AEH ;I/O地址大于255時,應(yīng)通過DX間接尋址IN AX,DX ;從DX指出的端口輸入16位數(shù)到AXOUT21H,AL ;將8位數(shù)從AL輸出到端口21HOUTDX,EAX ;將32位數(shù)從EAX輸出到DX指出的端口4.舉例9
5.說明在保護(hù)方式下,當(dāng)處理器遇到一條I/O指令時,它首先檢查現(xiàn)行任務(wù)的特權(quán)級是否高于或等于I/O特權(quán)級,即是否CPL≤IOP1。若是,則執(zhí)行I/O操作;否則,處理器檢查I/O允許位圖,若I/O允許位圖不允許訪問,則會發(fā)生異常13。5.說明1010.1.2端口地址通過以上敘述可以看出,在進(jìn)行I/O程序設(shè)計時,需要對端口地址、控制及狀態(tài)端口的各位含義有清楚的了解。IBMPC機(jī)的部分端口地址如表10-1所示??刂萍盃顟B(tài)端口各位的含義在討論具體外設(shè)時描述。10.1.2端口地址11表10-1端口地址對照表端口地址端口設(shè)備或接口芯片00H~0FHDMA控制器0H~21H中斷控制器40H~43H時鐘/定時器60H~63H可編程外圍接口芯片200~20FH游戲適配器2F8H~2FEHCOM1320H~32FH硬盤控制器378H~37AH2號并行口(打印機(jī)適配器)3B0H~3BFH單色顯示及1號并行口3D0H~3DFH彩色/圖形適配器3F0H~3F7H軟盤控制器3F8H~3FEHCOM2表10-1端口地址對照表端口地址端口設(shè)備或接口芯片00H1210.1.3CPU與外設(shè)之間的信息交換方式CPU與外設(shè)通過硬件接口電路或控制器相連接,這些接口或控制器中都有數(shù)量不等的端口,用作CPU與外設(shè)之間傳送數(shù)據(jù)及提供數(shù)據(jù)傳送所需要的控制邏輯與信號。使用IN、OUT指令對這些端口進(jìn)行操作,便可以實現(xiàn)CPU與外設(shè)的信息交換。概括起來,CPU與外設(shè)需要交換的信息有:數(shù)據(jù)信息、狀態(tài)信息以及控制信息。例如,當(dāng)需要在打印機(jī)上打印一個字符(數(shù)據(jù))時,需要先檢查打印機(jī)是否準(zhǔn)備好(狀態(tài)),若準(zhǔn)備好則輸出選通命令(控制),以便打印。10.1.3CPU與外設(shè)之間的信息交換方式13CPU與外設(shè)之間的信息交換通常有程序查詢、中斷傳送、DMA(直接存儲器存取)、通道、I/O處理機(jī)管理等幾種方式。CPU尋址外設(shè)有兩種方式,一種是存儲器對應(yīng)輸入/輸出方式,另一種是端口尋址方式。其中,存儲器對應(yīng)輸入/輸出方式把一個外設(shè)作為一個存儲單元對待,一次輸入/輸出操作就相當(dāng)于一次存儲器的讀/寫操作,這種方式雖然優(yōu)點不少,但實際應(yīng)用卻不多,因為它本身不直觀,容易與正常的存儲器讀/寫操作混淆,同時還需要占用存儲器的部分空間并給存儲器地址分配帶來不便。CPU輸入/輸出端口尋址方式設(shè)有專門的輸入/輸出指令,并要求為外設(shè)接口分配端口地址。這種端口尋址方式為一個端口一個地址,使用專門的輸入/輸出指令,使用方便,不易出錯,清楚直觀。需要注意的是,端口尋址可以為直接方式尋址或間接方式尋址。直接方式可以尋址0~255個端口地址。間接方式通過DX寄存器給出端口地址,可尋址64K個端口地址。CPU與外設(shè)之間的信息交換通常有程序查詢、中141.?dāng)?shù)據(jù)信息數(shù)據(jù)通常為8位或16位,可分為3種基本類型:數(shù)字量、模擬量和開關(guān)量。一般地,由鍵盤、光電輸入機(jī)等提供的二進(jìn)制形式的信息為數(shù)字量數(shù)據(jù)。電機(jī)的啟停、開關(guān)的開合等可用兩個狀態(tài)表示的量,即用一位二進(jìn)制數(shù)表示,這樣的量稱為開關(guān)量;由傳感器等提供的信號往往是模擬量,它需先經(jīng)模/數(shù)(A/D)轉(zhuǎn)換后再輸入到計算機(jī)中。例如,溫度、電壓等信號。CPU與外設(shè)進(jìn)行數(shù)據(jù)傳送的方式有串行傳送(一位一位傳送)和并行傳送(n位同時傳送)兩種方式,但都要經(jīng)過I/O指令實現(xiàn)。串行方式比較經(jīng)濟(jì),但速度受限,而并行方式則速度較快,成本較高。1.?dāng)?shù)據(jù)信息15
2.狀態(tài)信息在輸入時,有表示輸入裝置是否已準(zhǔn)備好的信息(READY);在輸出時,有表示輸出裝置是否忙的信息(BUSY)等。
3.控制信息控制信息有控制輸入/輸出裝置的啟停信號,工作方式、工作規(guī)約及格式選擇信息等。值得指出的是,控制信息和狀態(tài)信息與數(shù)據(jù)是不同性質(zhì)的,必須要分別傳送。但它們都通過IN和OUT指令在數(shù)據(jù)總線上進(jìn)行傳送,所以通常采用分配不同端口的方法將它們加以區(qū)別。2.狀態(tài)信息1610.2中斷處理程序設(shè)計10.2.1中斷處理程序的編寫中斷是指執(zhí)行當(dāng)前程序的過程中,由于某種隨機(jī)出現(xiàn)的外設(shè)請求,使CPU暫停(即中斷)正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行為外設(shè)服務(wù)的程序;當(dāng)服務(wù)完畢后,CPU再退回到暫停處(即斷點)繼續(xù)執(zhí)行原來的程序?,F(xiàn)在,中斷的概念除了傳統(tǒng)的外部事件(硬件)引起的中斷外,又產(chǎn)生了內(nèi)部軟件中斷的概念。在80386/80486中則把許多執(zhí)行指令過程中產(chǎn)生錯誤的情況也納入了中斷處理的范圍,并將它們和通常意義上的內(nèi)部軟件中斷一起統(tǒng)稱為異常中斷,簡稱異常(Exceptions),而將通常意義上的外部中斷簡稱為中斷。10.2中斷處理程序設(shè)計10.2.1中斷處理程序的編17中斷和異常之間的區(qū)別在于,中斷用來處理CPU外部的異步事件,而異常是用來處理在執(zhí)行指令期間由CPU本身對檢測出的某些條件作出響應(yīng)的同步事件。用產(chǎn)生異常的程序和數(shù)據(jù)再次執(zhí)行時,該異??偸强稍佻F(xiàn)的,而中斷通常與現(xiàn)行執(zhí)行程序無關(guān)。但中斷和異常在使處理器暫停執(zhí)行其現(xiàn)行程序,以執(zhí)行更高優(yōu)先級程序方面是一樣的。中斷和異常之間的區(qū)別在于,中斷用來處理CP18引起中斷的原因或發(fā)出中斷請求的來源,稱為中斷源。可以根據(jù)重要性的不同為各中斷源安排不同的優(yōu)先級,CPU首先響應(yīng)優(yōu)先權(quán)高的中斷。8086具備一個簡單而靈活的中斷系統(tǒng),它能處理256種類型的中斷,中斷類型由類型號0~255指定,中斷源的情況可見圖10-1。80286以后使用兩片8259A級連結(jié)構(gòu),管理15級中斷。引起中斷的原因或發(fā)出中斷請求的來源,稱為中斷19圖10-18086的中斷源圖10-18086的中斷源20
1.外部中斷8086有兩條外部中斷請求線NMI和INTR。NMI為非屏蔽中斷,INTR為可屏蔽中斷。NMI用于重要的中斷源,如電源掉電等,它的類型號是2。CPU不禁止NMI線上的中斷請求,但可由指令STI(中斷允許標(biāo)志置“1”)和CLI(中斷允許標(biāo)志置“0”)允許和禁止INTR線上的中斷請求,即CPU可用STI和CLI指令開、關(guān)中斷,當(dāng)關(guān)中斷時,CPU將不響應(yīng)INTR線上的中斷請求。1.外部中斷21
2.內(nèi)部中斷1)除法指令在執(zhí)行除法指令時,若發(fā)現(xiàn)除數(shù)為0或商超過了寄存器所能表達(dá)的范圍,則立即產(chǎn)生一個類型0的內(nèi)部中斷。2)溢出中斷指令I(lǐng)NTO若上一條指令使溢出標(biāo)志OF置1,那么當(dāng)執(zhí)行溢出中斷指令I(lǐng)NTO時,立即產(chǎn)生一個類型4的中斷;若標(biāo)志OF為0,則此指令不起作用。2.內(nèi)部中斷223)INTn指令CPU執(zhí)行完INTn指令時立即產(chǎn)生一個中斷,所以又稱它為“軟件中斷”。中斷的類型由指令中的n指明。因為INT指令中可以指定任何的類型號,故此指令可方便地用來調(diào)試為外設(shè)編寫好的中斷服務(wù)程序。4)單步中斷若單步標(biāo)志IF為1,則在每條指令執(zhí)行后,CPU自動產(chǎn)生一個類型1的中斷(單步中斷),使程序單步執(zhí)行,它提供給用戶強(qiáng)有力的調(diào)試手段。3)INTn指令238086規(guī)定這些中斷的優(yōu)先權(quán)從高到低的順序是:●除法錯誤、INTO、INTn;●NMI;●INTR;●單步中斷。8086規(guī)定這些中斷的優(yōu)先權(quán)從高到低的順序是:243.中斷矢量表中斷矢量表占用內(nèi)存中00000H到003FFH的1KB空間。表中內(nèi)容分為256項,對應(yīng)于類型號0~255,每一項占用4個字節(jié),用來存放相應(yīng)類型的中斷服務(wù)程序的入口地址,高兩字節(jié)存放入口地址的段地址部分,低兩字節(jié)存放段內(nèi)偏移地址部分,如圖10-2所示。對于任一指定類型的中斷,CPU只要將其類型號乘4就可以得到其中斷矢量(即此類中斷在中斷矢量表中占用的4個字節(jié)的最低字節(jié)的地址),然后取出它所占有的4個字節(jié)的內(nèi)容分別送到IP和CS,就實現(xiàn)了中斷服務(wù)程序的調(diào)用,所以中斷矢量表是中斷類型號與其對應(yīng)的中斷服務(wù)程序之間的連接鏈。3.中斷矢量表25圖10-2中斷矢量表圖10-2中斷矢量表26采用中斷矢量表的方法,CPU可以直接通過中斷矢量轉(zhuǎn)向相應(yīng)的處理程序,而不必逐個檢查和確定中斷源,因而加快了中斷處理的速度。80386到PentiumCPU使用中斷描述表IDT來管理各種中斷。當(dāng)系統(tǒng)工作于實模式時,IDT變?yōu)?086中的中斷矢量表。采用中斷矢量表的方法,CPU可以直接通過中2710.2.2中斷矢量的獲取1.中斷類型號的獲取方法(1)除法錯誤、單步中斷、非屏蔽中斷NMI、斷點中斷和溢出中斷分別自動提供類型號0~5。10.2.2中斷矢量的獲取28(2)對于外部中斷INTR,可以有兩種方法提供中斷類型號。方法1:自己設(shè)計接口電路,利用寄存器/緩沖器或利用8212芯片這樣的組件存放中斷類型號。CPU響應(yīng)中斷后,接口電路將此類型號送入數(shù)據(jù)總線,CPU讀數(shù)據(jù)總線從而獲得中斷類型號。圖10-3給出了實現(xiàn)這一功能的接口電路的方框圖。(2)對于外部中斷INTR,可以有兩種29某一外設(shè)的中斷類型號可事先由輸出指令送入它的中斷類型號寄存器/緩沖器或預(yù)先將組件(如8212芯片)的引線接好。當(dāng)外部設(shè)備已準(zhǔn)備好數(shù)據(jù)可以向CPU輸送,或外設(shè)已準(zhǔn)備好可以接收來自CPU的信號時,狀態(tài)信號線上發(fā)一脈沖信號,經(jīng)中斷請求觸發(fā)器向CPU的INTR線發(fā)出中斷請求,CPU響應(yīng)中斷后,進(jìn)入中斷響應(yīng)周期,發(fā)INTA信號,此信號將已預(yù)先裝入的或由硬件芯片提供的中斷矢量號送入數(shù)據(jù)總線,CPU即可讀得。在中斷服務(wù)程序中可以安排與此外設(shè)的數(shù)據(jù)交換。可通過將圖10-3中的中斷屏蔽觸發(fā)器設(shè)置為1或為0來控制是否讓外設(shè)發(fā)中斷請求。某一外設(shè)的中斷類型號可事先由輸出指令送入它30圖10-3中斷方式接口電路方框圖圖10-3中斷方式接口電路方框圖31
例10-1已為某一外設(shè)指定中斷類型號為6,編寫此外設(shè)中斷服務(wù)程序。程序描述如下:CODESEGMENTMAIN: ;主程序HLTINTR6PROCNEAR ;中斷類型號為6的中斷服務(wù)程序STIIRETINTR6ENDP
CODENED…例10-1已為某一外設(shè)指定中斷類型號為32做了以上安排后,應(yīng)在主程序的初始化部分將此中斷服務(wù)程序的入口地址送入中斷矢量表內(nèi)對應(yīng)中斷類型6的4個單元中。完成這個功能的程序段描述如下:MOV AX,0MOV ES,AXMOV DI,06H*4MOV AX,OFFSETINTR6CLDSTOSWMOV AX,CSSTOSW做了以上安排后,應(yīng)在主程序的初始化部分將此33在所有中斷服務(wù)程序的結(jié)尾處,應(yīng)安排開中斷指令STI和從中斷返回的指令I(lǐng)RET。另一種方法:利用Intel8259A芯片。Intel8259A是可編程的中斷控制器,如圖10-1所示,它可以接收來自外設(shè)的8個各自獨立的中斷請求信號,分別為IRQ0~I(xiàn)RQ7。8259A將它們按優(yōu)先權(quán)的高低進(jìn)行排隊。IRQ0優(yōu)先權(quán)最高,依次降低,IRQ7為最低。當(dāng)某一時刻出現(xiàn)兩個或兩個以上的中斷請求信號時,8259A首先響應(yīng)優(yōu)先權(quán)高者。將中斷信號送到CPU的INTR線上,進(jìn)而又將對應(yīng)于該中斷源的惟一的中斷類型號送給CPU。CPU獲得此中斷類型號,就自動轉(zhuǎn)入對應(yīng)的中斷服務(wù)程序。在所有中斷服務(wù)程序的結(jié)尾處,應(yīng)安排開中斷指34表10-28259A的中斷源表10-28259A的中斷源8259A輸入中斷類型號設(shè)備IRQ008H定時器(通道0)IRQ109H鍵盤IRQ20AH彩色圖像接口IRQ30BH未用IRQ40CH串行(RS-232)接口IRQ50DH未用IRQ60EH軟盤IRQ70FH打印機(jī)表10-28259A的中斷源表10-28259A的中358259A中有一個中斷屏蔽寄存器(IMR),它的I/O端口地址是21H。它的位0~7對應(yīng)于IRQ0~I(xiàn)RQ7,可以通過設(shè)置這個寄存器的任一位為0或1去控制任一中斷源的中斷允許或禁止。某位為0表示允許該中斷源發(fā)出的中斷請求信號經(jīng)8259A產(chǎn)生一個要發(fā)給CPU的中斷,為1則禁止該中斷源。例如,只允許鍵盤中斷,則可設(shè)置如下中斷屏蔽字:MOVAL,0FDHOUT21H,AL8259A中有一個中斷屏蔽寄存器(IMR)36使用8259A時,應(yīng)在主程序開始處按上述原則初始化中斷屏蔽寄存器。在中斷服務(wù)程序的結(jié)束處應(yīng)發(fā)出“中斷結(jié)束”(EOI)命令(20H)給8259A的中斷命令寄存器(I/O端口地址20H),具體程序如下:MOVAL,20HOUT20H,AL使用8259A時,應(yīng)在主程序開始處按上述原則37
2.中斷過程在調(diào)用相應(yīng)的中斷服務(wù)程序前,CPU先將機(jī)器狀態(tài)用標(biāo)志位入棧的方法保存起來。接著CPU清除標(biāo)志位IF和TF,屏蔽新的中斷請求和單步中斷。然后,CPU把當(dāng)前的代碼段寄存器的內(nèi)容入棧保護(hù),從矢量表(高兩個字節(jié))中取出新的代碼段寄存器值送至CS;接著CPU把當(dāng)前的指令指針值入棧,再從矢量表中取出新的IP值,送至IP中。于是程序就轉(zhuǎn)到了中斷服務(wù)程序。中斷服務(wù)程序可按各個設(shè)備的要求來加以編制,但通常有保護(hù)現(xiàn)場(入棧)指令,在返回前要恢復(fù)現(xiàn)場(退棧)指令,最后要用中斷返回指令I(lǐng)RET,恢復(fù)斷點處的CS值和IP值,并保存CPU的狀態(tài)。2.中斷過程38在中斷發(fā)生時,CPU自動清除了IF和TF,其目的是使CPU轉(zhuǎn)入中斷處理程序后,不允許再產(chǎn)生新的中斷。如果在執(zhí)行中斷處理程序中,還允許外部中斷,可以通過STI指令再把IP置1。編寫中斷處理程序和編寫子程序一樣,所使用的匯編語言指令沒有特殊限制,只是中斷處理程序返回時使用IRET指令。這條指令的工作步驟和中斷發(fā)生的工作步驟正好相反。它首先把IP、CS和EFLAGS的內(nèi)容彈棧,然后返回中斷發(fā)生時緊接著的下一條指令,CPU接著執(zhí)行原來的程序。在中斷發(fā)生時,下述操作是由硬件自動完成的:在中斷發(fā)生時,CPU自動清除了IF和TF,39(1)取中斷類型號n;(2)標(biāo)志寄存器(EFLAGS)內(nèi)容入棧;(3)當(dāng)前代碼段寄存器(CS)內(nèi)容入棧;(4)當(dāng)前指令指針(IP)內(nèi)容入棧;(5)禁止外部中斷和單步中斷(置IF=0,TF=0);(6)從中斷矢量表中取4×n地址的內(nèi)容送IP,取4×n+2地址中內(nèi)容送CS;(7)轉(zhuǎn)中斷處理程序。(1)取中斷類型號n;4010.2.3中斷程序設(shè)計舉例1.中斷和中斷返回指令I(lǐng)NT/INTO/IRET指令格式:INTimm8 INTOIRETINTimm8為軟中斷指令,用于產(chǎn)生一個由8位立即數(shù)指定中斷號的軟中斷。該指令首先將標(biāo)志寄存器和斷點地址(CS和IP的值)入棧,并將標(biāo)志位TF和IF清0(關(guān)單步和可屏蔽中斷),然后轉(zhuǎn)向指定中斷號對應(yīng)的中斷服務(wù)程序。中斷服務(wù)程序的入口地址是以中斷號作為索引,查中斷矢量表或中斷描述符表得到的。10.2.3中斷程序設(shè)計舉例41INTO為溢出中斷指令。它實際上是軟中斷指令I(lǐng)NT的特例,其中斷號隱含為1,所以INTO=INT4。它只有當(dāng)OF置1時才產(chǎn)生中斷。IRET為中斷返回指令,用于從中斷服務(wù)程序返回原程序。它執(zhí)行的操作是從堆棧中彈出原入棧保護(hù)的IP、CS和標(biāo)志寄存器值,并重新開始被中斷程序的執(zhí)行。INTO為溢出中斷指令。它實際上是軟中斷指42
2.中斷處理程序的編寫前面已提及,當(dāng)一個可屏蔽中斷被響應(yīng)后,CPU進(jìn)入中斷響應(yīng)周期。此時被響應(yīng)的外設(shè)應(yīng)將本身的中斷類型號送往數(shù)據(jù)總線。CPU讀取這個類型號,將其乘4,就得到中斷矢量表中相應(yīng)的中斷矢量入口,并轉(zhuǎn)入中斷處理程序。具體的工作由中斷處理程序完成,外中斷和軟中斷程序設(shè)計不盡相同。2.中斷處理程序的編寫431)外中斷處理程序外設(shè)中斷是隨機(jī)發(fā)生的,在中斷處理程序設(shè)計時必須考慮這一點。外中斷處理程序的主要步驟如下:(1)保護(hù)現(xiàn)場,主要指各通用寄存器的內(nèi)容和除CS外代碼段寄存器的內(nèi)容,保護(hù)方法一般是入棧;(2)盡快完成中斷處理,以免影響其他外設(shè)的中斷請求;(3)恢復(fù)現(xiàn)場;(4)中斷返回,用IRET指令返回。1)外中斷處理程序442)軟中斷處理程序由中斷指令引起的軟中斷盡管是不可屏蔽的,但只有在CPU執(zhí)行中斷指令后才會發(fā)生。中斷指令類似于子程序調(diào)用指令,相應(yīng)的軟中斷處理程序在很大程度上類似于子程序。(1)棧切換。由于軟中斷處理程序往往在開中斷狀態(tài)下執(zhí)行,占用棧空間量大,棧的切換不可避免,同時,為實現(xiàn)中斷的嵌套,也需要棧的切換。(2)開中斷。只有在開中斷后,CPU才響應(yīng)可屏蔽的外設(shè)請求,外設(shè)的中斷請求才能及時得到處理。如果此軟件中斷處理程序要被外設(shè)中斷處理程序“調(diào)用”,則是否要開中斷或何時開中斷,應(yīng)根據(jù)實際情況,再作考慮。2)軟中斷處理程序45(3)保護(hù)現(xiàn)場。應(yīng)保護(hù)中斷處理程序中要使用的寄存器,而這些寄存器在進(jìn)入中斷處理程序前,可能已被其他程序所使用。這樣在使用軟中斷指令時,可不必考慮有關(guān)寄存器內(nèi)容的保護(hù)問題。(4)中斷處理。(5)恢復(fù)現(xiàn)場。依次恢復(fù)被保護(hù)寄存器的原有內(nèi)容。(6)再次實施棧切換。如果在開始時切換了棧,那么也要再重新切換回原棧。(7)利用IRET指令實現(xiàn)中斷返回。(3)保護(hù)現(xiàn)場。應(yīng)保護(hù)中斷處理程序中要使46
例10-2當(dāng)需要改變某個中斷矢量的內(nèi)容時,必須要先將原中斷矢量的入口地址保護(hù)起來,以便用完之后恢復(fù)。使用DOS的35號系統(tǒng)功能調(diào)用,讀取指定中斷矢量(由AL寄存器給出)的入口地址到寄存器對ES和BX中,ES寄存器用于存放段基址,BX寄存器存放偏移量。這就是取中斷矢量所要實現(xiàn)的功能。例10-2當(dāng)需要改變某個中斷矢量的內(nèi)容47實現(xiàn)取中斷矢量功能的程序描述如下:
CSEGSEGMENTPARAPUBLIC'CODE' ASSUMECS∶CSEGGETINTV PROCFAR PUSHAXMOV AH,35H;調(diào)用DOS功能35HINT 21HPOP AXRETGETINTV ENDPCSEG ENDS END實現(xiàn)取中斷矢量功能的程序描述如下:48例10-3當(dāng)用戶需要建立一個指定的中斷矢量,使其指向用戶定義的中斷處理程序時,可以使用DOS的37號系統(tǒng)功能調(diào)用,將用戶定義的中斷處理程序的入口地址DS∶DX送入由AL寄存器指定中斷號的矢量地址中。現(xiàn)要求編程實現(xiàn)置中斷矢量(60H號)指向中斷處理程序MYINT的功能。此類問題求解的一般方法是:改變中斷矢量之前,必須將原中斷矢量的入口地址讀出,并保存到存儲器中,以便自定義的中斷程序處理完后進(jìn)行恢復(fù)。下述程序中,GETINTV子程序完成的就是將原中斷矢量的入口地址讀出的任務(wù)。例10-3當(dāng)用戶需要建立一個指定的中斷49程序描述如下:
EXTRNGETINTV:FAR,SETINTV:FARPUBLICOLDSEG,OLDOFFDATASEGMENTPARAPUBLIC'DATA'OLDSEG DW? ;保存段址OLDOFF DW? ;保存偏移量DATA ENDSCSEG SEGMENTPARAPUBLIC'CODE'ASSUME CS:CSEG,DS:DATA程序描述如下:50STARTPROC FAR PUSH ES ;保護(hù)ES MOV AL,60H;取60H號中斷矢量 CALL GETINTV MOV OLDSEG,ES;并保存到存儲器中 MOV OLDOFF,BX POP ES;恢復(fù)ES PUSH DS PUSH CS POP DS;使DS指向代碼段 LEA DX,MYINT;使DS∶DX指向MYINT CALL SETINTV;改變中斷矢量 POP DS RETSTARTPROC FAR51START ENDPCSEG ENDS ENDMYINT PROCNEAR ;中斷處理程序
IRETMYINT ENDP…START ENDP…52值得說明的是,執(zhí)行上述程序段后,將60H號中斷矢量的內(nèi)容變?yōu)镸YINT。一般情況下,在處理完MYINT之后,需恢復(fù)60H號中斷矢量的原有內(nèi)容,可執(zhí)行下述程序段:EXTRNOLDSEG:WORD,OLDOFF:WORDEXTRNSETINTV:FARPUSHDS ;保護(hù)程序的DSMOVDS,OLDSEG ;DS∶DX為原先中斷矢量MOVDX,OLDOFFCALLSETINTV ;改變中斷矢量POP DS值得說明的是,執(zhí)行上述程序段后,將60H號53CSEGSEGMENTPARAPUBLIC'CODE'ASSUME CS∶CSEGSETINTVROC FARPUSH AXMOV AH,25H ;調(diào)用DOS功能25HINT 21HPOP AXRETSETINTVENDPCSEGENDSENDCSEGSEGMENTPARAPUBLIC'CO54
例10-4編一段中斷處理程序,在主程序運(yùn)行的過程中,每隔10秒鐘響鈴一次,同時在屏幕上顯示“Thebellisring!”問題分析:在系統(tǒng)定時器(中斷類型為8)的中斷處理程序中,有一條中斷指令I(lǐng)NT1CH,時鐘中斷每發(fā)生一次(約每秒中斷18.2次),都要調(diào)用一次中斷類型1CH的處理程序。使用1CH中斷類型時,應(yīng)注意:例10-4編一段中斷處理程序,在主程序55(1)在ROMBIOS中,1CH的處理程序只有一條IRET指令,實際上它并沒有做任何工作,只是為用戶提供了一個中斷類型號。如果用戶有某種周期性的工作需要完成,就可以利用系統(tǒng)定時器的中斷間隔,用自己設(shè)計的處理程序來代替原有的1CH程序。(2)1CH是用戶的中斷類型,可能已被其他功能的程序所引用,所以在編寫新的中斷程序時,應(yīng)做下述工作:①在主程序的初始化部分,先保存當(dāng)前中斷矢量表的內(nèi)容,再置新的中斷矢量;②在主程序的結(jié)束部分恢復(fù)保存的1CH矢量。(1)在ROMBIOS中,1CH的處理56程序描述如下:DATASEGMENTCOUNTDW1MESSDB'Thebellisring!',0DH,0AH,'$'DATADNDSCODESEGMENTASSUMECS∶CODE,DS∶DATA,ES∶DATAMAIN PROC FARSTART: PUSH DS程序描述如下:57 SUB AX,AX PUSHAXMOV AX,DATAMOVDS,AX MOVAL,1CH ;取原中斷矢量MOVAH,35HINT 21H PUSHES ;存原中斷矢量段址PUSHBX ;存原中斷矢量偏移量PUSHDSMOVDX,OFFSETRING ;新偏移量送DX MOVAX,SEGRING SUB AX,AX58 MOVDS,AX ;新段址送DS MOV AL,1CH MOVAH,25H INT 21H ;寫入新的中斷矢量 POP DS IN AL,21H ;讀取中斷屏蔽字 AND AL,11111110B ;允許定時器中斷OUT 21H,ALSTI ;開中斷 MOVDI,2000 MOVDS,AX ;新段址送DS59DELAY: MOVSI,3000 ;延時DELAY1: DEC SI JNZ DELAY1 DEC DI JNZ DELAY POP DX ;恢復(fù)原中斷矢量 POP DS MOV AL,1CH MOV AH,25H INT 21H RETDELAY: MOVSI,3000 60MAIN ENDPRING PROC NEAR PUSH DS ;各工作寄存器內(nèi)容入棧 PUSH AX PUSH CX PUSH DX MOV AX,DATA MOV DS,AX STI DEC COUNT;計秒值 JNZ EXIT MOV DX,OFFSETMESS MOV AH,09HMAIN ENDP61 INT 21H MOV DX,100 IN AL,61H AND AL,0FCHSOUND: XOR AL,02 OUT 61H,AL ;揚(yáng)聲器發(fā)聲 MOV CX,140HWAIT1: LOOP WAIT1 ;延時等待 DEC DX JNE SOUND MOV COUNT,182 INT 21H62EXIT: CLI ;關(guān)中斷 POP DX POP CX POP AX POP DS IRET ;中斷返回RING ENDPCODE ENDS ENDSTARTEXIT: CLI6310.3DOS功能調(diào)用10.3.1概述為便于編程,DOS系統(tǒng)把涉及設(shè)備驅(qū)動和文件管理等方面的子程序編寫成相對獨立的程序模塊并編號,通過功能調(diào)用的方法來使用這些子程序,滿足用戶對設(shè)備驅(qū)動、文件管理等的需要。減少對系統(tǒng)硬件環(huán)境的考慮和依賴,能使應(yīng)用程序的編制變得簡單且有較好的通用性。DOS系統(tǒng)中,已編號的、可由程序員調(diào)用的子程序稱為DOS的功能調(diào)用或系統(tǒng)調(diào)用。通常,DOS的各種命令是操作員與DOS的接口,而功能調(diào)用則是程序員與DOS的接口。10.3DOS功能調(diào)用10.3.1概述64DOS功能調(diào)用主要包括3方面的子程序:(1)設(shè)備驅(qū)動(基本I/O);(2)文件管理;(3)內(nèi)存管理、存取時間、存取終端矢量、終止程序等。DOS功能調(diào)用主要包括3方面的子程序:6510.3.2基本I/O功能調(diào)用1.調(diào)用方法為了使用方便,DOS已將所有子程序按功能順序編了號,調(diào)用時只要按如下方法使用就可以了。(1)將要調(diào)用功能的功能號送入AH寄存器;(2)根據(jù)所調(diào)用功能的規(guī)定設(shè)置入口參數(shù);(3)用INT21H指令轉(zhuǎn)入子程序入口;(4)調(diào)用結(jié)束后,按規(guī)定取得出口參數(shù)。10.3.2基本I/O功能調(diào)用66需要指出的是,有的子程序不要入口參數(shù),但大部分需要將參數(shù)送入指定地點。編程時,只須給出這三個方面的信息,而不必關(guān)心具體程序如何,在內(nèi)存中的存放地址如何。DOS根據(jù)所給的信息,自動轉(zhuǎn)入相應(yīng)的子程序去執(zhí)行。輸出的結(jié)果一般是在調(diào)用結(jié)束后通過出口參數(shù)送出,出口參數(shù)一般是寄存器。有些子程序,如屏幕顯示字符子程序,調(diào)用結(jié)束后會在屏幕上顯示結(jié)果。需要指出的是,有的子程序不要入口參數(shù),但大67例10-5MOV DL,':'MOV AH,2INT 21H這是2號功能調(diào)用(編號為2),實現(xiàn)將字符送入屏幕(或打印機(jī))顯示的功能。它要求將要顯示的字符的ASCII碼值送入DL,調(diào)用結(jié)束,屏幕上顯示DL中的內(nèi)容“:”。例10-568
2.基本I/O功能調(diào)用1)鍵盤輸入(1號調(diào)用)1號系統(tǒng)功能調(diào)用等待從標(biāo)準(zhǔn)輸入設(shè)備輸入一個字符并送入寄存器AL,不需入口參數(shù)。例10-6MOVAH,1INT21H執(zhí)行上述指令,系統(tǒng)將掃描鍵盤,等待有鍵按下,一旦有鍵按下,就將鍵值(相應(yīng)字符的ASCII碼值)讀入,先檢查是否是Ctrl-Break,若是,則退出命令執(zhí)行;否則將鍵值送入AL寄存器,同時將這個字符顯示在屏幕上。2.基本I/O功能調(diào)用692)控制臺輸入但無顯示(8號調(diào)用)8號調(diào)用與1號調(diào)用類同,只是不在屏幕上顯示輸入的字符。3)打印輸出(5號調(diào)用)把DL中的字符輸出到打印機(jī)上。例10-7MOVDL,'A'MOVAH,5INT21H2)控制臺輸入但無顯示(8號調(diào)用)704)直接控制臺輸入/輸出(6號調(diào)用)6號調(diào)用可從標(biāo)準(zhǔn)輸入設(shè)備輸入字符,也可以向屏幕上輸出字符,并且不檢查Ctrl-Break。若DL=0FFH時,表示從鍵盤輸入。若標(biāo)志ZF=0,表示AL中為鍵入的字符值。若標(biāo)志ZF=1,表示AL中不是鍵入的字符值,即尚無鍵按下。若DL≠0FFH時,表示向屏幕輸出,DL中為輸出字符的ASCII碼值。4)直接控制臺輸入/輸出(6號調(diào)用)71例10-8MOVDL,0FFHMOVAH,6INT21H;從鍵盤輸入字符MOVDL,24HMOVAH,6INT21H;將24H對應(yīng)的字符'$'輸出例10-8725)直接控制臺輸入但不顯示(7號調(diào)用)等待從標(biāo)準(zhǔn)輸入設(shè)備輸入字符,然后將其送入AL,如同6號調(diào)用,對字符不做檢查。6)輸出字符串(9號調(diào)用)調(diào)用時,要求DS∶DX必須指向內(nèi)存中一個以“$”作為結(jié)束標(biāo)志的字符串。字符串中每一個字符(不包括結(jié)尾標(biāo)志$)都輸出顯示或打印。5)直接控制臺輸入但不顯示(7號調(diào)用)73例10-9DATASEGMENTBUFDB'HOWDOYOUDO?$'
DATAENDSCODESEGMENT
MOVAX,DATAMOVDS,AX
MOVDX,OFFSETBUFMOVAH,9INT21H
CODEENDS執(zhí)行本程序,屏幕將顯示:HOWDOYOUDO?…………例10-9…………747)字符串輸入(0AH號調(diào)用)從鍵盤接收字符串到內(nèi)存輸入緩沖區(qū)。要求事先定義一個輸入緩沖區(qū),緩沖區(qū)內(nèi)第一個字節(jié)指出緩沖區(qū)能容納的字符個數(shù),不能為零。第二個字節(jié)保留以用作填寫輸入的字符個數(shù)。從第三個字節(jié)開始存放從鍵盤接收的字符。若實際輸入的字符數(shù)少于定義的字節(jié)數(shù),緩沖區(qū)內(nèi)其余字節(jié)填零;若多于定義的字節(jié)數(shù),則后來輸入的字符丟掉,且響鈴。調(diào)用時,要求DS:DX指向輸入緩沖區(qū)。7)字符串輸入(0AH號調(diào)用)75例10-10DATA SEGMENTBUF DB50 ;緩沖區(qū)長度DB? ;保留為填入實際輸入的字符個數(shù)DB50 DUP(?) ;定義50個字節(jié)存儲空間
DATA ENDSCODEE SEGMENT
MOV AX,DATAMOV DS,AX
MOV DX,OFFSETBUFMOV AH,10INT 21HCODE ENDS………例10-10………768)異步通信口輸入(03H)從標(biāo)準(zhǔn)異步通信接口等待輸入一個字符,然后送到寄存器AL中。啟動時DOS把一個異步通信端口初始化為2400波特,沒有奇偶校驗位,一個停止位,字長為8位。9)異步通信口輸出(04H)在DL中的數(shù)據(jù)被輸出到異步通信接口去。關(guān)于異步通信口的輸入/輸出,推薦使用ROMBIOS中斷調(diào)用14H。8)異步通信口輸入(03H)7710)日期設(shè)置(28H調(diào)用)調(diào)用時,CX:DX中必須有一個有效的日期,CX中存放年號(1900~2099),DH中存放月號(1~12),DL中存放日號。若日期有效,設(shè)置成功,AL=0;否則AL=0FFH。例10-11將日期設(shè)置為2003年3月15日,程序段描述如下:MOVCX,2003MOVDH,3MOVDL,15MOVAH,2BHINT21H10)日期設(shè)置(28H調(diào)用)7811)取得日期(2AH)調(diào)用后返回日期在CX∶DX中。CX中放年號,為二進(jìn)制數(shù),DH中放月號,DL中放日號。如果日時鐘轉(zhuǎn)到下一天,日期將自動調(diào)整,也考慮每月的天數(shù)和閏年。不需要入口參數(shù)。11)取得日期(2AH)7912)設(shè)置時間(2DH)時間的格式是四個8位二進(jìn)制數(shù),具體地說:CH表示小時(0~23),CL表示分(0~59),DH表示秒(0~59),DL表示百分之一秒(0~99),這個格式可轉(zhuǎn)化為打印/顯示形式。也可用來計算,比如從一個時間值中減去另一個時間值。調(diào)用時,要求CX∶DX中存放要求的時間。若此時間是有效的,設(shè)置成功,AL返回0,若時間的組成部分無效,設(shè)置操作取消,AL返回0FFH。12)設(shè)置時間(2DH)8013)取得時間(2CH)時間的格式如同2DH功能調(diào)用,不需要入口參數(shù),調(diào)用結(jié)束時,CX∶DX中為返回的時間。13)取得時間(2CH)81例10-12執(zhí)行下述程序段:MOVAH,2DHMOVCX,5FHMOVDX,900HINT21H將把系統(tǒng)時間設(shè)置為5點15分9秒。執(zhí)行下述程序段:MOVAH,2CHINT21H將在CX∶DX中得到時間的二進(jìn)制值。例10-12執(zhí)行下述程序段:8210.3.3應(yīng)用舉例例10-13將內(nèi)存中BUF單元開始的一個字符串(長度為10個字節(jié))送CRT顯示,并回車換行。將一個字符串送CRT顯示,使用DOS的9號系統(tǒng)功能調(diào)用最為方便。9號系統(tǒng)功能調(diào)用要求兩個入口參數(shù),一是要求DX中為字符串首字符的偏移地址,二是要求字符串必須以“$”字符結(jié)尾,回車符、換行符的ASCII碼分別是0DH和0AH。10.3.3應(yīng)用舉例83編程如下:DATA SEGMENTBUF DB'Thisismyfirstprogram!'DATA ENDSCSEG SEGMENT'CODE' ASSUMECS∶CSEG,DS∶DATASTART: MOV AX,DATA MOV DS,AX LEA BX,BUF MOV AX,0D0AH;回車換行符的ASCII碼送AX編程如下:84 MOV [BX+10],AX ;字符串后加換行、回車符 MOV BYTEPTR[BX+12],'$';串尾加結(jié)尾符 MOV DX,BX ;字符串首地址送DX CALL LIST_1 ;顯示字符串 MOV AH,4CH INT 21H ;返回DOSCSEG ENDS END STARTCODESEGMENT ASSUMECS∶CODE MOV [BX+10],AX85LIST_1 PROC FAR PUSH AX ;保護(hù)AX MOV AH,09H INT 21H ;調(diào)用9號功能 POP AX ;取回AX RET ;返回LIST_1 ENDPCODE ENDSLIST_1 PROC FAR86
例10-14利用DOS功能調(diào)用,模擬實現(xiàn)登錄網(wǎng)絡(luò)時口令的輸入。接收用戶的保密口令或其他特殊信息意味著從標(biāo)準(zhǔn)輸入設(shè)備上讀一個字符串,但不在輸出設(shè)備上顯示。具體實現(xiàn)方法是,從鍵盤輸入最多8個字符的口令(不顯示),送入存儲器中,并將口令串的開始地址送BX保存,然后返回。利用DOS的8號系統(tǒng)功能調(diào)用可實現(xiàn)讀一個字符不回顯的功能。該功能調(diào)用從標(biāo)準(zhǔn)輸入設(shè)備上接收一個ASCII字符,并送AL寄存器。程序描述如下:例10-14利用DOS功能調(diào)用,模擬實現(xiàn)87DATASEGMENTPARAPUBLIC'DATA'PROMPTDB'P1easeenteryourPassword:$'BUFFERDB8DUP(?) ;存放口令DATAENDSCSEGSEGMENTPARAPUBLIC'CODE'ASSUMECS:CSEG,DS:DATAPASSWORDPROCFARSTART:PUSHDX ;保存寄存器PUSHCXPUSHAXLEADX,PROMPT ;給出提示DATASEGMENTPARAPUB88 CALL LIST_1 MOV CX,8 ;輸入8個字符 LEA BX,BUFFER ;口令字符串存放處NEXTKEY:CALL GETCHR ;讀入下一鍵CMP AL,0DH ;是回車?JE LEAVE ;是的,轉(zhuǎn)LEAVEMOV [BX],AL ;不是,存字符INC BX ;并指向下一位置LOOP NEXTKEY ;取另一鍵LEAVE:LEA BX,BUFFER ;口令串地址送BX CALL LIST_189 POP AX ;恢復(fù)寄存器POP CXPOP DXRET ;返回調(diào)用程序PASSWORDENDPCSEGENDSENDSTARTPUBLICGETCHRCSEGSEGMENTPARAPUBLIC'CODE'ASSUMECS:CSEG POP AX90GETCHRPROC FARPUSH CXMOV CH,AHMOV AH,8HINT 21HMOV AH,CHPOP CXRETGETCHRENDPCSEGENDSGETCHRPROC FAR91如果輸入“Ctrl-C”字符,DOS則產(chǎn)生23H號中斷。為避免產(chǎn)生這種情況,用戶可用7號系統(tǒng)功能調(diào)用替換8號系統(tǒng)功能調(diào)用,即把子程序中的指令MOVAH,08H改成MOVAH,07H。另外,子程序需等待鍵盤上有鍵輸入后才返回調(diào)用程序,而很多情況下需要當(dāng)鍵盤上有鍵輸入時就讀入,否則返回調(diào)用程序,即并不等待鍵盤輸入。為此,該子程序就需將INT21H指令前的MOVAH,08H修改成下列形式:MOVAH,06HMOVDL,0FFH子程序LIST_1為例10-13中的子程序LIST_1。如果輸入“Ctrl-C”字符,DOS則產(chǎn)生92
例10-15編程清除屏幕并使光標(biāo)回到左上角的位置。要解決以上的問題,首先使用軟中斷INT10H的15號子功能讀取屏幕的現(xiàn)行狀態(tài),再使用0號子功能以同樣的模式設(shè)置顯示方式。這樣不僅完成了清屏功能,而且不改變屏幕的顯示模式。程序描述如下:例10-15編程清除屏幕并使光標(biāo)回到左93CSEG SEGMENTPARAPUBLIC'CODE' ASSUMECS∶CSEGCLEARS PROC FARSTART: PUSH AX PUSH BX MOV AH,15 INT 10H MOV AH,0 INT 10H POP BX POP AX RETCLEARS ENDPCSEG ENDS ENDSTARTCSEG SEGMENTPARAPUBLIC9410.4BIOS中斷調(diào)用10.4.1BIOS概述BIOS(BasicInput/OutputSystem)是駐留在ROM中的程序,提供了系統(tǒng)加電自檢,引導(dǎo)裝入以及對主要I/O接口的控制等功能。對I/O接口的控制主要是對鍵盤、磁帶、磁盤、顯示器、打印機(jī)、異步串行通信接口等的控制,提供了最基本的系統(tǒng)硬件與軟件間的接口。BIOS在匯編語言一級上向用戶或操作系統(tǒng)提供微機(jī)所帶的一些主要外設(shè)的設(shè)備控制功能,包括開機(jī)自檢,顯示器、鍵盤和打印機(jī)的字符傳送,圖形發(fā)生等,主要是I/O設(shè)備的處理程序和許多常用例行程序,以中斷處理程序的形式存在。這些操作均不需要用戶考慮外設(shè)的I/O地址等細(xì)節(jié)。例如,負(fù)責(zé)顯示輸出的顯示I/O中斷為10H號中斷,負(fù)責(zé)打印輸出的打印I/O程序為17H中斷等等。在BIOS功能調(diào)用中,應(yīng)重點掌握10H、16H、17H和1AH四種類型的功能調(diào)用。10.4BIOS中斷調(diào)用10.4.1BIOS概述95主要的BIOS中斷類型有以下5種。1)CPU中斷類型0除法錯;1單步;2非屏蔽中斷;3斷點;4溢出;5打印屏幕;6保留;7保留。2)8259中斷類型88254系統(tǒng)定時器;9鍵盤;A保留;B保留(通信);C保留(通信);D保留(打印機(jī));E軟盤;F打印機(jī)。主要的BIOS中斷類型有以下5種。963)BIOS中斷類型10顯示器;11設(shè)備檢驗;12內(nèi)存大?。?3磁盤;14通信;15I/O系統(tǒng)擴(kuò)充;16鍵盤;17打印機(jī);18駐留BASIC;19引導(dǎo);1A時鐘;40軟盤。4)用戶應(yīng)用程序1B鍵盤Break;1C定時器;4A報警。5)數(shù)據(jù)表指針1D顯示器參量;1E軟盤參量;1F圖形字符擴(kuò)充;411#硬盤參量;462#硬盤參量。3)BIOS中斷類型9710.4.2BIOS中斷調(diào)用方法用戶在自己編制的程序中,可以調(diào)用BIOS提供的這些設(shè)備驅(qū)動子程序,就像調(diào)用用戶自己編的子程序一樣。調(diào)用BIOS各子程序的方法是利用中斷指令I(lǐng)NT,先按調(diào)用類型要求設(shè)置入口參數(shù),再通過帶有類型號的軟中斷指令進(jìn)行功能調(diào)用。CPU響應(yīng)中斷后就把控制權(quán)交給所調(diào)用的BIOS的子程序,由它提供中斷服務(wù)。10.4.2BIOS中斷調(diào)用方法98BIOS調(diào)用的基本步驟是:(1)置入口參數(shù);(2)使用中斷語句INTn,其中n為中斷號。例10-16MOVAH,0 ;功能號為0INT1AH ;1AH為BIOS中斷號,功能為讀時間計數(shù)器的值BIOS調(diào)用的基本步驟是:9910.4.3BIOS中斷調(diào)用與DOS功能調(diào)用的比較BIOS中斷程序處于DOS功能調(diào)用和硬件環(huán)境之間,和DOS功能調(diào)用相比其優(yōu)點是效率高,缺點是編程相對復(fù)雜;和直接對硬件編程相比,優(yōu)點是實現(xiàn)相對容易,缺點是效率相對較低。10.4.3BIOS中斷調(diào)用與DOS功能調(diào)用的比較100在一些情況下既能選擇DOS中斷也能選擇BIOS中斷來執(zhí)行同樣的功能。例如,打印機(jī)輸出一個字符的功能,可用DOS中斷21H的功能5,也可用BIOS中斷17H的功能0。因為BIOS比DOS更靠近硬件。一般情況下,盡可能地使用DOS功能,但在少數(shù)情況下必須使用BIOS功能。例如,BIOS中斷17H的功能2為讀打印機(jī)狀態(tài),DOS就沒有等效的功能。因此,對BIOS和DOS調(diào)用的選擇原則是,無法使用DOS功能調(diào)用或DOS沒有提供而BIOS提供了功能的情況下可以考慮使用BIOS中斷。在一些情況下既能選擇DOS中斷也能選擇BIO101例10-17根據(jù)顯示輸出不同的內(nèi)容,對顯示器的使用通常需要變換顯示模式。這時,可使用BIOS所提供的視頻顯示I/O驅(qū)動程序來設(shè)置屏幕的顯示模式。屏幕顯示方式的設(shè)置使用軟中斷INT10H功能來實現(xiàn),若需設(shè)置屏幕顯示模式為黑白字符方式,應(yīng)使用INT10H的0號子功能。0——40×25 黑白字符方式1——40×25 彩色字符方式2——80×25 黑白字符方式3——80×25 彩色字符方式4——320×200 彩色圖形方式(4種顏色)例10-17根據(jù)顯示輸出不同的內(nèi)容,對顯1025——320×200 黑白圖形方式6——640×200 黑白圖形方式7——720×350 單色字符方式(與單色適配器兼容)8~0CH——保留0DH——320×200 彩色圖形方式(16種顏色)0EH——640×200 彩色圖形方式(16種顏色)0FH——640×350 單色圖形方式10H——640×350 彩色圖形方式(EGA卡)。顯存為64KB時4種顏色; 顯存大于64KB時16種顏色11H——640×480 單色圖形方式(僅VGA)12H——640×480 16色圖形方式(僅VGA)13H——320×200 256色圖形方式(僅VGA)5——320×200 黑白圖形方式103輸入?yún)?shù):AH中為顯示方式碼,編制的程序描述如下:CSEG SEGMENTPARAPUBLIC'CODE' ASSUME CS∶CSEGSETSMODE PROC FARSTART: PUSH AX MOV AH,0 INT 10H POP AX RETSETSMODE ENDPCSEG ENDSEND START輸入?yún)?shù):AH中為顯示方式碼,編制的程序描述如下:10410.5輸入/輸出程序設(shè)計10.5.1程序直接控制方式1.直接輸入/輸出方式直接輸入/輸出方式,也稱無條件傳送方式或稱同步方式。這種傳送方式使用較少,只有在外部控制過程的各個動作時間是固定的,且是已知的條件下才能夠應(yīng)用。它不考慮外設(shè)的狀態(tài),輸入時,就只給出IN指令。輸出時,也只給出OUT指令,這種傳送方式的優(yōu)點是程序編寫容易,硬件電路簡單,調(diào)試方便。10.5輸入/輸出程序設(shè)計10.5.1程序直接控制方105例10-18一個無條件傳送的例子如圖10-4所示。圖中10H、11H、20H是來自地址總線的端口地址信號。要求編程完成采集不同的模擬量。圖10-4無條件傳送舉例例10-18一個無條件傳送的例子如圖1106這是一個同步的數(shù)據(jù)采集系統(tǒng)。被采樣的數(shù)據(jù)是八個模擬量,由繼電器繞組P0、P1、P2、…、P7控制觸點K0、K1、K2、…、K7逐個接通,用一個四位(十進(jìn)制數(shù))數(shù)字電壓表測量,把被采樣的模擬量轉(zhuǎn)換成十六位BCD代碼,高八位和低八位通過兩個不同的端口輸入。它們的地址分別為10H和11H。CPU通過端口20H輸出控制信號,以控制繼電器的吸合,從而實現(xiàn)采集不同的模擬量。數(shù)據(jù)采集過程可用下列程序?qū)崿F(xiàn):這是一個同步的數(shù)據(jù)采集系統(tǒng)。被采樣的數(shù)據(jù)是107START:MOVDX,0100H ;01→DH,設(shè)置合第一個繼電器代碼 ;00→DL,設(shè)置斷開所有繼電器代碼LEA BX,DSIOK ;輸入數(shù)據(jù)緩沖區(qū)的地址偏移量→BXXOR AL ;清AL及進(jìn)位標(biāo)志AGAIN:MOV AL,DIOUT 20H,AL ;斷開所有繼電器線圈CALL NEARDELAY1 ;模擬繼電器觸點的釋放時間MOV AL,DHOUT 20H,AL ;使P0吸合START:MOVDX,0100H ;01→DH108CALL NEARDELAY2 ;模擬觸點閉合及數(shù)字電壓表的轉(zhuǎn)換時間IN AX,10H ;輸入MOV [BX],AXINC BXINC BXRCL DH,1;DH左移一位,為下一個觸點閉合作準(zhǔn)備JNC AGAIN;8個模擬量未輸入完,循環(huán)此段程序CALL NEARDELAY2 ;模擬觸點閉合及數(shù)字電109
2.查詢輸入/輸出方式查詢輸入/輸出方式,也稱條件傳送方式或稱異步方式。當(dāng)CPU與外部操作同步時,采用無條件傳送是很方便的。但如果兩者不同步時,就很難確保其正確性。為解決這個問題,可以采用查詢輸入/輸出方式。在傳送數(shù)據(jù)前,先去查詢一下外設(shè)的狀態(tài),當(dāng)外設(shè)準(zhǔn)備好以后再進(jìn)行傳送。這樣就要求CPU與外設(shè)之間的接口部分除了傳送數(shù)據(jù)的端口以外,還必須設(shè)置傳送狀態(tài)信號的端口。端口數(shù)據(jù)一般是8位(或16位)的,而狀態(tài)信息往往是一位的。這樣,不同的外設(shè)狀態(tài)信息可以使用同一端口,只要使用不同的位就可以了,查詢輸入/輸出方式解決了高速CPU與慢速外設(shè)之間傳送數(shù)據(jù)的問題,并能夠保證傳送的正確性。綜上,可得到查詢輸入/輸出方式的工作過程如下所述。2.查詢輸入/輸出方式1101)查詢輸入工作過程當(dāng)輸入裝置的數(shù)據(jù)已準(zhǔn)備好后應(yīng)發(fā)一個信號給CPU,送出要傳送數(shù)據(jù)的同時給出“準(zhǔn)備好”(Ready)信號。數(shù)據(jù)與狀態(tài)是由不同的端口輸入至CPU數(shù)據(jù)總線。當(dāng)CPU要由外設(shè)輸入信息時,CPU先輸入狀態(tài)信息,檢查數(shù)據(jù)是否已準(zhǔn)備好,當(dāng)數(shù)據(jù)已經(jīng)準(zhǔn)備好后,才輸入數(shù)據(jù),讀入數(shù)據(jù)的命令,使?fàn)顟B(tài)信息清“0”。讀入的數(shù)據(jù)是8位的;而讀入的狀態(tài)信息往往是一位的(比如用D7位),如圖10-5所示。所以,不同外設(shè)的狀態(tà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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋中介公司雇傭合同
- 個人授信額度借款合同
- 個人房屋出租協(xié)議書
- 鋁合金方管施工方案
- 懸挑翼緣板施工方案
- 廠房照明施工方案
- 瓷磚干掛施工方案
- 海西輕鋼別墅施工方案
- 沈陽地源熱泵井施工方案
- 河南省平頂山市汝州市2024-2025學(xué)年八年級上學(xué)期期末生物試題(原卷版+解析版)
- 2025年常州機(jī)電職業(yè)技術(shù)學(xué)院單招職業(yè)傾向性測試題庫參考答案
- 2025年安徽衛(wèi)生健康職業(yè)學(xué)院單招職業(yè)技能測試題庫及參考答案1套
- 課件-DeepSeek從入門到精通
- 17J008擋土墻(重力式、衡重式、懸臂式)圖示圖集
- 【MOOC】理解馬克思-南京大學(xué) 中國大學(xué)慕課MOOC答案
- 三八婦女節(jié)主題班會PPT課件
- 員工考勤與請休假管理制度
- 50MW茶光互補(bǔ)光伏發(fā)電項目建議書寫作模板-定制
- LS框架斷路器技術(shù)資料_圖文
- 品質(zhì)異常(8D)改善報告
- 彎頭重量和表面積明細(xì)表
評論
0/150
提交評論