




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第10章中斷和輸入/輸出程序設(shè)計(jì)10.1概述10.2中斷處理程序設(shè)計(jì)10.3DOS功能調(diào)用10.4BIOS中斷調(diào)用10.5輸入/輸出程序設(shè)計(jì)10.1概述在微型計(jì)算機(jī)中,CPU與外部設(shè)備之間的信息傳送是通過(guò)接口進(jìn)行的,每個(gè)接口由一組寄存器組成,這些寄存器用來(lái)存放命令、狀態(tài)和數(shù)據(jù),為了對(duì)這些寄存器進(jìn)行存取,它們都分配有一個(gè)稱(chēng)為I/O端口的地址編碼。在80x86系統(tǒng)中,I/O端口編址在一個(gè)獨(dú)立的地址空間中,這個(gè)空間對(duì)80x86來(lái)講,允許設(shè)置64K個(gè)8位端口或32K個(gè)16位端口;80386和80486提供了一個(gè)獨(dú)立的I/O地址空間。I/O地址空間由216(64K)個(gè)可獨(dú)立編址的8位端口(即64KB)組成。任意兩個(gè)連續(xù)的8位端口可作為16位端口處理;4個(gè)連續(xù)的8位端口可作為32位端口處理。因此,這個(gè)I/O地址空間對(duì)80486來(lái)講,最多能提供64K個(gè)8位端口、32K個(gè)16位端口、16K個(gè)32位端口或總?cè)萘坎怀^(guò)64KB的不同位端口的組合。這64K的I/O地址空間是指物理地址而不是線(xiàn)性地址,因?yàn)镮/O指令不經(jīng)過(guò)分段或分頁(yè)部件。處理器要訪(fǎng)問(wèn)的是存儲(chǔ)地址空間還是I/O地址空間是容易區(qū)分的。所有I/O端口與CPU之間的通信都是由輸入/輸出指令完成的。其中輸入指令完成從I/O到CPU的信息傳送;而輸出指令完成從CPU到I/O的信息傳送。輸入和輸出設(shè)備是計(jì)算機(jī)系統(tǒng)的重要組成部分。程序、數(shù)據(jù)和各種現(xiàn)場(chǎng)采集到的信息要通過(guò)輸入裝置輸入至計(jì)算機(jī)。計(jì)算結(jié)果或各種控制信息要輸出到各種輸出設(shè)備,以便顯示、打印和實(shí)現(xiàn)各種控制操作。因此,CPU與輸入/輸出設(shè)備之間的信息交換也是計(jì)算機(jī)系統(tǒng)中非常重要和十分頻繁的操作。輸入過(guò)程是:輸入設(shè)備把數(shù)據(jù)送到接口,由CPU執(zhí)行輸入程序把接口中的數(shù)據(jù)讀入CPU,再根據(jù)需要放入存儲(chǔ)器或寄存器中。處理程序完成對(duì)數(shù)據(jù)的處理并將處理結(jié)果放入指定的寄存器或存儲(chǔ)器中。輸出過(guò)程:CPU執(zhí)行輸出程序,將存儲(chǔ)器或寄存器中等待輸出的內(nèi)容送到輸出接口中,然后啟動(dòng)輸出設(shè)備,將接口中的數(shù)據(jù)通過(guò)輸出設(shè)備輸出。輸入/輸出的基本條件是:連接CPU與外設(shè)的接口電路和相應(yīng)的軟件——驅(qū)動(dòng)程序。10.1.1I/O指令I(lǐng)N和OUT1.格式輸入指令:
INOP1,OP2INAL,imm8INAX,imm8INEAX,imm8
INAL,DXINAX,DX
INEAX,DX輸出指令:
OUTOP1,OP2OUTimm8,ALOUTimm8,AXOUTimm8,EAX
OUTDX,AL
OUTDX,AXOUTDX,EAX
2.功能:
I/O指令I(lǐng)N和OUT用于在I/O端口和AL、AX或EAX累加器之間交換數(shù)據(jù)。輸入指令I(lǐng)N完成從I/O到CPU的信息傳送;輸出指令OUT完成從CPU到I/O的信息傳送。
3.端口訪(fǎng)問(wèn)方法80486有16條I/O地址線(xiàn),I/O端口范圍是64K。訪(fǎng)問(wèn)端口方法有兩種:①用1字節(jié)立即數(shù)指定的方法,可以訪(fǎng)問(wèn)0~255的端口;②采用DX寄存器間接尋址方法,可以訪(fǎng)問(wèn)0~(64K-1)個(gè)端口中的任一端口。
4.舉例
INAL,0FAH ;從端口0FAH輸入8位數(shù)到ALINEAX,28H ;將端口28H、29H、2AH和2BH的32位數(shù)送EAXMOVDX,3AEH ;I/O地址大于255時(shí),應(yīng)通過(guò)DX間接尋址
IN AX,DX ;從DX指出的端口輸入16位數(shù)到AXOUT21H,AL ;將8位數(shù)從AL輸出到端口21HOUTDX,EAX ;將32位數(shù)從EAX輸出到DX指出的端口
5.說(shuō)明在保護(hù)方式下,當(dāng)處理器遇到一條I/O指令時(shí),它首先檢查現(xiàn)行任務(wù)的特權(quán)級(jí)是否高于或等于I/O特權(quán)級(jí),即是否CPL≤IOP1。若是,則執(zhí)行I/O操作;否則,處理器檢查I/O允許位圖,若I/O允許位圖不允許訪(fǎng)問(wèn),則會(huì)發(fā)生異常13。10.1.2端口地址通過(guò)以上敘述可以看出,在進(jìn)行I/O程序設(shè)計(jì)時(shí),需要對(duì)端口地址、控制及狀態(tài)端口的各位含義有清楚的了解。IBMPC機(jī)的部分端口地址如表10-1所示??刂萍盃顟B(tài)端口各位的含義在討論具體外設(shè)時(shí)描述。表10-1端口地址對(duì)照表端口地址端口設(shè)備或接口芯片00H~0FHDMA控制器0H~21H中斷控制器40H~43H時(shí)鐘/定時(shí)器60H~63H可編程外圍接口芯片200~20FH游戲適配器2F8H~2FEHCOM1320H~32FH硬盤(pán)控制器378H~37AH2號(hào)并行口(打印機(jī)適配器)3B0H~3BFH單色顯示及1號(hào)并行口3D0H~3DFH彩色/圖形適配器3F0H~3F7H軟盤(pán)控制器3F8H~3FEHCOM210.1.3CPU與外設(shè)之間的信息交換方式
CPU與外設(shè)通過(guò)硬件接口電路或控制器相連接,這些接口或控制器中都有數(shù)量不等的端口,用作CPU與外設(shè)之間傳送數(shù)據(jù)及提供數(shù)據(jù)傳送所需要的控制邏輯與信號(hào)。使用IN、OUT指令對(duì)這些端口進(jìn)行操作,便可以實(shí)現(xiàn)CPU與外設(shè)的信息交換。概括起來(lái),CPU與外設(shè)需要交換的信息有:數(shù)據(jù)信息、狀態(tài)信息以及控制信息。例如,當(dāng)需要在打印機(jī)上打印一個(gè)字符(數(shù)據(jù))時(shí),需要先檢查打印機(jī)是否準(zhǔn)備好(狀態(tài)),若準(zhǔn)備好則輸出選通命令(控制),以便打印。
CPU與外設(shè)之間的信息交換通常有程序查詢(xún)、中斷傳送、DMA(直接存儲(chǔ)器存取)、通道、I/O處理機(jī)管理等幾種方式。CPU尋址外設(shè)有兩種方式,一種是存儲(chǔ)器對(duì)應(yīng)輸入/輸出方式,另一種是端口尋址方式。其中,存儲(chǔ)器對(duì)應(yīng)輸入/輸出方式把一個(gè)外設(shè)作為一個(gè)存儲(chǔ)單元對(duì)待,一次輸入/輸出操作就相當(dāng)于一次存儲(chǔ)器的讀/寫(xiě)操作,這種方式雖然優(yōu)點(diǎn)不少,但實(shí)際應(yīng)用卻不多,因?yàn)樗旧聿恢庇^,容易與正常的存儲(chǔ)器讀/寫(xiě)操作混淆,同時(shí)還需要占用存儲(chǔ)器的部分空間并給存儲(chǔ)器地址分配帶來(lái)不便。CPU輸入/輸出端口尋址方式設(shè)有專(zhuān)門(mén)的輸入/輸出指令,并要求為外設(shè)接口分配端口地址。這種端口尋址方式為一個(gè)端口一個(gè)地址,使用專(zhuān)門(mén)的輸入/輸出指令,使用方便,不易出錯(cuò),清楚直觀。需要注意的是,端口尋址可以為直接方式尋址或間接方式尋址。直接方式可以尋址0~255個(gè)端口地址。間接方式通過(guò)DX寄存器給出端口地址,可尋址64K個(gè)端口地址。1.?dāng)?shù)據(jù)信息數(shù)據(jù)通常為8位或16位,可分為3種基本類(lèi)型:數(shù)字量、模擬量和開(kāi)關(guān)量。一般地,由鍵盤(pán)、光電輸入機(jī)等提供的二進(jìn)制形式的信息為數(shù)字量數(shù)據(jù)。電機(jī)的啟停、開(kāi)關(guān)的開(kāi)合等可用兩個(gè)狀態(tài)表示的量,即用一位二進(jìn)制數(shù)表示,這樣的量稱(chēng)為開(kāi)關(guān)量;由傳感器等提供的信號(hào)往往是模擬量,它需先經(jīng)模/數(shù)(A/D)轉(zhuǎn)換后再輸入到計(jì)算機(jī)中。例如,溫度、電壓等信號(hào)。CPU與外設(shè)進(jìn)行數(shù)據(jù)傳送的方式有串行傳送(一位一位傳送)和并行傳送(n位同時(shí)傳送)兩種方式,但都要經(jīng)過(guò)I/O指令實(shí)現(xiàn)。串行方式比較經(jīng)濟(jì),但速度受限,而并行方式則速度較快,成本較高。
2.狀態(tài)信息在輸入時(shí),有表示輸入裝置是否已準(zhǔn)備好的信息(READY);在輸出時(shí),有表示輸出裝置是否忙的信息(BUSY)等。
3.控制信息控制信息有控制輸入/輸出裝置的啟停信號(hào),工作方式、工作規(guī)約及格式選擇信息等。值得指出的是,控制信息和狀態(tài)信息與數(shù)據(jù)是不同性質(zhì)的,必須要分別傳送。但它們都通過(guò)IN和OUT指令在數(shù)據(jù)總線(xiàn)上進(jìn)行傳送,所以通常采用分配不同端口的方法將它們加以區(qū)別。10.2中斷處理程序設(shè)計(jì)10.2.1中斷處理程序的編寫(xiě)中斷是指執(zhí)行當(dāng)前程序的過(guò)程中,由于某種隨機(jī)出現(xiàn)的外設(shè)請(qǐng)求,使CPU暫停(即中斷)正在執(zhí)行的程序而轉(zhuǎn)去執(zhí)行為外設(shè)服務(wù)的程序;當(dāng)服務(wù)完畢后,CPU再退回到暫停處(即斷點(diǎn))繼續(xù)執(zhí)行原來(lái)的程序?,F(xiàn)在,中斷的概念除了傳統(tǒng)的外部事件(硬件)引起的中斷外,又產(chǎn)生了內(nèi)部軟件中斷的概念。在80386/80486中則把許多執(zhí)行指令過(guò)程中產(chǎn)生錯(cuò)誤的情況也納入了中斷處理的范圍,并將它們和通常意義上的內(nèi)部軟件中斷一起統(tǒng)稱(chēng)為異常中斷,簡(jiǎn)稱(chēng)異常(Exceptions),而將通常意義上的外部中斷簡(jiǎn)稱(chēng)為中斷。中斷和異常之間的區(qū)別在于,中斷用來(lái)處理CPU外部的異步事件,而異常是用來(lái)處理在執(zhí)行指令期間由CPU本身對(duì)檢測(cè)出的某些條件作出響應(yīng)的同步事件。用產(chǎn)生異常的程序和數(shù)據(jù)再次執(zhí)行時(shí),該異??偸强稍佻F(xiàn)的,而中斷通常與現(xiàn)行執(zhí)行程序無(wú)關(guān)。但中斷和異常在使處理器暫停執(zhí)行其現(xiàn)行程序,以執(zhí)行更高優(yōu)先級(jí)程序方面是一樣的。引起中斷的原因或發(fā)出中斷請(qǐng)求的來(lái)源,稱(chēng)為中斷源??梢愿鶕?jù)重要性的不同為各中斷源安排不同的優(yōu)先級(jí),CPU首先響應(yīng)優(yōu)先權(quán)高的中斷。8086具備一個(gè)簡(jiǎn)單而靈活的中斷系統(tǒng),它能處理256種類(lèi)型的中斷,中斷類(lèi)型由類(lèi)型號(hào)0~255指定,中斷源的情況可見(jiàn)圖10-1。80286以后使用兩片8259A級(jí)連結(jié)構(gòu),管理15級(jí)中斷。圖10-18086的中斷源
1.外部中斷8086有兩條外部中斷請(qǐng)求線(xiàn)NMI和INTR。NMI為非屏蔽中斷,INTR為可屏蔽中斷。NMI用于重要的中斷源,如電源掉電等,它的類(lèi)型號(hào)是2。CPU不禁止NMI線(xiàn)上的中斷請(qǐng)求,但可由指令STI(中斷允許標(biāo)志置“1”)和CLI(中斷允許標(biāo)志置“0”)允許和禁止INTR線(xiàn)上的中斷請(qǐng)求,即CPU可用STI和CLI指令開(kāi)、關(guān)中斷,當(dāng)關(guān)中斷時(shí),CPU將不響應(yīng)INTR線(xiàn)上的中斷請(qǐng)求。
2.內(nèi)部中斷1)除法指令在執(zhí)行除法指令時(shí),若發(fā)現(xiàn)除數(shù)為0或商超過(guò)了寄存器所能表達(dá)的范圍,則立即產(chǎn)生一個(gè)類(lèi)型0的內(nèi)部中斷。2)溢出中斷指令I(lǐng)NTO
若上一條指令使溢出標(biāo)志OF置1,那么當(dāng)執(zhí)行溢出中斷指令I(lǐng)NTO時(shí),立即產(chǎn)生一個(gè)類(lèi)型4的中斷;若標(biāo)志OF為0,則此指令不起作用。3)INTn指令
CPU執(zhí)行完INTn指令時(shí)立即產(chǎn)生一個(gè)中斷,所以又稱(chēng)它為“軟件中斷”。中斷的類(lèi)型由指令中的n指明。因?yàn)镮NT指令中可以指定任何的類(lèi)型號(hào),故此指令可方便地用來(lái)調(diào)試為外設(shè)編寫(xiě)好的中斷服務(wù)程序。4)單步中斷若單步標(biāo)志IF為1,則在每條指令執(zhí)行后,CPU自動(dòng)產(chǎn)生一個(gè)類(lèi)型1的中斷(單步中斷),使程序單步執(zhí)行,它提供給用戶(hù)強(qiáng)有力的調(diào)試手段。8086規(guī)定這些中斷的優(yōu)先權(quán)從高到低的順序是:●除法錯(cuò)誤、INTO、INTn;●NMI;●INTR;●單步中斷。3.中斷矢量表中斷矢量表占用內(nèi)存中00000H到003FFH的1KB空間。表中內(nèi)容分為256項(xiàng),對(duì)應(yīng)于類(lèi)型號(hào)0~255,每一項(xiàng)占用4個(gè)字節(jié),用來(lái)存放相應(yīng)類(lèi)型的中斷服務(wù)程序的入口地址,高兩字節(jié)存放入口地址的段地址部分,低兩字節(jié)存放段內(nèi)偏移地址部分,如圖10-2所示。對(duì)于任一指定類(lèi)型的中斷,CPU只要將其類(lèi)型號(hào)乘4就可以得到其中斷矢量(即此類(lèi)中斷在中斷矢量表中占用的4個(gè)字節(jié)的最低字節(jié)的地址),然后取出它所占有的4個(gè)字節(jié)的內(nèi)容分別送到IP和CS,就實(shí)現(xiàn)了中斷服務(wù)程序的調(diào)用,所以中斷矢量表是中斷類(lèi)型號(hào)與其對(duì)應(yīng)的中斷服務(wù)程序之間的連接鏈。圖10-2中斷矢量表采用中斷矢量表的方法,CPU可以直接通過(guò)中斷矢量轉(zhuǎn)向相應(yīng)的處理程序,而不必逐個(gè)檢查和確定中斷源,因而加快了中斷處理的速度。80386到PentiumCPU使用中斷描述表IDT來(lái)管理各種中斷。當(dāng)系統(tǒng)工作于實(shí)模式時(shí),IDT變?yōu)?086中的中斷矢量表。10.2.2中斷矢量的獲取1.中斷類(lèi)型號(hào)的獲取方法(1)除法錯(cuò)誤、單步中斷、非屏蔽中斷NMI、斷點(diǎn)中斷和溢出中斷分別自動(dòng)提供類(lèi)型號(hào)0~5。(2)對(duì)于外部中斷INTR,可以有兩種方法提供中斷類(lèi)型號(hào)。方法1:自己設(shè)計(jì)接口電路,利用寄存器/緩沖器或利用8212芯片這樣的組件存放中斷類(lèi)型號(hào)。CPU響應(yīng)中斷后,接口電路將此類(lèi)型號(hào)送入數(shù)據(jù)總線(xiàn),CPU讀數(shù)據(jù)總線(xiàn)從而獲得中斷類(lèi)型號(hào)。圖10-3給出了實(shí)現(xiàn)這一功能的接口電路的方框圖。某一外設(shè)的中斷類(lèi)型號(hào)可事先由輸出指令送入它的中斷類(lèi)型號(hào)寄存器/緩沖器或預(yù)先將組件(如8212芯片)的引線(xiàn)接好。當(dāng)外部設(shè)備已準(zhǔn)備好數(shù)據(jù)可以向CPU輸送,或外設(shè)已準(zhǔn)備好可以接收來(lái)自CPU的信號(hào)時(shí),狀態(tài)信號(hào)線(xiàn)上發(fā)一脈沖信號(hào),經(jīng)中斷請(qǐng)求觸發(fā)器向CPU的INTR線(xiàn)發(fā)出中斷請(qǐng)求,CPU響應(yīng)中斷后,進(jìn)入中斷響應(yīng)周期,發(fā)INTA信號(hào),此信號(hào)將已預(yù)先裝入的或由硬件芯片提供的中斷矢量號(hào)送入數(shù)據(jù)總線(xiàn),CPU即可讀得。在中斷服務(wù)程序中可以安排與此外設(shè)的數(shù)據(jù)交換??赏ㄟ^(guò)將圖10-3中的中斷屏蔽觸發(fā)器設(shè)置為1或?yàn)?來(lái)控制是否讓外設(shè)發(fā)中斷請(qǐng)求。圖10-3中斷方式接口電路方框圖
例10-1已為某一外設(shè)指定中斷類(lèi)型號(hào)為6,編寫(xiě)此外設(shè)中斷服務(wù)程序。程序描述如下:
CODESEGMENTMAIN: ;主程序
HLTINTR6PROCNEAR ;中斷類(lèi)型號(hào)為6的中斷服務(wù)程序
STIIRETINTR6ENDP
CODENED…做了以上安排后,應(yīng)在主程序的初始化部分將此中斷服務(wù)程序的入口地址送入中斷矢量表內(nèi)對(duì)應(yīng)中斷類(lèi)型6的4個(gè)單元中。完成這個(gè)功能的程序段描述如下:
MOV AX,0MOV ES,AXMOV DI,06H*4MOV AX,OFFSETINTR6CLDSTOSWMOV AX,CSSTOSW在所有中斷服務(wù)程序的結(jié)尾處,應(yīng)安排開(kāi)中斷指令STI和從中斷返回的指令I(lǐng)RET。
另一種方法:利用Intel8259A芯片。Intel8259A是可編程的中斷控制器,如圖10-1所示,它可以接收來(lái)自外設(shè)的8個(gè)各自獨(dú)立的中斷請(qǐng)求信號(hào),分別為IRQ0~I(xiàn)RQ7。8259A將它們按優(yōu)先權(quán)的高低進(jìn)行排隊(duì)。IRQ0優(yōu)先權(quán)最高,依次降低,IRQ7為最低。當(dāng)某一時(shí)刻出現(xiàn)兩個(gè)或兩個(gè)以上的中斷請(qǐng)求信號(hào)時(shí),8259A首先響應(yīng)優(yōu)先權(quán)高者。將中斷信號(hào)送到CPU的INTR線(xiàn)上,進(jìn)而又將對(duì)應(yīng)于該中斷源的惟一的中斷類(lèi)型號(hào)送給CPU。CPU獲得此中斷類(lèi)型號(hào),就自動(dòng)轉(zhuǎn)入對(duì)應(yīng)的中斷服務(wù)程序。表10-28259A的中斷源表10-28259A的中斷源8259A輸入
中斷類(lèi)型號(hào)
設(shè)
備
IRQ008H定時(shí)器(通道0)
IRQ109H鍵盤(pán)
IRQ20AH彩色圖像接口
IRQ30BH未用
IRQ40CH串行(RS-232)接口
IRQ50DH未用
IRQ60EH軟盤(pán)
IRQ70FH打印機(jī)8259A中有一個(gè)中斷屏蔽寄存器(IMR),它的I/O端口地址是21H。它的位0~7對(duì)應(yīng)于IRQ0~I(xiàn)RQ7,可以通過(guò)設(shè)置這個(gè)寄存器的任一位為0或1去控制任一中斷源的中斷允許或禁止。某位為0表示允許該中斷源發(fā)出的中斷請(qǐng)求信號(hào)經(jīng)8259A產(chǎn)生一個(gè)要發(fā)給CPU的中斷,為1則禁止該中斷源。例如,只允許鍵盤(pán)中斷,則可設(shè)置如下中斷屏蔽字:
MOVAL,0FDHOUT21H,AL使用8259A時(shí),應(yīng)在主程序開(kāi)始處按上述原則初始化中斷屏蔽寄存器。在中斷服務(wù)程序的結(jié)束處應(yīng)發(fā)出“中斷結(jié)束”(EOI)命令(20H)給8259A的中斷命令寄存器(I/O端口地址20H),具體程序如下:
MOVAL,20HOUT20H,AL
2.中斷過(guò)程在調(diào)用相應(yīng)的中斷服務(wù)程序前,CPU先將機(jī)器狀態(tài)用標(biāo)志位入棧的方法保存起來(lái)。接著CPU清除標(biāo)志位IF和TF,屏蔽新的中斷請(qǐng)求和單步中斷。然后,CPU把當(dāng)前的代碼段寄存器的內(nèi)容入棧保護(hù),從矢量表(高兩個(gè)字節(jié))中取出新的代碼段寄存器值送至CS;接著CPU把當(dāng)前的指令指針值入棧,再?gòu)氖噶勘碇腥〕鲂碌腎P值,送至IP中。于是程序就轉(zhuǎn)到了中斷服務(wù)程序。中斷服務(wù)程序可按各個(gè)設(shè)備的要求來(lái)加以編制,但通常有保護(hù)現(xiàn)場(chǎng)(入棧)指令,在返回前要恢復(fù)現(xiàn)場(chǎng)(退棧)指令,最后要用中斷返回指令I(lǐng)RET,恢復(fù)斷點(diǎn)處的CS值和IP值,并保存CPU的狀態(tài)。在中斷發(fā)生時(shí),CPU自動(dòng)清除了IF和TF,其目的是使CPU轉(zhuǎn)入中斷處理程序后,不允許再產(chǎn)生新的中斷。如果在執(zhí)行中斷處理程序中,還允許外部中斷,可以通過(guò)STI指令再把IP置1。編寫(xiě)中斷處理程序和編寫(xiě)子程序一樣,所使用的匯編語(yǔ)言指令沒(méi)有特殊限制,只是中斷處理程序返回時(shí)使用IRET指令。這條指令的工作步驟和中斷發(fā)生的工作步驟正好相反。它首先把IP、CS和EFLAGS的內(nèi)容彈棧,然后返回中斷發(fā)生時(shí)緊接著的下一條指令,CPU接著執(zhí)行原來(lái)的程序。在中斷發(fā)生時(shí),下述操作是由硬件自動(dòng)完成的:(1)取中斷類(lèi)型號(hào)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)中斷處理程序。10.2.3中斷程序設(shè)計(jì)舉例1.中斷和中斷返回指令I(lǐng)NT/INTO/IRET
指令格式:INTimm8
INTO
IRETINTimm8為軟中斷指令,用于產(chǎn)生一個(gè)由8位立即數(shù)指定中斷號(hào)的軟中斷。該指令首先將標(biāo)志寄存器和斷點(diǎn)地址(CS和IP的值)入棧,并將標(biāo)志位TF和IF清0(關(guān)單步和可屏蔽中斷),然后轉(zhuǎn)向指定中斷號(hào)對(duì)應(yīng)的中斷服務(wù)程序。中斷服務(wù)程序的入口地址是以中斷號(hào)作為索引,查中斷矢量表或中斷描述符表得到的。
INTO為溢出中斷指令。它實(shí)際上是軟中斷指令I(lǐng)NT的特例,其中斷號(hào)隱含為1,所以INTO=INT4。它只有當(dāng)OF置1時(shí)才產(chǎn)生中斷。
IRET為中斷返回指令,用于從中斷服務(wù)程序返回原程序。它執(zhí)行的操作是從堆棧中彈出原入棧保護(hù)的IP、CS和標(biāo)志寄存器值,并重新開(kāi)始被中斷程序的執(zhí)行。
2.中斷處理程序的編寫(xiě)前面已提及,當(dāng)一個(gè)可屏蔽中斷被響應(yīng)后,CPU進(jìn)入中斷響應(yīng)周期。此時(shí)被響應(yīng)的外設(shè)應(yīng)將本身的中斷類(lèi)型號(hào)送往數(shù)據(jù)總線(xiàn)。CPU讀取這個(gè)類(lèi)型號(hào),將其乘4,就得到中斷矢量表中相應(yīng)的中斷矢量入口,并轉(zhuǎn)入中斷處理程序。具體的工作由中斷處理程序完成,外中斷和軟中斷程序設(shè)計(jì)不盡相同。1)外中斷處理程序外設(shè)中斷是隨機(jī)發(fā)生的,在中斷處理程序設(shè)計(jì)時(shí)必須考慮這一點(diǎn)。外中斷處理程序的主要步驟如下:(1)保護(hù)現(xiàn)場(chǎng),主要指各通用寄存器的內(nèi)容和除CS外代碼段寄存器的內(nèi)容,保護(hù)方法一般是入棧;(2)盡快完成中斷處理,以免影響其他外設(shè)的中斷請(qǐng)求;(3)恢復(fù)現(xiàn)場(chǎng);(4)中斷返回,用IRET指令返回。2)軟中斷處理程序由中斷指令引起的軟中斷盡管是不可屏蔽的,但只有在CPU執(zhí)行中斷指令后才會(huì)發(fā)生。中斷指令類(lèi)似于子程序調(diào)用指令,相應(yīng)的軟中斷處理程序在很大程度上類(lèi)似于子程序。(1)棧切換。由于軟中斷處理程序往往在開(kāi)中斷狀態(tài)下執(zhí)行,占用??臻g量大,棧的切換不可避免,同時(shí),為實(shí)現(xiàn)中斷的嵌套,也需要棧的切換。(2)開(kāi)中斷。只有在開(kāi)中斷后,CPU才響應(yīng)可屏蔽的外設(shè)請(qǐng)求,外設(shè)的中斷請(qǐng)求才能及時(shí)得到處理。如果此軟件中斷處理程序要被外設(shè)中斷處理程序“調(diào)用”,則是否要開(kāi)中斷或何時(shí)開(kāi)中斷,應(yīng)根據(jù)實(shí)際情況,再作考慮。(3)保護(hù)現(xiàn)場(chǎng)。應(yīng)保護(hù)中斷處理程序中要使用的寄存器,而這些寄存器在進(jìn)入中斷處理程序前,可能已被其他程序所使用。這樣在使用軟中斷指令時(shí),可不必考慮有關(guān)寄存器內(nèi)容的保護(hù)問(wèn)題。(4)中斷處理。(5)恢復(fù)現(xiàn)場(chǎng)。依次恢復(fù)被保護(hù)寄存器的原有內(nèi)容。(6)再次實(shí)施棧切換。如果在開(kāi)始時(shí)切換了棧,那么也要再重新切換回原棧。(7)利用IRET指令實(shí)現(xiàn)中斷返回。
例10-2當(dāng)需要改變某個(gè)中斷矢量的內(nèi)容時(shí),必須要先將原中斷矢量的入口地址保護(hù)起來(lái),以便用完之后恢復(fù)。使用DOS的35號(hào)系統(tǒng)功能調(diào)用,讀取指定中斷矢量(由AL寄存器給出)的入口地址到寄存器對(duì)ES和BX中,ES寄存器用于存放段基址,BX寄存器存放偏移量。這就是取中斷矢量所要實(shí)現(xiàn)的功能。實(shí)現(xiàn)取中斷矢量功能的程序描述如下:
CSEGSEGMENTPARAPUBLIC'CODE'
ASSUMECS∶CSEGGETINTV PROCFAR PUSHAXMOV AH,35H;調(diào)用DOS功能35HINT 21HPOP AXRETGETINTV ENDPCSEG ENDS
END例10-3當(dāng)用戶(hù)需要建立一個(gè)指定的中斷矢量,使其指向用戶(hù)定義的中斷處理程序時(shí),可以使用DOS的37號(hào)系統(tǒng)功能調(diào)用,將用戶(hù)定義的中斷處理程序的入口地址DS∶DX送入由AL寄存器指定中斷號(hào)的矢量地址中?,F(xiàn)要求編程實(shí)現(xiàn)置中斷矢量(60H號(hào))指向中斷處理程序MYINT的功能。此類(lèi)問(wèn)題求解的一般方法是:改變中斷矢量之前,必須將原中斷矢量的入口地址讀出,并保存到存儲(chǔ)器中,以便自定義的中斷程序處理完后進(jìn)行恢復(fù)。下述程序中,GETINTV子程序完成的就是將原中斷矢量的入口地址讀出的任務(wù)。程序描述如下:
EXTRNGETINTV:FAR,SETINTV:FARPUBLICOLDSEG,OLDOFFDATASEGMENTPARAPUBLIC'DATA'OLDSEG DW? ;保存段址
OLDOFF DW? ;保存偏移量
DATA ENDSCSEG SEGMENTPARAPUBLIC'CODE'
ASSUME CS:CSEG,DS:DATASTARTPROC FAR PUSH ES
;保護(hù)ES MOV AL,60H;取60H號(hào)中斷矢量
CALL GETINTV MOV OLDSEG,ES;并保存到存儲(chǔ)器中
MOV OLDOFF,BX POP ES;恢復(fù)ES PUSH DS PUSH CS POP DS
;使DS指向代碼段
LEA DX,MYINT;使DS∶DX指向MYINT CALL SETINTV;改變中斷矢量
POP DS RETSTART ENDPCSEG
ENDS ENDMYINT PROCNEAR ;中斷處理程序
IRETMYINT ENDP
…值得說(shuō)明的是,執(zhí)行上述程序段后,將60H號(hào)中斷矢量的內(nèi)容變?yōu)镸YINT。一般情況下,在處理完MYINT之后,需恢復(fù)60H號(hào)中斷矢量的原有內(nèi)容,可執(zhí)行下述程序段:
EXTRNOLDSEG:WORD,OLDOFF:WORDEXTRNSETINTV:FARPUSHDS
;保護(hù)程序的DSMOVDS,OLDSEG ;DS∶DX為原先中斷矢量
MOVDX,OLDOFFCALLSETINTV ;改變中斷矢量
POP DSCSEGSEGMENTPARAPUBLIC'CODE'
ASSUME CS∶CSEGSETINTVROC FAR
PUSH AX
MOV AH,25H ;調(diào)用DOS功能25H
INT 21H
POP AX
RETSETINTVENDPCSEGENDSEND
例10-4編一段中斷處理程序,在主程序運(yùn)行的過(guò)程中,每隔10秒鐘響鈴一次,同時(shí)在屏幕上顯示“Thebellisring!”
問(wèn)題分析:在系統(tǒng)定時(shí)器(中斷類(lèi)型為8)的中斷處理程序中,有一條中斷指令I(lǐng)NT1CH,時(shí)鐘中斷每發(fā)生一次(約每秒中斷18.2次),都要調(diào)用一次中斷類(lèi)型1CH的處理程序。使用1CH中斷類(lèi)型時(shí),應(yīng)注意:(1)在ROMBIOS中,1CH的處理程序只有一條IRET指令,實(shí)際上它并沒(méi)有做任何工作,只是為用戶(hù)提供了一個(gè)中斷類(lèi)型號(hào)。如果用戶(hù)有某種周期性的工作需要完成,就可以利用系統(tǒng)定時(shí)器的中斷間隔,用自己設(shè)計(jì)的處理程序來(lái)代替原有的1CH程序。(2)1CH是用戶(hù)的中斷類(lèi)型,可能已被其他功能的程序所引用,所以在編寫(xiě)新的中斷程序時(shí),應(yīng)做下述工作:①在主程序的初始化部分,先保存當(dāng)前中斷矢量表的內(nèi)容,再置新的中斷矢量;②在主程序的結(jié)束部分恢復(fù)保存的1CH矢量。程序描述如下:
DATASEGMENTCOUNTDW1MESSDB'Thebellisring!',0DH,0AH,'$'DATADNDSCODESEGMENT
ASSUMECS∶CODE,DS∶DATA,ES∶DATAMAIN PROC FARSTART: PUSH DS
SUB AX,AX PUSHAXMOV AX,DATAMOVDS,AX MOVAL,1CH ;取原中斷矢量
MOVAH,35HINT 21H PUSHES ;存原中斷矢量段址
PUSHBX ;存原中斷矢量偏移量
PUSHDSMOVDX,OFFSETRING ;新偏移量送DX MOVAX,SEGRING
MOVDS,AX
;新段址送DS MOV AL,1CH MOVAH,25H INT 21H ;寫(xiě)入新的中斷矢量
POP DS IN AL,21H ;讀取中斷屏蔽字
AND AL,11111110B ;允許定時(shí)器中斷
OUT 21H,ALSTI ;開(kāi)中斷
MOVDI,2000
DELAY: MOVSI,3000 ;延時(shí)
DELAY1: DEC SI JNZ DELAY1 DEC DI JNZ DELAY POP DX ;恢復(fù)原中斷矢量
POP DS MOV AL,1CH MOV AH,25H INT 21H RET
MAIN ENDPRING PROC NEAR PUSH DS ;各工作寄存器內(nèi)容入棧
PUSH AX PUSH CX PUSH DX MOV AX,DATA MOV DS,AX STI DEC COUNT;計(jì)秒值
JNZ EXIT MOV DX,OFFSETMESS MOV AH,09H
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 ;延時(shí)等待
DEC DX JNE SOUND MOV COUNT,182EXIT: CLI ;關(guān)中斷
POP DX POP CX POP AX POP DS IRET ;中斷返回
RING ENDPCODE ENDS ENDSTART10.3DOS功能調(diào)用10.3.1概述為便于編程,DOS系統(tǒng)把涉及設(shè)備驅(qū)動(dòng)和文件管理等方面的子程序編寫(xiě)成相對(duì)獨(dú)立的程序模塊并編號(hào),通過(guò)功能調(diào)用的方法來(lái)使用這些子程序,滿(mǎn)足用戶(hù)對(duì)設(shè)備驅(qū)動(dòng)、文件管理等的需要。減少對(duì)系統(tǒng)硬件環(huán)境的考慮和依賴(lài),能使應(yīng)用程序的編制變得簡(jiǎn)單且有較好的通用性。DOS系統(tǒng)中,已編號(hào)的、可由程序員調(diào)用的子程序稱(chēng)為DOS的功能調(diào)用或系統(tǒng)調(diào)用。通常,DOS的各種命令是操作員與DOS的接口,而功能調(diào)用則是程序員與DOS的接口。DOS功能調(diào)用主要包括3方面的子程序:(1)設(shè)備驅(qū)動(dòng)(基本I/O);(2)文件管理;(3)內(nèi)存管理、存取時(shí)間、存取終端矢量、終止程序等。10.3.2基本I/O功能調(diào)用1.調(diào)用方法為了使用方便,DOS已將所有子程序按功能順序編了號(hào),調(diào)用時(shí)只要按如下方法使用就可以了。(1)將要調(diào)用功能的功能號(hào)送入AH寄存器;(2)根據(jù)所調(diào)用功能的規(guī)定設(shè)置入口參數(shù);(3)用INT21H指令轉(zhuǎn)入子程序入口;(4)調(diào)用結(jié)束后,按規(guī)定取得出口參數(shù)。需要指出的是,有的子程序不要入口參數(shù),但大部分需要將參數(shù)送入指定地點(diǎn)。編程時(shí),只須給出這三個(gè)方面的信息,而不必關(guān)心具體程序如何,在內(nèi)存中的存放地址如何。DOS根據(jù)所給的信息,自動(dòng)轉(zhuǎn)入相應(yīng)的子程序去執(zhí)行。輸出的結(jié)果一般是在調(diào)用結(jié)束后通過(guò)出口參數(shù)送出,出口參數(shù)一般是寄存器。有些子程序,如屏幕顯示字符子程序,調(diào)用結(jié)束后會(huì)在屏幕上顯示結(jié)果。例10-5
MOV DL,':'MOV AH,2INT 21H
這是2號(hào)功能調(diào)用(編號(hào)為2),實(shí)現(xiàn)將字符送入屏幕(或打印機(jī))顯示的功能。它要求將要顯示的字符的ASCII碼值送入DL,調(diào)用結(jié)束,屏幕上顯示DL中的內(nèi)容“:”。
2.基本I/O功能調(diào)用1)鍵盤(pán)輸入(1號(hào)調(diào)用)1號(hào)系統(tǒng)功能調(diào)用等待從標(biāo)準(zhǔn)輸入設(shè)備輸入一個(gè)字符并送入寄存器AL,不需入口參數(shù)。例10-6
MOVAH,1INT21H
執(zhí)行上述指令,系統(tǒng)將掃描鍵盤(pán),等待有鍵按下,一旦有鍵按下,就將鍵值(相應(yīng)字符的ASCII碼值)讀入,先檢查是否是Ctrl-Break,若是,則退出命令執(zhí)行;否則將鍵值送入AL寄存器,同時(shí)將這個(gè)字符顯示在屏幕上。2)控制臺(tái)輸入但無(wú)顯示(8號(hào)調(diào)用)8號(hào)調(diào)用與1號(hào)調(diào)用類(lèi)同,只是不在屏幕上顯示輸入的字符。3)打印輸出(5號(hào)調(diào)用)把DL中的字符輸出到打印機(jī)上。例10-7
MOVDL,'A'MOVAH,5INT21H4)直接控制臺(tái)輸入/輸出(6號(hào)調(diào)用)6號(hào)調(diào)用可從標(biāo)準(zhǔn)輸入設(shè)備輸入字符,也可以向屏幕上輸出字符,并且不檢查Ctrl-Break。若DL=0FFH時(shí),表示從鍵盤(pán)輸入。若標(biāo)志ZF=0,表示AL中為鍵入的字符值。若標(biāo)志ZF=1,表示AL中不是鍵入的字符值,即尚無(wú)鍵按下。若DL≠0FFH時(shí),表示向屏幕輸出,DL中為輸出字符的ASCII碼值。例10-8
MOVDL,0FFHMOVAH,6INT21H;從鍵盤(pán)輸入字符
MOVDL,24HMOVAH,6INT21H;將24H對(duì)應(yīng)的字符'$'輸出5)直接控制臺(tái)輸入但不顯示(7號(hào)調(diào)用)等待從標(biāo)準(zhǔn)輸入設(shè)備輸入字符,然后將其送入AL,如同6號(hào)調(diào)用,對(duì)字符不做檢查。6)輸出字符串(9號(hào)調(diào)用)調(diào)用時(shí),要求DS∶DX必須指向內(nèi)存中一個(gè)以“$”作為結(jié)束標(biāo)志的字符串。字符串中每一個(gè)字符(不包括結(jié)尾標(biāo)志$)都輸出顯示或打印。例10-9
DATASEGMENTBUFDB'HOWDOYOUDO?$'
DATAENDSCODESEGMENT
MOVAX,DATAMOVDS,AX
MOVDX,OFFSETBUFMOVAH,9INT21H
CODEENDS執(zhí)行本程序,屏幕將顯示:HOWDOYOUDO?…………7)字符串輸入(0AH號(hào)調(diào)用)從鍵盤(pán)接收字符串到內(nèi)存輸入緩沖區(qū)。要求事先定義一個(gè)輸入緩沖區(qū),緩沖區(qū)內(nèi)第一個(gè)字節(jié)指出緩沖區(qū)能容納的字符個(gè)數(shù),不能為零。第二個(gè)字節(jié)保留以用作填寫(xiě)輸入的字符個(gè)數(shù)。從第三個(gè)字節(jié)開(kāi)始存放從鍵盤(pán)接收的字符。若實(shí)際輸入的字符數(shù)少于定義的字節(jié)數(shù),緩沖區(qū)內(nèi)其余字節(jié)填零;若多于定義的字節(jié)數(shù),則后來(lái)輸入的字符丟掉,且響鈴。調(diào)用時(shí),要求DS:DX指向輸入緩沖區(qū)。例10-10
DATA SEGMENTBUF DB50 ;緩沖區(qū)長(zhǎng)度
DB? ;保留為填入實(shí)際輸入的字符個(gè)數(shù)
DB50 DUP(?) ;定義50個(gè)字節(jié)存儲(chǔ)空間
DATA ENDSCODEE SEGMENT
MOV AX,DATAMOV DS,AX
MOV DX,OFFSETBUFMOV AH,10INT 21HCODE ENDS………8)異步通信口輸入(03H)
從標(biāo)準(zhǔn)異步通信接口等待輸入一個(gè)字符,然后送到寄存器AL中。啟動(dòng)時(shí)DOS把一個(gè)異步通信端口初始化為2400波特,沒(méi)有奇偶校驗(yàn)位,一個(gè)停止位,字長(zhǎng)為8位。9)異步通信口輸出(04H)
在DL中的數(shù)據(jù)被輸出到異步通信接口去。關(guān)于異步通信口的輸入/輸出,推薦使用ROMBIOS中斷調(diào)用14H。10)日期設(shè)置(28H調(diào)用)調(diào)用時(shí),CX:DX中必須有一個(gè)有效的日期,CX中存放年號(hào)(1900~2099),DH中存放月號(hào)(1~12),DL中存放日號(hào)。若日期有效,設(shè)置成功,AL=0;否則AL=0FFH。
例10-11將日期設(shè)置為2003年3月15日,程序段描述如下:
MOVCX,2003MOVDH,3MOVDL,15MOVAH,2BHINT21H11)取得日期(2AH)
調(diào)用后返回日期在CX∶DX中。CX中放年號(hào),為二進(jìn)制數(shù),DH中放月號(hào),DL中放日號(hào)。如果日時(shí)鐘轉(zhuǎn)到下一天,日期將自動(dòng)調(diào)整,也考慮每月的天數(shù)和閏年。不需要入口參數(shù)。12)設(shè)置時(shí)間(2DH)
時(shí)間的格式是四個(gè)8位二進(jìn)制數(shù),具體地說(shuō):CH表示小時(shí)(0~23),CL表示分(0~59),DH表示秒(0~59),DL表示百分之一秒(0~99),這個(gè)格式可轉(zhuǎn)化為打印/顯示形式。也可用來(lái)計(jì)算,比如從一個(gè)時(shí)間值中減去另一個(gè)時(shí)間值。調(diào)用時(shí),要求CX∶DX中存放要求的時(shí)間。若此時(shí)間是有效的,設(shè)置成功,AL返回0,若時(shí)間的組成部分無(wú)效,設(shè)置操作取消,AL返回0FFH。13)取得時(shí)間(2CH)
時(shí)間的格式如同2DH功能調(diào)用,不需要入口參數(shù),調(diào)用結(jié)束時(shí),CX∶DX中為返回的時(shí)間。例10-12執(zhí)行下述程序段:
MOVAH,2DHMOVCX,5FHMOVDX,900HINT21H將把系統(tǒng)時(shí)間設(shè)置為5點(diǎn)15分9秒。執(zhí)行下述程序段:
MOVAH,2CHINT21H將在CX∶DX中得到時(shí)間的二進(jìn)制值。10.3.3應(yīng)用舉例例10-13將內(nèi)存中BUF單元開(kāi)始的一個(gè)字符串(長(zhǎng)度為10個(gè)字節(jié))送CRT顯示,并回車(chē)換行。將一個(gè)字符串送CRT顯示,使用DOS的9號(hào)系統(tǒng)功能調(diào)用最為方便。9號(hào)系統(tǒng)功能調(diào)用要求兩個(gè)入口參數(shù),一是要求DX中為字符串首字符的偏移地址,二是要求字符串必須以“$”字符結(jié)尾,回車(chē)符、換行符的ASCII碼分別是0DH和0AH。編程如下:
DATA SEGMENTBUF DB'Thisismyfirstprogram!'DATA ENDSCSEG SEGMENT'CODE'
ASSUMECS∶CSEG,DS∶DATASTART: MOV AX,DATA MOV DS,AX LEA BX,BUF MOV AX,0D0AH;回車(chē)換行符的ASCII碼送AX
MOV [BX+10],AX ;字符串后加換行、回車(chē)符
MOV BYTEPTR[BX+12],'$';串尾加結(jié)尾符
MOV DX,BX ;字符串首地址送DX CALL LIST_1 ;顯示字符串
MOV AH,4CH INT 21H ;返回DOSCSEG ENDS END STARTCODESEGMENT
ASSUMECS∶CODELIST_1 PROC FAR
PUSH AX ;保護(hù)AX MOV AH,09H
INT 21H ;調(diào)用9號(hào)功能
POP AX ;取回AX RET ;返回LIST_1 ENDPCODE ENDS
例10-14利用DOS功能調(diào)用,模擬實(shí)現(xiàn)登錄網(wǎng)絡(luò)時(shí)口令的輸入。接收用戶(hù)的保密口令或其他特殊信息意味著從標(biāo)準(zhǔn)輸入設(shè)備上讀一個(gè)字符串,但不在輸出設(shè)備上顯示。具體實(shí)現(xiàn)方法是,從鍵盤(pán)輸入最多8個(gè)字符的口令(不顯示),送入存儲(chǔ)器中,并將口令串的開(kāi)始地址送BX保存,然后返回。利用DOS的8號(hào)系統(tǒng)功能調(diào)用可實(shí)現(xiàn)讀一個(gè)字符不回顯的功能。該功能調(diào)用從標(biāo)準(zhǔn)輸入設(shè)備上接收一個(gè)ASCII字符,并送AL寄存器。程序描述如下:
DATASEGMENTPARAPUBLIC'DATA'PROMPTDB'P1easeenteryourPassword:$'BUFFERDB8DUP(?)
;存放口令
DATAENDSCSEGSEGMENTPARAPUBLIC'CODE'
ASSUMECS:CSEG,DS:DATAPASSWORDPROCFARSTART:
PUSHDX
;保存寄存器
PUSHCX
PUSHAX
LEADX,PROMPT ;給出提示
CALL LIST_1
MOV CX,8 ;輸入8個(gè)字符
LEA BX,BUFFER ;口令字符串存放處NEXTKEY:CALL GETCHR ;讀入下一鍵
CMP AL,0DH ;是回車(chē)?
JE LEAVE ;是的,轉(zhuǎn)LEAVEMOV [BX],AL ;不是,存字符
INC BX ;并指向下一位置
LOOP NEXTKEY ;取另一鍵
LEAVE:LEA BX,BUFFER ;口令串地址送BX
POP AX ;恢復(fù)寄存器
POP CXPOP DX
RET ;返回調(diào)用程序
PASSWORDENDPCSEGENDSENDSTART
PUBLICGETCHRCSEGSEGMENTPARAPUBLIC'CODE'ASSUMECS:CSEGGETCHRPROC FARPUSH CXMOV CH,AHMOV AH,8HINT 21HMOV AH,CHPOP CXRETGETCHRENDPCSEGENDS如果輸入“Ctrl-C”字符,DOS則產(chǎn)生23H號(hào)中斷。為避免產(chǎn)生這種情況,用戶(hù)可用7號(hào)系統(tǒng)功能調(diào)用替換8號(hào)系統(tǒng)功能調(diào)用,即把子程序中的指令MOVAH,08H改成MOVAH,07H。另外,子程序需等待鍵盤(pán)上有鍵輸入后才返回調(diào)用程序,而很多情況下需要當(dāng)鍵盤(pán)上有鍵輸入時(shí)就讀入,否則返回調(diào)用程序,即并不等待鍵盤(pán)輸入。為此,該子程序就需將INT21H指令前的MOVAH,08H修改成下列形式:
MOVAH,06HMOVDL,0FFH子程序LIST_1為例10-13中的子程序LIST_1。
例10-15
編程清除屏幕并使光標(biāo)回到左上角的位置。要解決以上的問(wèn)題,首先使用軟中斷INT10H的15號(hào)子功能讀取屏幕的現(xiàn)行狀態(tài),再使用0號(hào)子功能以同樣的模式設(shè)置顯示方式。這樣不僅完成了清屏功能,而且不改變屏幕的顯示模式。程序描述如下:CSEG 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 ENDSTART10.4BIOS中斷調(diào)用10.4.1BIOS概述
BIOS(BasicInput/OutputSystem)是駐留在ROM中的程序,提供了系統(tǒng)加電自檢,引導(dǎo)裝入以及對(duì)主要I/O接口的控制等功能。對(duì)I/O接口的控制主要是對(duì)鍵盤(pán)、磁帶、磁盤(pán)、顯示器、打印機(jī)、異步串行通信接口等的控制,提供了最基本的系統(tǒng)硬件與軟件間的接口。BIOS在匯編語(yǔ)言一級(jí)上向用戶(hù)或操作系統(tǒng)提供微機(jī)所帶的一些主要外設(shè)的設(shè)備控制功能,包括開(kāi)機(jī)自檢,顯示器、鍵盤(pán)和打印機(jī)的字符傳送,圖形發(fā)生等,主要是I/O設(shè)備的處理程序和許多常用例行程序,以中斷處理程序的形式存在。這些操作均不需要用戶(hù)考慮外設(shè)的I/O地址等細(xì)節(jié)。例如,負(fù)責(zé)顯示輸出的顯示I/O中斷為10H號(hào)中斷,負(fù)責(zé)打印輸出的打印I/O程序?yàn)?7H中斷等等。在BIOS功能調(diào)用中,應(yīng)重點(diǎn)掌握10H、16H、17H和1AH四種類(lèi)型的功能調(diào)用。主要的BIOS中斷類(lèi)型有以下5種。1)CPU中斷類(lèi)型0除法錯(cuò);1單步;2非屏蔽中斷;3斷點(diǎn);4溢出;5打印屏幕;6保留;7保留。2)8259中斷類(lèi)型88254系統(tǒng)定時(shí)器;9鍵盤(pán);A保留;B保留(通信);
C保留(通信);D保留(打印機(jī));E軟盤(pán);F打印機(jī)。3)BIOS中斷類(lèi)型10顯示器;11設(shè)備檢驗(yàn);12內(nèi)存大小;13磁盤(pán);14通信;15I/O系統(tǒng)擴(kuò)充;16鍵盤(pán);17打印機(jī);18駐留BASIC;19引導(dǎo);1A時(shí)鐘;40軟盤(pán)。4)用戶(hù)應(yīng)用程序1B鍵盤(pán)Break;1C定時(shí)器;4A報(bào)警。5)數(shù)據(jù)表指針1D顯示器參量;1E軟盤(pán)參量;1F圖形字符擴(kuò)充;411#硬盤(pán)參量;462#硬盤(pán)參量。10.4.2BIOS中斷調(diào)用方法用戶(hù)在自己編制的程序中,可以調(diào)用BIOS提供的這些設(shè)備驅(qū)動(dòng)子程序,就像調(diào)用用戶(hù)自己編的子程序一樣。調(diào)用BIOS各子程序的方法是利用中斷指令I(lǐng)NT,先按調(diào)用類(lèi)型要求設(shè)置入口參數(shù),再通過(guò)帶有類(lèi)型號(hào)的軟中斷指令進(jìn)行功能調(diào)用。CPU響應(yīng)中斷后就把控制權(quán)交給所調(diào)用的BIOS的子程序,由它提供中斷服務(wù)。BIOS調(diào)用的基本步驟是:(1)置入口參數(shù);(2)使用中斷語(yǔ)句INTn,其中n為中斷號(hào)。例10-16MOVAH,0 ;功能號(hào)為0
INT1AH ;1AH為BIOS中斷號(hào),功能為讀時(shí)間計(jì)數(shù)器的值10.4.3BIOS中斷調(diào)用與DOS功能調(diào)用的比較
BIOS中斷程序處于DOS功能調(diào)用和硬件環(huán)境之間,和DOS功能調(diào)用相比其優(yōu)點(diǎn)是效率高,缺點(diǎn)是編程相對(duì)復(fù)雜;和直接對(duì)硬件編程相比,優(yōu)點(diǎn)是實(shí)現(xiàn)相對(duì)容易,缺點(diǎn)是效率相對(duì)較低。在一些情況下既能選擇DOS中斷也能選擇BIOS中斷來(lái)執(zhí)行同樣的功能。例如,打印機(jī)輸出一個(gè)字符的功能,可用DOS中斷21H的功能5,也可用BIOS中斷17H的功能0。因?yàn)锽IOS比DOS更靠近硬件。一般情況下,盡可能地使用DOS功能,但在少數(shù)情況下必須使用BIOS功能。例如,BIOS中斷17H的功能2為讀打印機(jī)狀態(tài),DOS就沒(méi)有等效的功能。因此,對(duì)BIOS和DOS調(diào)用的選擇原則是,無(wú)法使用DOS功能調(diào)用或DOS沒(méi)有提供而B(niǎo)IOS提供了功能的情況下可以考慮使用BIOS中斷。例10-17根據(jù)顯示輸出不同的內(nèi)容,對(duì)顯示器的使用通常需要變換顯示模式。這時(shí),可使用BIOS所提供的視頻顯示I/O驅(qū)動(dòng)程序來(lái)設(shè)置屏幕的顯示模式。屏幕顯示方式的設(shè)置使用軟中斷INT10H功能來(lái)實(shí)現(xiàn),若需設(shè)置屏幕顯示模式為黑白字符方式,應(yīng)使用INT10H的0號(hào)子功能。0——40×25 黑白字符方式1——40×25 彩色字符方式2——80×25 黑白字符方式3——80×25 彩色字符方式4——320×200 彩色圖形方式(4種顏色)5——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時(shí)4種顏色; 顯存大于64KB時(shí)16種顏色11H——640×480 單色圖形方式(僅VGA)12H——640×480 16色圖形方式(僅VGA)13H——320×200 256色圖形方式(僅VGA)輸入?yún)?shù):AH中為顯示方式碼,編制的程序描述如下:
CSEG SEGMENTPARAPUBLIC'CODE' ASSUME CS∶CSEGSETSMODE PROC FAR
START: PUSH AX MOV AH,0 INT 10H POP AX RETSETSMODE ENDPCSEG ENDSEND START10.5輸入/輸出程序設(shè)計(jì)10.5.1程序直接控制方式1.直接輸入/輸出方式直接輸入/輸出方式,也稱(chēng)無(wú)條件傳送方式或稱(chēng)同步方式。這種傳送方式使用較少,只有在外部控制過(guò)程的各個(gè)動(dòng)作時(shí)間是固定的,且是已知的條件下才能夠應(yīng)用。它不考慮外設(shè)的狀態(tài),輸入時(shí),就只給出IN指令。輸出時(shí),也只給出OUT指令,這種傳送方式的優(yōu)點(diǎn)是程序編寫(xiě)容易,硬件電路簡(jiǎn)單,調(diào)試方便。例10-18一個(gè)無(wú)條件傳送的例子如圖10-4所示。圖中10H、11H、20H是來(lái)自地址總線(xiàn)的端口地址信號(hào)。要求編程完成采集不同的模擬量。圖10-4無(wú)條件傳送舉例這是一個(gè)同步的數(shù)據(jù)采集系統(tǒng)。被采樣的數(shù)據(jù)是八個(gè)模擬量,由繼電器繞組P0、P1、P2、…、P7控制觸點(diǎn)K0、K1、K2、…、K7逐個(gè)接通,用一個(gè)四位(十進(jìn)制數(shù))數(shù)字電壓表測(cè)量,把被采樣的模擬量轉(zhuǎn)換成十六位BCD代碼,高八位和低八位通過(guò)兩個(gè)不同的端口輸入。它們的地址分別為10H和11H。CPU通過(guò)端口20H輸出控制信號(hào),以控制繼電器的吸合,從而實(shí)現(xiàn)采集不同的模擬量。數(shù)據(jù)采集過(guò)程可用下列程序?qū)崿F(xiàn):START:MOVDX,0100H ;01→DH,設(shè)置合第一個(gè)繼電器代碼 ;00→DL,設(shè)置斷開(kāi)所有繼電器代碼
LEA BX,DSIOK ;輸入數(shù)據(jù)緩沖區(qū)的地址偏移量→BX
XOR AL ;清AL及進(jìn)位標(biāo)志
AGAIN:MOV AL,DIOUT 20H,AL ;斷開(kāi)所有繼電器線(xiàn)圈
CALL NEARDELAY1 ;模擬繼電器觸點(diǎn)的釋放時(shí)間
MOV AL,DH
OUT 20H,AL ;使P0吸合CALL NEARDELAY2 ;模擬觸點(diǎn)閉合及數(shù)字電壓表的轉(zhuǎn)換時(shí)間IN AX,10H ;輸入MOV [BX],AXINC BXINC BXRCL DH,1;DH左移一位,為下一個(gè)觸點(diǎn)閉合作準(zhǔn)備JNC AGAIN;8個(gè)模擬量未輸入完,循環(huán)此段程序
2.查詢(xún)輸入/輸出方式查詢(xún)輸入/輸出方式,也稱(chēng)條件傳送方式或稱(chēng)異步方式。當(dāng)CPU與外部操作同步時(shí),采用無(wú)條件傳送是很方便的。但如果兩者不同步時(shí),就很難確保其正確性。為解決這個(gè)問(wèn)題,可以采用查詢(xún)輸入/輸出方式。在傳送數(shù)據(jù)前,先去查詢(xún)一下外設(shè)的狀態(tài),當(dāng)外設(shè)準(zhǔn)備好以后再進(jìn)行傳送。這樣就要求CPU與外設(shè)之間的接口部分除了傳送數(shù)據(jù)的端口以外,還必須設(shè)置傳送狀態(tài)信號(hào)的端口。端口數(shù)據(jù)一般是8位(或16位)的,而狀態(tài)信息往往是一位的。這樣,不同的外設(shè)狀態(tài)信息可以使用同一端口,只要使用不同的位就可以了,查詢(xún)輸入/輸出方式解決了高速CPU與慢速外設(shè)之間傳送數(shù)據(jù)的問(wèn)題,并能夠保證傳送的正確性。綜上,可得到查詢(xún)輸入/輸出方式的工作過(guò)程如下所述。1)查詢(xún)輸入工作過(guò)程當(dāng)輸入裝置的數(shù)據(jù)已準(zhǔn)備好后應(yīng)發(fā)一個(gè)信號(hào)給CPU,送出要傳送數(shù)據(jù)的同時(shí)給出“準(zhǔn)備好”(Ready)信號(hào)。數(shù)據(jù)與狀態(tài)是由不同的端口輸入至CPU數(shù)據(jù)總線(xiàn)。當(dāng)CPU要由外設(shè)輸入信息時(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)信息,可以使用同一個(gè)端口的不同位。這種查詢(xún)輸入方式的程序流程圖如圖10-6所示。圖10-5查詢(xún)式輸入的數(shù)據(jù)和狀態(tài)信息圖10-6查詢(xún)式輸入程序流程圖工作過(guò)程描述如下:①?gòu)臓顟B(tài)端口讀入狀態(tài)信息;②測(cè)試Ready位是否為1,若不為1則轉(zhuǎn)①操作,循環(huán)等待;③從數(shù)據(jù)端口讀入數(shù)據(jù)到AX寄存器。
POLL:IN
AL,STATUS_PORT;從狀態(tài)端口輸入狀態(tài)信息
TESTAL,80H ;檢查READY是否是1
JE
POLL ;未準(zhǔn)備好,循環(huán)
IN
AL,AATA_PORT;準(zhǔn)備好,從數(shù)據(jù)端口輸入數(shù)據(jù)這種CPU與外設(shè)之間狀態(tài)信息的交換方式,稱(chēng)為應(yīng)答式,狀態(tài)信息稱(chēng)為“聯(lián)絡(luò)”(Han
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 共建電站合同范本
- 場(chǎng)地服務(wù)合作合同范本
- 汽車(chē)出口貿(mào)易合同范本
- 車(chē)輛抵押欠款合同范本
- 在農(nóng)村買(mǎi)土地合同范本
- 醫(yī)藥銷(xiāo)售人員合同范本
- 單位圍墻改造工程合同范本
- 勞動(dòng)合同范本小企業(yè)
- 專(zhuān)家工作合同范本模板范文
- 合同范例電視劇
- 揚(yáng)塵防治(治理)監(jiān)理實(shí)施細(xì)則(范本)
- 中班:語(yǔ)言擠啊擠
- (高職)旅游景區(qū)服務(wù)與管理電子課件完整版PPT全書(shū)電子教案
- 唯美動(dòng)畫(huà)生日快樂(lè)電子相冊(cè)視頻動(dòng)態(tài)PPT模板
- 設(shè)計(jì)文件簽收表(一)
- 試運(yùn)行方案計(jì)劃-
- 可研匯報(bào)0625(專(zhuān)家評(píng)審)
- 帶電核相試驗(yàn)報(bào)告
- SCH壁厚等級(jí)對(duì)照表
- 春季常見(jiàn)傳染病預(yù)防知識(shí)PPT課件
- 年產(chǎn)630噸土霉素車(chē)間工藝設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論