




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
高等教育出版社王成端主編匯編語言程序設(shè)計(jì)(第2版)普通高等教育“十一五”國家級(jí)規(guī)劃教材本章講述中斷的相關(guān)知識(shí)及DOS與BIOS中斷功能調(diào)用,中斷是CPU與外設(shè)交換數(shù)據(jù)的一種方式,而且是最常用的一種方式。DOS與BIOS中斷功能調(diào)用是系統(tǒng)提供給匯編語言程序員的大量代碼段(子程序),這些代碼段都以中斷方式進(jìn)行工作,利用它們可以極大地簡化匯編程序設(shè)計(jì)。本章中要求掌握中斷的概念、中斷源、中斷矢量表、中斷響應(yīng)條件、中斷響應(yīng)過程以及DOS功能調(diào)用的概念、調(diào)用方法及基本的I/O功能調(diào)用、磁盤文件讀寫等內(nèi)容。8.18086/8088中斷系統(tǒng)
8.2DOS中斷與系統(tǒng)功能調(diào)用
8.3BIOS中斷功能調(diào)用實(shí)訓(xùn)一PC機(jī)間的相互通信:中斷方式實(shí)訓(xùn)二發(fā)聲程序設(shè)計(jì)實(shí)訓(xùn)三彩色圖形程序設(shè)計(jì)實(shí)訓(xùn)四磁盤文件操作設(shè)計(jì)第8章中斷與系統(tǒng)功能調(diào)用8.18086/8088中斷系統(tǒng)8.1.1中斷基本知識(shí)在節(jié)中曾經(jīng)提到,CPU與外設(shè)交換信息時(shí),若用直接I/O方式,效率雖高,安全性不強(qiáng)。若用查詢方式,安全性有保障,但效率不高。為了使高速工作的CPU與低速工作的外設(shè)之間,既能安全地交換數(shù)據(jù),又有較高的效率,人們經(jīng)常采用中斷傳送方式。第8章中斷與系統(tǒng)功能調(diào)用1.中斷
中斷是指計(jì)算機(jī)的CPU暫時(shí)中止它正在執(zhí)行的主程序,轉(zhuǎn)去執(zhí)行請求中斷的那個(gè)外設(shè)或事件的中斷服務(wù)(處理)程序,待處理完畢之后,又返回主程序接著被中斷處繼續(xù)執(zhí)行,這樣的一個(gè)過程就稱為中斷。
在中斷傳送方式下,外設(shè)有“事”時(shí)向CPU發(fā)中斷申請,無事時(shí)CPU完全可以處理自己的業(yè)務(wù)。這種方式既安全又高效,因而應(yīng)用很廣。
第8章中斷與系統(tǒng)功能調(diào)用2.中斷源
引起中斷的原因或發(fā)出中斷申請的來源,稱為中斷源。中斷源有以下幾種;
①外設(shè)中斷源:一般有鍵盤、打印機(jī)、磁盤、磁帶等,工作中要求CPU為它服務(wù)時(shí),會(huì)向CPU發(fā)送中斷請求。
②故障中斷源。當(dāng)系統(tǒng)出現(xiàn)某些故障時(shí)(如存儲(chǔ)器出錯(cuò)、運(yùn)算溢出等),相關(guān)部件會(huì)向CPU發(fā)出中斷請求,以便使CPU轉(zhuǎn)去執(zhí)行故障處理程序來解決故障。
③軟件中斷源。在程序中向CPU發(fā)出中斷指令(8086/8088為INT指令),可迫使CPU轉(zhuǎn)去執(zhí)行某個(gè)特定的中斷服務(wù)程序,而中斷服務(wù)程序執(zhí)行完后,CPU又回到原程序中繼續(xù)執(zhí)行INT指令后面的指令。
④為調(diào)試而設(shè)置的中斷源。系統(tǒng)提供的單步中斷和斷點(diǎn)中斷,可以使被調(diào)試程序在指行一條指令或執(zhí)行到其個(gè)特定位置處時(shí),自動(dòng)產(chǎn)生中斷,從而便于程序員檢查中間結(jié)果,尋找錯(cuò)誤所在。第8章中斷與系統(tǒng)功能調(diào)用3.外部中斷與內(nèi)部中斷
根據(jù)中斷源是來自CPU內(nèi)部還是外部這一角度,通常人們將所有中斷源分為兩類:外部中斷源和內(nèi)部中斷源,對應(yīng)的中斷稱為外部中斷和內(nèi)部中斷。
(1)外部中斷源和外部中斷
外部中斷源即硬件中斷源,它們來自CPU外部。8086/8088CPU提供了兩個(gè)引腳來接收外部中斷源的中斷請求信號(hào):可屏蔽中斷請求引腳和非屏蔽中斷請求引腳。
通過可屏蔽中斷請求引腳輸入的中斷信號(hào)叫可屏蔽中斷,對這種中斷請求CPU可響應(yīng)也可不響應(yīng),具體取決于標(biāo)志寄存器中IF標(biāo)志位的狀態(tài)。通過非屏蔽中斷請求引腳輸入的中斷請求信號(hào)叫非屏蔽中斷。這種中斷請求CPU必須無條件響應(yīng)。第8章中斷與系統(tǒng)功能調(diào)用(2)內(nèi)部中斷源和內(nèi)部中斷
內(nèi)部中斷源是來自CPU內(nèi)部的中斷事件,這些事件都是特定事件,一旦發(fā)生,CPU即調(diào)用預(yù)定的中斷服務(wù)程序去處理。內(nèi)部中斷主要有以下幾種情況:
①除法錯(cuò)誤:當(dāng)執(zhí)行除法指令時(shí),如果除數(shù)為0或是商數(shù)超過了最大值,CPU會(huì)自動(dòng)產(chǎn)生類型為0的除法錯(cuò)誤中斷。
②軟件中斷
執(zhí)行軟件中斷指令時(shí),會(huì)產(chǎn)生軟件中斷。8086/8088的系統(tǒng)中,設(shè)置了三條中斷指令,分別是:第8章中斷與系統(tǒng)功能調(diào)用中斷指令I(lǐng)NTn:用戶可以用INTn指令來產(chǎn)生一個(gè)類型為n的中斷,以便讓CPU執(zhí)行n號(hào)中斷的中斷服務(wù)程序,通常這樣做的目的是該中斷服務(wù)程序的功能正是當(dāng)前軟件所需要的。
斷點(diǎn)中斷INT3:執(zhí)行斷點(diǎn)指令I(lǐng)NT3,將引起類型為3的斷點(diǎn)中斷,這是調(diào)式程序?qū)S玫闹袛唷?/p>
溢出中斷INTO:如果標(biāo)志寄存器中溢出標(biāo)志位為1,在執(zhí)行了INTO指令后,產(chǎn)生類型為4的溢出中斷。第8章中斷與系統(tǒng)功能調(diào)用③單步中斷
當(dāng)標(biāo)志寄存器的標(biāo)志位TF置1時(shí),8086/8088CPU處于單步工作方式。CPU每執(zhí)行完一條指令,自動(dòng)產(chǎn)生類型為1的單步中斷,直到將TF置0為止。單步中斷和斷點(diǎn)中斷一般僅在調(diào)試程序內(nèi)使用。第8章中斷與系統(tǒng)功能調(diào)用為了解決多個(gè)中斷源同時(shí)申請中斷時(shí)響應(yīng)的先后順序問題,系統(tǒng)將所有的中斷源劃分為四級(jí),以0級(jí)為最高,依次降低等,各級(jí)情況如下:
0級(jí)---除單步中斷以外的內(nèi)中斷源
1級(jí)---不可屏蔽中斷源
2級(jí)---可屏蔽中斷源
3級(jí)---單步中斷源
不同級(jí)別的中斷源同時(shí)申請中斷時(shí),CPU根據(jù)級(jí)別高低依次決定服務(wù)順序。第8章中斷與系統(tǒng)功能調(diào)用4.中斷類型號(hào)
由于系統(tǒng)中存在許多中斷源,當(dāng)有中斷發(fā)生時(shí),就有CPU如何識(shí)別中斷源是誰的問題,只有知道了中斷源是誰,CPU才能調(diào)用相應(yīng)的中斷服務(wù)程序來為其服務(wù)。為了標(biāo)記中斷源,人們給系統(tǒng)中的每個(gè)中斷源指定了一個(gè)唯一的編號(hào),稱為中斷類型號(hào)。CPU對中斷源的識(shí)別就是獲取當(dāng)前中斷源的中斷類型號(hào)。方法如下:第8章中斷與系統(tǒng)功能調(diào)用①可屏蔽硬件中斷:CPU在準(zhǔn)備響應(yīng)其中斷請求時(shí),會(huì)給它發(fā)一個(gè)中斷請求響應(yīng)信號(hào),硬件中斷源在收到這一信號(hào)后會(huì)將自己的類型號(hào)通過系統(tǒng)數(shù)據(jù)線發(fā)送給CPU。
②軟件中斷:在中斷指令I(lǐng)NTn中,參數(shù)n即為中斷類型號(hào)。
③除上面兩種情況外,其余中斷都是固定類型號(hào):這主要是內(nèi)部中斷,如除法錯(cuò)(類型0)、單步中斷(類型1)、INT3(類型3)、INTO(類型4)等。外部中斷中非屏蔽中斷也是固定類型號(hào)(類型2)。
8086/8088系統(tǒng)中中斷類型號(hào)范圍為0~FFH,即最多256個(gè)中斷源。在PC機(jī)中,這256個(gè)中斷類型號(hào)的分配情況如表8-1所示。第8章中斷與系統(tǒng)功能調(diào)用5.中斷系統(tǒng)
為了實(shí)現(xiàn)中斷的功能而設(shè)置的各種硬件和軟件,統(tǒng)稱為中斷系統(tǒng)。中斷系統(tǒng)的硬件部分應(yīng)能完成中斷信號(hào)的發(fā)出以及兩個(gè)或更多個(gè)中斷源同時(shí)提出中斷請求時(shí)的優(yōu)先權(quán)排隊(duì)(因多個(gè)硬件中斷源共用一條8086/8088可屏蔽中斷請求輸入引腳)。另外在CPU響應(yīng)中斷時(shí)還要能向CPU提供中斷源的中斷類型號(hào)。中斷系統(tǒng)的軟件部分要在內(nèi)存中準(zhǔn)備好各個(gè)中斷源所需的中斷服務(wù)程序,然后將中斷服務(wù)程序的地址填在指定位置的表格(中斷矢量表)中,以便CPU執(zhí)行時(shí)能找到它。
第8章中斷與系統(tǒng)功能調(diào)用6.CPU響應(yīng)中斷的條件
對于中斷,CPU并不總是會(huì)予以響應(yīng),這取決于中類型及標(biāo)志寄存器中IF(中斷允許標(biāo)志位)的狀態(tài)。具體為:
⑴內(nèi)部中斷
總是響應(yīng)。
⑵外部中斷
①非屏蔽中斷:CPU總是響應(yīng)。在硬件設(shè)計(jì)時(shí)只將那些如果CPU不作及時(shí)處理會(huì)產(chǎn)生十分嚴(yán)重后果的外部緊急事件才作為非屏蔽中斷源。
②可屏蔽中斷:絕大多數(shù)硬件中斷源都是可屏蔽中斷源。這種中斷源的中斷請求CPU既可以響應(yīng),也可以不響應(yīng),這取決于IF位,若該位為0(稱為關(guān)中斷),則CPU不會(huì)響應(yīng);若該位為1(稱為開中斷),則CPU將會(huì)響應(yīng)。IF位的狀態(tài)可由當(dāng)前運(yùn)行的程序來設(shè)置,故CPU是否響應(yīng)可屏蔽中斷請求取決于當(dāng)前運(yùn)行程序的要求。第8章中斷與系統(tǒng)功能調(diào)用8.1.2中斷矢量表與中斷響應(yīng)過程
1.中斷矢量表
CPU在響應(yīng)中斷時(shí),要執(zhí)行該中斷源對應(yīng)的中斷服務(wù)程序,可CPU如何知道這段程序在哪兒呢?答案是CPU通過查找中斷矢量表來得知。中斷服務(wù)程序的地址叫中斷矢量,將全部中斷矢量集中在一張表中,叫中斷矢量表。中斷矢量表的位置固定在內(nèi)存的最低1K字節(jié)中,即00000H~003FFH處。這張表中存放著所有中斷服務(wù)程序的入口地址,而且根據(jù)中斷類型號(hào)從小到大依次排列,每一個(gè)中斷服務(wù)程序的入口地址在表中占4個(gè)字節(jié):前2字節(jié)為偏移量,后2字節(jié)為段地址。因系統(tǒng)中共有256個(gè)中斷源,而每個(gè)中斷服務(wù)程序入口地址又占四個(gè)字節(jié),故中斷矢量表共占256*4=1K個(gè)字節(jié)。如圖8-2所示。第8章中斷與系統(tǒng)功能調(diào)用00000H0號(hào)中斷中斷服務(wù)程序的偏移量(低字節(jié))0號(hào)中斷中斷服務(wù)程序的偏移量(高字節(jié))00002H0號(hào)中斷中斷服務(wù)程序的段地址(低字節(jié))0號(hào)中斷中斷服務(wù)程序的段地址(高字節(jié))00004H1號(hào)中斷中斷服務(wù)程序的偏移量(低字節(jié))1號(hào)中斷中斷服務(wù)程序的偏移量(高字節(jié))00006H1號(hào)中斷中斷服務(wù)程序的段地址(低字節(jié))1號(hào)中斷中斷服務(wù)程序的段地址(高字節(jié)).........003FCH255號(hào)中斷中斷服務(wù)程序的偏移量(低字節(jié))003FDH255號(hào)中斷中斷服務(wù)程序的偏移量(高字節(jié))003FEH255號(hào)中斷中斷服務(wù)程序的段地址(低字節(jié))003FFH255號(hào)中斷中斷服務(wù)程序的段地址(高字節(jié))............XXXXXH0號(hào)中斷服務(wù)程序代碼...圖8-2中斷矢量表結(jié)構(gòu)第8章中斷與系統(tǒng)功能調(diào)用8.中斷響應(yīng)過程
CPU響應(yīng)中斷后,轉(zhuǎn)入中斷響應(yīng)周期,硬件自動(dòng)完成以下操作:
①取中斷類型號(hào)N
對于內(nèi)部中斷,因?yàn)樵谥噶钪幸押酥袛囝愋吞?hào)(如INTn)或中斷類型號(hào)固定(如除法錯(cuò)等),不需要這一步,對于來自硬件的非屏蔽中斷請求,因?yàn)槠渲袛囝愋吞?hào)固定,也不需要這一步。僅對于來自硬件的可屏蔽中斷請求需要這一步,此時(shí)CPU會(huì)通知中斷源將其中斷類型號(hào)放在數(shù)據(jù)線上,然后由CPU讀入。第8章中斷與系統(tǒng)功能調(diào)用②標(biāo)志寄存器入棧
③當(dāng)前CS入棧
④當(dāng)前IP入棧
⑤禁止外部中斷和單步中斷,即使IF=0,TF=0
⑥取中斷服務(wù)程序入口地址
從中斷矢量表中偏移量為4*N處取一個(gè)字的內(nèi)容送入IP,4*N+2處取一個(gè)字的內(nèi)容送入CS。
⑦轉(zhuǎn)入中斷服務(wù)程序中執(zhí)行。
當(dāng)中斷服務(wù)程序即將結(jié)束時(shí),在中斷服務(wù)程序最后要用IRET指令返回主程序。該指令內(nèi)含完成如下功能:依次從棧頂彈出三個(gè)字分別賦給IP、CS、FLAG。第8章中斷與系統(tǒng)功能調(diào)用中斷程序設(shè)計(jì)
(1)中斷服務(wù)程序編寫要注意的問題:①保護(hù)現(xiàn)場:由于中斷是打斷了主程序的執(zhí)行來運(yùn)行中斷服務(wù)程序,因此在中斷服務(wù)
程序中要注意保護(hù)主程序的現(xiàn)場,凡是中斷服務(wù)程序要用到的寄存器,事先都要入棧保存,最后在返回主程序前再予以恢復(fù)。但標(biāo)志寄存器不用保存,因?yàn)樵谡{(diào)用中斷服務(wù)程序前CPU已進(jìn)行了保存。②開放中斷:保護(hù)完現(xiàn)場后要及時(shí)開放中斷,以便CPU響應(yīng)更高級(jí)別的中斷。
以上兩項(xiàng)示意如下:
保護(hù)現(xiàn)場→STI→中斷服務(wù)程序主代碼→CLI→恢復(fù)現(xiàn)場→中斷返回
注:關(guān)中斷恢復(fù)現(xiàn)場后,在中斷返回前不必開放中斷,因?yàn)閳?zhí)行IRET指令后,會(huì)自動(dòng)恢復(fù)中斷前標(biāo)志寄存器的狀態(tài)。第8章中斷與系統(tǒng)功能調(diào)用③中斷的返回要用專用的IRET指令,而不能用RET。
④在中斷服務(wù)程序中,盡量避免調(diào)用DOS功能21H,因?yàn)樗豢芍厝搿?2)中斷服務(wù)程序的安裝問題:程序在運(yùn)行后,主模塊要完成中斷服務(wù)程序的安裝,即將中斷服務(wù)程序的地址設(shè)置到中斷矢量表中的相應(yīng)項(xiàng)目中。設(shè)置工作既可以用MOV指令直接寫中斷矢量表,也可以用相關(guān)DOS功能調(diào)用,最好是用后者,因?yàn)檫@樣更安全一些。與中斷矢量設(shè)置與讀取有關(guān)的DOS功能調(diào)用如下:第8章中斷與系統(tǒng)功能調(diào)用①設(shè)置中斷矢量:(25H號(hào)調(diào)用)
入口參數(shù):AH=25H,AL=中斷類型號(hào),DS:DX=中斷矢量
出口參數(shù):無
②讀取中斷矢量:(35H號(hào)調(diào)用)
入口參數(shù):AH=35H,AL=中斷類型號(hào)
出口參數(shù):ES:BX=中斷矢量
另外,在256個(gè)中斷類型號(hào)中,60H~67H是專為用戶保留的軟中斷,用戶自己開發(fā)的中斷一般應(yīng)使用這些號(hào)。
第8章中斷與系統(tǒng)功能調(diào)用【例8.1】中斷服務(wù)程序的安裝與調(diào)用
本例介紹了中斷服務(wù)程序的編寫、安裝(將中斷服務(wù)程序的入口地址設(shè)置到中斷矢表中),以及如何通過軟中斷指令調(diào)用中斷服務(wù)程序。為了突出重點(diǎn),本例中中斷服務(wù)程序代碼未駐留內(nèi)存。第8章中斷與系統(tǒng)功能調(diào)用CODE SEGMENT
ASSUMECS:CODE
INT_START:;以下是中斷服務(wù)程序代碼,它在屏幕上顯示10個(gè)*號(hào)
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,2 ;置光標(biāo)位置
MOV BH,0 ;頁號(hào)0
MOV DH,20 ;行號(hào)為20
MOV DL,25 ;列號(hào)為25
INT 10H
MOV AH,9 ;顯示字符
MOV AL,'*' ;顯示字符ASCII碼
MOV BH,0 ;設(shè)置頁號(hào)
MOV BL,7 ;字符屬性
MOV CX,10 ;重復(fù)次數(shù)
INT 10H
第8章中斷與系統(tǒng)功能調(diào)用 POP DX
POP CX
POP BX
POP AX
IRET ;中斷服務(wù)程序到此結(jié)束START:
MOV AH,25H ;安裝中斷服務(wù)程序的DOS調(diào)用
MOV AL,67H ;欲安裝的中斷服務(wù)類型號(hào)
PUSH CS
POP DS ;中斷服務(wù)程序的段地址(在CS內(nèi))賦給DS
MOV DX,OFFSET
INT_START ;中斷服務(wù)程序的偏移量賦給DX
INT 21H ;進(jìn)行中斷服務(wù)程序的設(shè)置調(diào)用
INT 67H ;調(diào)用67H號(hào)中斷
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START第8章中斷與系統(tǒng)功能調(diào)用【例8.2】駐留內(nèi)存的中斷服務(wù)程序
DOS的功能調(diào)用31H可實(shí)現(xiàn)終止并駐留內(nèi)存。
入口參數(shù):DX=駐留內(nèi)存節(jié)數(shù)
AL=退出碼(如果后續(xù)程序不用,可任意設(shè)置)
出口參數(shù):無
DX中要指出節(jié)數(shù)而不是字節(jié)數(shù),一節(jié)等于16個(gè)字節(jié)。設(shè)需要駐留部分長度為n個(gè)字節(jié),則計(jì)算公式為:
DX=(n÷16)+1+16
上式中加1是為了防止n不是16整數(shù)倍時(shí)將余數(shù)部分考慮上,再加16是因?yàn)镈OS在啟動(dòng)應(yīng)用程序時(shí)會(huì)在程序前加上一程序段前綴PSP(DOS管理程序用的數(shù)據(jù)結(jié)構(gòu)),它需要和程序一塊駐留內(nèi)存,PSP占256字節(jié),正好是16節(jié)。第8章中斷與系統(tǒng)功能調(diào)用以下程序運(yùn)行后將自己駐留部分的地址登記在中斷矢量表中5號(hào)中斷位置處,從而用自己的中斷服務(wù)程序替換了系統(tǒng)原先的5號(hào)中斷服務(wù)程序。5號(hào)中斷為屏幕打印中斷,當(dāng)按鍵盤上的PrintScreen鍵時(shí),會(huì)觸發(fā)這一中斷。舊的中斷服務(wù)程序(BIOS提供)的功能是將屏幕內(nèi)容拷貝到打印機(jī)上,而我們的程序?qū)⑵涮鎿Q后,按PrintScreen鍵時(shí),將不再打印屏幕,而是在屏幕上顯示一個(gè)星號(hào)。
第8章中斷與系統(tǒng)功能調(diào)用CODE SEGMENT
ASSUMECS:CODE
INT_START:
;以下是中斷服務(wù)程序代碼,它在屏幕上顯示一個(gè)*號(hào)
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,0EH ;顯示字符
MOV AL,'*‘ ;顯示字符ASCII碼
MOV BL,0 ;字符屬性
INT 10H
POP DX
POP CX
POP BX
POP AX
IRET ;中斷服務(wù)程序到此結(jié)束第8章中斷與系統(tǒng)功能調(diào)用START:PUSH CS
POP DS ;中斷服務(wù)程序的段地址(在CS內(nèi))賦給DS
MOV DX,OFFSETINT_START;中斷服務(wù)程序的偏移量賦給DX
MOV AH,25H
MOV AL,05H
INT 21H ;調(diào)用中斷服務(wù)程序設(shè)置功能
MOV DX,START-INT_START ;START-INT_START為需要駐留部分長度
MOV CL,4
SHR DX,CL ;右移4位,即除以16
ADD DX,11H ;加上17
MOV AH,31H
INT 21H ;終止并駐留
CODEENDS
END START返回本章首頁返回本節(jié)首頁第8章中斷與系統(tǒng)功能調(diào)用8.2DOS中斷與系統(tǒng)功能調(diào)用8.2.1DOS中斷8.2.2DOS系統(tǒng)功能調(diào)用8.2.3磁盤文件管理返回本章首頁第8章中斷與系統(tǒng)功能調(diào)用8.2.1DOS中斷DOS除了給用戶提供了命令行服務(wù)以外,還為匯編語言程序員提供了大量的子程序,這些子程序包含了從基本輸入輸出到內(nèi)存管理、磁盤讀寫、文件系統(tǒng)等各個(gè)方面,使用這些子程序,使得匯編語言程序員不必搞清大量的設(shè)備接口、數(shù)據(jù)結(jié)構(gòu)等細(xì)節(jié),即可完成所需功能,從而極大簡化了匯編語言的編程。由于DOS提供的這些子程序被看作是DOS系統(tǒng)功能的一部分,因而人們把對這些子程序的調(diào)用又稱為DOS功能調(diào)用。每個(gè)匯編語言程序員必須熟悉一些最常用的DOS功能調(diào)用,否則很難編寫出有實(shí)用價(jià)值的程序。第8章中斷與系統(tǒng)功能調(diào)用DOS除了給用戶提供了命令行服務(wù)以外,還為匯編語言程序員提供了大量的子程序,這些子程序包含了從基本輸入輸出到內(nèi)存管理、磁盤讀寫、文件系統(tǒng)等各個(gè)方面,使用這些子程序,使得匯編語言程序員不必搞清大量的設(shè)備接口、數(shù)據(jù)結(jié)構(gòu)等細(xì)節(jié),即可完成所需功能,從而極大簡化了匯編語言的編程。由于DOS提供的這些子程序被看作是DOS系統(tǒng)功能的一部分,因而人們把對這些子程序的調(diào)用又稱為DOS功能調(diào)用。每個(gè)匯編語言程序員必須熟悉一些最常用的DOS功能調(diào)用,否則很難編寫出有實(shí)用價(jià)值的程序。
DOS提供的這些子程序位于DOS的基本系統(tǒng)文件和中,隨著DOS的加載而進(jìn)入內(nèi)存,即只要能啟動(dòng)DOS就可以使用。DOS的這些子程序是以中斷的方式向系統(tǒng)及應(yīng)用程序提供服務(wù)的,故必須用內(nèi)中斷指令I(lǐng)NT進(jìn)行調(diào)用,而不是用傳統(tǒng)的CALL指令。
DOS提供的中斷服務(wù)如表8-2所示:第8章中斷與系統(tǒng)功能調(diào)用表8-2DOS中斷功能表中斷號(hào)(十六進(jìn)制)功能20系統(tǒng)終止返回21系統(tǒng)功能調(diào)用22程序結(jié)束處理23CTRL—C處理25嚴(yán)重錯(cuò)誤處理25絕對磁盤讀26絕對磁盤寫27程序結(jié)束駐留28—2FDOS保留第8章中斷與系統(tǒng)功能調(diào)用在DOS發(fā)展過程中,中斷號(hào)的分配顯得有些混亂,最初的時(shí)候DOS提供的功能很少,而且也為了與以前流行的操作系統(tǒng)CP/M在中斷號(hào)方面保持兼容,所以占用了上表所示的中斷號(hào)。但后來隨著DOS的發(fā)展,所提供的功能(子程序)越來越多,不可能每一個(gè)子程序都占用一個(gè)中斷號(hào),于是想出了讓它們共用一個(gè)中斷號(hào),即21H號(hào)的辦法,進(jìn)入這一個(gè)中斷后,DOS再根據(jù)用戶程序中入口參數(shù)的設(shè)置來確定用戶程序到底想調(diào)用哪一個(gè)子功能。這樣,實(shí)際上DOS所有的功能都可通過21H中斷調(diào)用來實(shí)現(xiàn)。早期版本中獨(dú)占一個(gè)中斷號(hào)的舊功能為兼容緣故并沒有被撤銷,而是保留了下來,這樣就形成了有些功能既可以通過調(diào)用21H號(hào)中斷來實(shí)現(xiàn),又可以通過調(diào)用別的中斷實(shí)現(xiàn),如:終止程序功能,調(diào)用20H號(hào)中斷與調(diào)用21H號(hào)中斷之00H號(hào)子功能,效果完全相同。第8章中斷與系統(tǒng)功能調(diào)用一般情況下,將調(diào)用21H號(hào)以外的DOS中斷,稱為DOS中斷調(diào)用。而將調(diào)用21H號(hào)中斷的各個(gè)子功能,稱為DOS功能調(diào)用。事實(shí)上DOS功能調(diào)用也是一個(gè)DOS中斷調(diào)用,并且有時(shí)也不太區(qū)分二者的差別。返回本章首頁返回本節(jié)首頁進(jìn)入下一節(jié)第8章中斷與系統(tǒng)功能調(diào)用8.2.2DOS系統(tǒng)功能調(diào)用本節(jié)中介紹DOS功能調(diào)用的方法及常用的DOSI/O功能調(diào)用。DOS最核心的功能調(diào)用文件操作功能調(diào)用將在下節(jié)中介紹。
1.DOS功能調(diào)用的方法
調(diào)用DOS功能調(diào)用需要進(jìn)行如下三項(xiàng)工作:
①調(diào)置入口參數(shù),如果所調(diào)用的子程序不需參數(shù),則可省略此步。
②欲調(diào)用的子程序編號(hào)→AH。
③發(fā)中斷調(diào)用指令I(lǐng)NT21H。第8章中斷與系統(tǒng)功能調(diào)用2.DOS基本I/O功能調(diào)用
(1)鍵盤輸入(1號(hào)調(diào)用)功能:此調(diào)用掃描鍵盤,若有鍵按下,先檢查是否是Ctrl-Break鍵,若是,則退出命令執(zhí)行并調(diào)用DOS的Ctrl-Break處理程序;若否,則將字符ASCII碼設(shè)置到AL中,同時(shí)在屏幕上顯示這個(gè)字符,然后返回。若無鍵按下,該調(diào)用等待直到有鍵按下為止。調(diào)用示例:
MOV AH,1
INT 21H入口參數(shù):無
出口參數(shù):所讀取的字符ASCII碼在AL內(nèi)。第8章中斷與系統(tǒng)功能調(diào)用(2)鍵盤輸入(8號(hào)調(diào)用)
同1號(hào)類似,但是不在屏幕上顯示輸入的字符,在讀取密碼時(shí)常用本功能。調(diào)用示例: MOV DL,’A’
MOV AH,2
INT 21H(3)鍵盤輸入(7號(hào)調(diào)用)
同8號(hào)類似,并且不特殊檢查Ctrl-Break鍵(當(dāng)作普通字符)。(4)在屏幕上顯示一個(gè)字符(2號(hào)) 入口參數(shù):DL=待顯示字符的ASCII碼
出口參數(shù):無功能:將字符顯示在屏幕上。但如果字符是控制符,則實(shí)際執(zhí)行相應(yīng)的功能,如:在屏幕上顯示一個(gè)換行符(0AH),實(shí)際上將光標(biāo)轉(zhuǎn)到下一行上去。第8章中斷與系統(tǒng)功能調(diào)用(5)顯示或讀取字符(6號(hào)調(diào)用)
此功能調(diào)用既可顯示字符也可接收字符,這取決于入口參數(shù)中DL的設(shè)置,若DL=FFH,表示從鍵盤讀取字符;若DL≠FFH,表示顯示字符。具體為:①顯示字符:入口參數(shù):DL=待顯示字符的ASCII碼(但不能為FFH)
出口參數(shù):無功能:將字符顯示在屏幕上。但如果字符是控制符,則實(shí)際執(zhí)行相應(yīng)的功能。調(diào)用示例:
MOV DL,’$’
MOV AH,6
INT 21H第8章中斷與系統(tǒng)功能調(diào)用②讀取字符:入口參數(shù):DL=FFH
出口參數(shù):若讀到字符,ZF=0,AL=鍵入字符的ASCII碼。若未讀到字符,ZF=1。功能:從鍵盤讀取字符,但不等待按鍵,即不論有無鍵按下都立即返回,并且也不特殊檢查Ctrl-Break鍵。當(dāng)要求用戶必須立即做出反應(yīng)時(shí)可用此調(diào)用讀取鍵盤,如在游戲程序中。調(diào)用示例:在本示例中,通過一個(gè)循環(huán)來實(shí)現(xiàn)等待讀取一個(gè)字符。 L1: MOV AH,6
MOV DL,0FFH
INT 21H
JZ L1第8章中斷與系統(tǒng)功能調(diào)用(6)打印一個(gè)字符(5號(hào))入口參數(shù):DL=待打印字符的ASCII碼
出口參數(shù):無功能:在打印機(jī)上打印字符,若打印機(jī)出現(xiàn)錯(cuò)誤,則在屏幕上顯示相應(yīng)錯(cuò)誤信息。(7)字符串顯示(9號(hào))入口參數(shù):DS:DX指向待顯示字符串,且字符串必須以“$”作為結(jié)束符出口參數(shù):無功能:結(jié)束符之前的字符都被顯示在屏幕上。第8章中斷與系統(tǒng)功能調(diào)用調(diào)用示例:
DATA SEGMENT
BUF DB ‘THISIS ATEST !$’
DATA ENDS
CODE SEGMENT
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSETBUF
MOV AH,9
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START第8章中斷與系統(tǒng)功能調(diào)用(8)字符串輸入(10號(hào))入口參數(shù):DS:DX指向輸入緩沖區(qū)。輸入緩沖區(qū)必須由用戶在調(diào)用前準(zhǔn)備好,且具有如下格式:
第一個(gè)字節(jié)必須放一非0數(shù)據(jù),該數(shù)值指明準(zhǔn)備接收的最大字符數(shù),這個(gè)字符數(shù)包括用戶在結(jié)束時(shí)必須輸入的回車符,如果鍵入的字符數(shù)達(dá)到了此數(shù)減一,那么系統(tǒng)將不再接收字符(按鍵時(shí)會(huì)發(fā)出“嘟嘟”聲,而且光標(biāo)不再向右移動(dòng)),直到用戶按回車為止。
第二個(gè)字節(jié)保留,由DOS在功能調(diào)用結(jié)束后填入實(shí)際輸入的字符個(gè)數(shù)(這個(gè)數(shù)并不包括最后的回車符)。
用戶輸入的字符串從第三個(gè)單元開始存放。
出口參數(shù):用戶實(shí)際輸入字符個(gè)數(shù)在緩沖區(qū)第二個(gè)單元中。第8章中斷與系統(tǒng)功能調(diào)用調(diào)用示例:
DATA SEGMENT
BUF DB 8 ;指明最大字符數(shù)
DB ? ;保留,供DOS填入實(shí)際字符數(shù)
DB 8DUP(0) ;用戶輸入的字符存放區(qū)
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSETBUF
MOV AH,10
INT 21H
…
… ;其它操作
MOV AH,4CH
INT 21H
CODE ENDS
END START第8章中斷與系統(tǒng)功能調(diào)用【例8.3】字符串的輸入輸出
編一程序先提示用戶輸入一個(gè)字符串,然后讀取用戶的輸入,并將用戶輸入的數(shù)據(jù)在下行輸出。
程序如下:
DATA SEGMENT
MESSAGEDB “PLEASEINPUTASTRING:$” ;定義輸入提示
BUFDB 255,?,255DUP(0)
;用戶輸入緩沖區(qū),可接收255個(gè)字符
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSETMESSAGE
MOV AH,9
INT 21H ;顯示輸入提示信息第8章中斷與系統(tǒng)功能調(diào)用 MOV DX,OFFSET BUF
MOV AH,10
INT 21H ;接收用戶輸入
MOV AH,2
MOV DL,0AH ;0AH為換行符ASCII碼
INT 21H ;屏幕換行
MOV BL,BUF+1 ;用戶實(shí)際輸入字符數(shù)→BL
MOV BH,0 ;使BX=用戶實(shí)際輸入字符數(shù)
MOV BYTE PTR BUF+2[BX],‘$‘
;在字符結(jié)束處放置一個(gè)“$”
MOV DX,OFFSET BUF+2 ;用戶實(shí)際輸入字符起始處→DX
MOV AH,9
INT 21H ;顯示用戶輸入的字符
MOV AH,4CH
INT 21H
CODE ENDS
END START返回本節(jié)首頁返回本章首頁進(jìn)入下一節(jié)第8章中斷與系統(tǒng)功能調(diào)用8.2.3磁盤文件管理磁盤文件的管理是DOS的主要功能之一,為此DOS提供了二組相關(guān)的功能調(diào)用,一組是版時(shí)提出的,使用文件控制塊FCB管理文件,這種辦法相當(dāng)麻煩而且功能又弱(如不支持目錄結(jié)構(gòu)),因而早已被淘汰;另一組是版時(shí)提出的,使用文件句柄來管理文件,我們主要介紹這組功能調(diào)用。第8章中斷與系統(tǒng)功能調(diào)用1.文件名
要訪問一個(gè)文件,必須先指定文件名。DOS要求用ASCIIZ串來描述文件名,即一個(gè)ASCII碼字符串,后面跟一個(gè)全0字節(jié)為結(jié)束符。
例如:
FILENAMEDB“C:\DOS\WWW.TXT”,0
文件名中可以包含絕對路徑或相對路徑,但總長度不能多于63個(gè)字符。
第8章中斷與系統(tǒng)功能調(diào)用2.文件屬性
很多操作都涉及文件屬性,文件屬性用一個(gè)字節(jié)描述,各位含義如下:D7 D6D5D4D3D2D1D000歸檔子目錄卷標(biāo)系統(tǒng)隱含只讀第8章中斷與系統(tǒng)功能調(diào)用常用文件屬性值為:
00一普通文件。
01一只讀文件,該文件不能為寫而打開。
02一隱含文件,用DIR查不到該文件。
03一系統(tǒng)文件,用DIR查不到該文件。
04一軟盤的卷標(biāo)號(hào)。
10一子目錄。
20一已寫入并關(guān)閉了文件(硬盤用)。
一個(gè)文件可以同時(shí)具有幾種屬性,也就是說可以把字節(jié)中的幾位同時(shí)置1,如和文件既是只讀文件,又是隱含文件和系統(tǒng)文件。第8章中斷與系統(tǒng)功能調(diào)用3.錯(cuò)誤返回碼
文件操作的功能調(diào)用返回時(shí),以標(biāo)志寄存器的CF位指示調(diào)用是否成功,若調(diào)用失敗,CF=1,AX內(nèi)為錯(cuò)誤返回碼,這些錯(cuò)誤返回碼都取自一個(gè)統(tǒng)一的信息表,如表8-3所示。表8-3文件操作的錯(cuò)誤返回碼錯(cuò)誤返回代碼錯(cuò)誤返回代碼010203040506070809非法功能號(hào)文件未找到路徑未找到同時(shí)打開的文件太多拒絕存取非法文件代號(hào)內(nèi)存控制塊被破壞內(nèi)存不夠非法存儲(chǔ)塊地址101112131415161718非法環(huán)境非法格式非法存取代碼非法數(shù)據(jù)(未用)非法指定設(shè)備試圖刪除當(dāng)前目錄設(shè)備不一致已沒有文件第8章中斷與系統(tǒng)功能調(diào)用4.常用的文件管理功能調(diào)用
(1)DOS的文件管理功能
DOS提供的文件管理功能非常豐富,如表8-4所示。AH功能調(diào)用參數(shù)返回參數(shù)3CH建文件注:若同名的文件已存在,則覆蓋DS=ASCIIZ串的段地址DX=ASCIIZ串的偏移地址CX=文件屬性CF=0操作成功AX=文件代號(hào)CF=l操作出錯(cuò)AX=錯(cuò)誤代碼(可為3、4、5)表8-4DOS的基本文件管理功能調(diào)用
第8章中斷與系統(tǒng)功能調(diào)用AH功能調(diào)用參數(shù)返回參數(shù)3DH打開文件DS=ASCIIZ串的段地址DX=ASCIIZ串的偏移地址AL=存取代碼0=為讀而打開文件l=為寫而打開文件2=為讀和寫打開文件CF=0操作成功AX=文件代號(hào)CF=l操作出錯(cuò)AX=錯(cuò)誤代碼(可為3、4、5、12)3EH關(guān)閉文件說明:文件用完必須關(guān)閉,以便將緩沖區(qū)中數(shù)據(jù)寫入磁盤,同時(shí)釋放文件句柄BX=文件代號(hào)CF=0操作成功CF=1出現(xiàn)錯(cuò)誤AX=錯(cuò)誤代碼(6)第8章中斷與系統(tǒng)功能調(diào)用AH功能調(diào)用參數(shù)返回參數(shù)3FH讀文件說明:將指定文件內(nèi)容從磁盤讀入內(nèi)存緩沖區(qū)DS=數(shù)據(jù)緩沖區(qū)段地址DX=數(shù)據(jù)緩沖區(qū)偏移地址BX=文件代號(hào)CX=讀取的字節(jié)數(shù)CF=0讀成功AX=實(shí)際讀入的字節(jié)數(shù)(此數(shù)不一定等于CX中所要求的字節(jié)數(shù),如未讀到所要求的數(shù)據(jù)文件已結(jié)束等)CF=l讀出錯(cuò)AX=錯(cuò)誤代碼(5、6)40H寫文件說明:將內(nèi)存緩沖區(qū)中的數(shù)據(jù)寫到磁盤文件中DS=數(shù)據(jù)緩沖區(qū)的段地址DX=數(shù)據(jù)緩沖區(qū)的偏移地址BX=文件代號(hào)CX=寫入的字節(jié)數(shù)CF=0操作成功AX=實(shí)際寫入的字節(jié)數(shù)(如遇磁盤空間不夠,這個(gè)數(shù)將小于CX中指定的字節(jié)數(shù))CF=1出現(xiàn)錯(cuò)誤AX=錯(cuò)誤代碼(5、6)第8章中斷與系統(tǒng)功能調(diào)用AH功能調(diào)用參數(shù)返回參數(shù)41H刪除文件DS=ASCIIZ串的段地址DX=ASCIIZ串的偏移地址CF=0操作成功CF=1出現(xiàn)錯(cuò)誤AX=錯(cuò)誤代碼(2、5)42H移動(dòng)文件指針CX=新指針位置的偏移地址(高位)DX=新指針位置的偏移地址(低位)AL=方式碼0=從文件頭開始1=從指針當(dāng)前位置開始2=從文件尾部開始BX=文件代號(hào)CF=0操作成功DX:AX=新指針位置CF=l操作失敗AX=錯(cuò)誤代碼(01、06)第8章中斷與系統(tǒng)功能調(diào)用AH功能調(diào)用參數(shù)返回參數(shù)43H檢驗(yàn)或改變文件屬性說明:讀取或修改文件屬性DS=ASCIIZ串的段地址DX=ASCIIZ串的偏移地址AL=0讀文件屬性AL=1置文件屬性,此時(shí)須再置:CX=新屬性CF=0操作成功AL=0CX=屬性CF=l操作失敗AX=錯(cuò)誤碼(1、2、3、5)第8章中斷與系統(tǒng)功能調(diào)用(2)使用方法
使用文件代碼法的基本過程是:在讀寫文件前,必須先打開或創(chuàng)建文件,成功后,DOS返回一個(gè)文件代號(hào)(filehandle,或稱文件句柄),這個(gè)文件代號(hào)是一個(gè)16位二進(jìn)制數(shù),以后對該文件進(jìn)行讀寫操作時(shí),就用這個(gè)文件代號(hào)去代表相應(yīng)的文件。當(dāng)讀寫完了后,最后必須關(guān)閉文件,否則DOS暫存在其內(nèi)部文件緩沖區(qū)的信息沒有真正寫到磁盤上。
另外,操作時(shí)還必須注意文件屬性,如果以只讀屬性打開,則不能向其寫;如果以只寫屬性打開,則不能對其讀。同時(shí)打開的文件不能太多,因?yàn)镈OS可能沒有足夠空間為每個(gè)打開的文件準(zhǔn)備緩沖區(qū),這個(gè)數(shù)據(jù)取決于文件中files=nnn一行的設(shè)置數(shù)。缺省情況下最多可同時(shí)打開8個(gè)文件。第8章中斷與系統(tǒng)功能調(diào)用(3)關(guān)于文件指針的說明
利用文件代號(hào)存取文件是以字節(jié)為存取單位的,一個(gè)文件被看作由許多字節(jié)組成,盡管每次讀寫的字節(jié)數(shù)可任意指定,但一般還是為輸入/輸出緩沖區(qū)的大小所限制,所以一個(gè)比較大的文件總是要分幾次讀寫。對每個(gè)打開的文件,DOS都為其保存了一個(gè)讀寫指針(read/writepointer),它指示文件的操作位置,每次讀寫后會(huì)自動(dòng)調(diào)整并指向新位置,但有時(shí)我們想從文件的中間開始讀寫而不是從頭讀寫,或者是不作連續(xù)讀寫,這就需要移動(dòng)這個(gè)指針。為此,DOS提供了移動(dòng)文件指針功能調(diào)用(42H號(hào)),該功能調(diào)用具體情況如下:
第8章中斷與系統(tǒng)功能調(diào)用①入口參數(shù)要求在BX中指定文件代號(hào),由CX和DX指定一個(gè)雙字長的偏移值,低位字在DX中,高位字在CX中,這個(gè)偏移值是一個(gè)帶符號(hào)的整數(shù),它可以是正數(shù),也可以是負(fù)數(shù);
②由AL中的代碼確定改變指針的三種方式。每種方式的含義如下:絕對移動(dòng)方式(AL=0):
偏移值從文件首開始計(jì)算。例如偏移值是582,則讀寫指針指向文件的第582字節(jié)。為了使指針指向文件首,可以在CX,DX,AL中都送入0,那么隨后的讀寫就從文件首開始。相對移動(dòng)方式(AL=1):
當(dāng)前的指針值加上偏移值作為新的指針值,也就是說,偏移值指出了從當(dāng)前的讀寫位置起移動(dòng)的字節(jié)數(shù)。根據(jù)偏移值的正負(fù)可正向或反向移動(dòng)指針。絕對倒移方式(AL=2):
新的指針位置通過把偏移值和文件尾的位置相加而確定。如果文件的總長度是32字節(jié),那么在AL中送入2,DX中送入-32,CX中送入OFFFFH(符號(hào)擴(kuò)展到高位字),則讀寫指針指向文件的第一個(gè)字節(jié)。如果CX和DX為0,AL為2,則指針將指向文件尾,此時(shí)指針的值即是文件長度。第8章中斷與系統(tǒng)功能調(diào)用移動(dòng)文件指針功能可能出現(xiàn)的錯(cuò)誤碼是01和06,錯(cuò)誤碼01說明AL中的方式值是不合法的,錯(cuò)誤碼06說明BX中的文件代號(hào)不合法。如果指針移動(dòng)成功,AX和DX將是移動(dòng)后的指針值,AX中是低位字,DX是高位字(調(diào)用之前,DX是偏移值的低位字,CX是偏移值的高位字)。方式1和偏移值0能找出指針的當(dāng)前值。方式2和偏移值0能找出文件的長度。如果要在一個(gè)已存在的文件后面添加記錄,則在寫之前把指針指向文件尾:關(guān)于磁盤文件讀寫操作的具體實(shí)例本章實(shí)訓(xùn)四。返回本節(jié)首頁返回本章首頁第8章中斷與系統(tǒng)功能調(diào)用8.3BIOS中斷功能調(diào)用8.3.1BIOS中斷8.3.2常用BIOS功能調(diào)用舉例8.3.3圖形顯示程序設(shè)計(jì)第8章中斷與系統(tǒng)功能調(diào)用8.3.1BIOS中斷
PC機(jī)1M內(nèi)存空間中最高端(最大地址空間處)是系統(tǒng)ROM區(qū),安裝在此區(qū)中的ROM內(nèi)固化了ROMBIOS(基本輸入輸出系統(tǒng),BasicInput/OutputSystem)代碼,這段代碼除完成開機(jī)時(shí)加電自檢、對主要I/O接口初始化、引導(dǎo)裝入DOS等功能外,還提供了大量的例程(子程序)供匯編語言程序員調(diào)用。通過調(diào)用BIOS提供的例程,匯編語言程序員在不必了解復(fù)雜的硬件接口細(xì)節(jié)的情況下,也可以輕松完成對硬件的控制。并且,還可使程序簡潔清晰,因?yàn)橹恍鑾讞l指令便可完成對BIOS例程的調(diào)用,而直接對硬件編程實(shí)現(xiàn)相同功能則需要大段代碼。
和DOS服務(wù)例程一樣,ROMBIOS服務(wù)例程也是以中斷服務(wù)程序的形式提供的,ROMBIOS在其初始化期間將所提供服務(wù)例程的地址登記在中斷矢量表中,而應(yīng)用程序想對其調(diào)用時(shí)發(fā)“intn”指令即可。因?yàn)橐灾袛喾绞焦ぷ鳎蕦OMBIOS的調(diào)用也稱為BIOS中斷調(diào)用。
常用的ROMBIOS中斷情況如表8-5所示.第8章中斷與系統(tǒng)功能調(diào)用表8-5常用的BIOS中斷中斷號(hào)功能中斷號(hào)功能10H顯示器15HAT擴(kuò)充服務(wù)11H確認(rèn)設(shè)備調(diào)用16H鍵盤服務(wù)12H取內(nèi)存容量17H打印服務(wù)13H磁盤I/O1AH時(shí)間/日期14H串行口通訊第8章中斷與系統(tǒng)功能調(diào)用對于硬件的訪問控制,一般來說有三種方法可以考慮:調(diào)用DOS功能調(diào)用,調(diào)用BIOS功能調(diào)用或直接訪問硬件。這三種方法中DOS功能調(diào)用層次最高,實(shí)際上用戶對DOS的功能調(diào)用,DOS經(jīng)過處理后再轉(zhuǎn)化為對BIOS的功能調(diào)用,最終由BIOS完成對硬件的訪問。若需要的操作有相應(yīng)的DOS功能調(diào)用,則盡量通過DOS功能調(diào)用實(shí)現(xiàn),因?yàn)楦邔诱{(diào)用需要了解的細(xì)節(jié)少,往往參數(shù)也少,而且兼容性好。即只要能啟動(dòng)DOS,這項(xiàng)服務(wù)(功能調(diào)用)就保證能用。若通過BIOS調(diào)用實(shí)現(xiàn),則不同機(jī)器上BIOS代碼提供的服務(wù)可能不同,所以兼容性要差些。第8章中斷與系統(tǒng)功能調(diào)用BIOS調(diào)用在層次上低于DOS功能調(diào)用而高于直接訪問硬件。因它比DOS更接近硬件,故硬件控制功能更強(qiáng),而且執(zhí)行速度更快。但是需要了解的硬細(xì)節(jié)也更多,而且兼容性也比DOS調(diào)用差。當(dāng)需用到DOS功能調(diào)用沒法實(shí)現(xiàn)的功時(shí),或需要追求較高的執(zhí)行速度時(shí),需要使用BIOS功能調(diào)用。例如:DOS顯示功能調(diào)用非常簡單,而用執(zhí)行速度也慢。而BIOS則提供了相當(dāng)豐富的顯示功能調(diào)用,而且速度也快。故在顯示控制方面一般都用BIOS功能調(diào)用。再如:如果因加密需要要將磁盤按非標(biāo)準(zhǔn)格式格式化,DOS無此功能調(diào)用,而BIOS功能調(diào)用卻允許這樣做,因而也必須通它完成。第8章中斷與系統(tǒng)功能調(diào)用直接訪問硬件層次最低,可以控制實(shí)現(xiàn)硬件的全部功能,但是需要了解的硬件細(xì)節(jié)也最多,而且不同機(jī)器間若被訪問硬件有差異,可能程序不能通用。當(dāng)需要的功能BIOS中斷調(diào)用也未提供時(shí),只能直接訪問硬件實(shí)現(xiàn)。例如:要想編一播放音樂的程序,只能直接訪問硬件實(shí)現(xiàn)。返回本節(jié)首頁返回本章首頁返回上一節(jié)第8章中斷與系統(tǒng)功能調(diào)用8.3.2常用的BIOS功能調(diào)用舉例BIOS功能調(diào)用比DOS功能調(diào)用在控制底層方面功能更強(qiáng)大,能完成許多DOS功能調(diào)用無法完成的功能,下面對其常用功能作簡單介紹。第8章中斷與系統(tǒng)功能調(diào)用1.磁盤操作
BIOS中無磁盤文件的概念(文件是操作系統(tǒng)中才有的概念),它展示給用戶的是磁盤的磁道和扇區(qū)。它的13H號(hào)功能調(diào)用提供了詳盡的控制磁盤操作的功能,如可以按道格式化磁盤,而且格式化磁道時(shí)可以自由設(shè)定每道扇區(qū)數(shù)、每扇區(qū)的字節(jié)數(shù)。同時(shí),每面格式化的磁道數(shù)也可以自由設(shè)定。這樣,加密軟件就可以調(diào)用這些功能格式化出非DOS標(biāo)準(zhǔn)的磁盤結(jié)構(gòu),在這樣的磁盤中記錄的數(shù)據(jù)在DOS下不能讀取,當(dāng)然也無法拷貝,從而達(dá)到防拷貝的目的。并且,這并不妨礙加密者自己使用磁盤,因?yàn)樗来疟P的結(jié)構(gòu),它可以通過設(shè)置適當(dāng)?shù)膮?shù)后調(diào)用BIOS的扇區(qū)讀寫功能,來讀寫磁盤中的數(shù)據(jù)。
13H號(hào)功能調(diào)用內(nèi)含的子功能如表8-6所示:第8章中斷與系統(tǒng)功能調(diào)用表8-6BIOS13H號(hào)功能調(diào)用的子功能AH功能AH功能00復(fù)位磁盤0B寫長扇區(qū)01取磁盤狀態(tài)0C查找柱面(磁道)02讀扇區(qū)0D備用磁盤復(fù)位03寫扇區(qū)10檢測驅(qū)動(dòng)器是否準(zhǔn)備好04檢測扇區(qū)11復(fù)校驅(qū)動(dòng)器05格式化磁道14控制器內(nèi)部診斷08取當(dāng)前驅(qū)動(dòng)器參數(shù)15取磁盤類型09初始化雙驅(qū)動(dòng)器16改變磁盤狀態(tài)0A讀長扇區(qū)17置磁盤類型第8章中斷與系統(tǒng)功能調(diào)用下面介紹13H號(hào)功能調(diào)用中最常用的扇區(qū)讀寫功能調(diào)用。入口參數(shù):
AH=02,指明讀扇區(qū)功能調(diào)用。
AL要讀扇區(qū)數(shù)。
DL驅(qū)動(dòng)器代號(hào),0和1代表軟盤,80H和81H代表硬盤。
DH所讀磁盤磁頭號(hào),以軟盤來說,只能是0和1。
CH10位磁道號(hào)的低8位,CL寄存器的第6、7位存放其高2位(對于軟盤,范圍0—79)。
CL低5位為要讀的第一個(gè)扇區(qū)的扇區(qū)號(hào)(注意扇區(qū)號(hào)從1開始而非從0開始。對軟盤,范圍1—15)。高2位表示磁道柱面號(hào)的高2位。
ES:BX指出存放從磁盤所讀數(shù)據(jù)的內(nèi)存地址。①13H號(hào)功能調(diào)用02H號(hào)子功能:讀扇區(qū)出口參數(shù):讀出數(shù)據(jù)放在ES:BX所指的內(nèi)存區(qū)域中。若產(chǎn)生錯(cuò)誤,CF置1,AH內(nèi)為錯(cuò)誤代碼。第8章中斷與系統(tǒng)功能調(diào)用②13H號(hào)功能調(diào)用03H號(hào)子功能:寫扇區(qū)入口參數(shù):AH=03,指明寫扇區(qū)功能調(diào)用AL要寫扇區(qū)數(shù),DL驅(qū)動(dòng)器代號(hào),0和1代表軟盤,80H和81H代表硬盤DH所讀磁盤磁頭號(hào),以軟盤來說,只能是0和1。CH10位磁道號(hào)的低8位,CL寄存器的第6、7位存放其高2位(對于軟盤,范圍0—79)。CL低5位為要寫的第一個(gè)扇區(qū)的扇區(qū)號(hào)(注意扇區(qū)號(hào)從1開始而非從0開始。對軟盤,范圍1—15)。高2位表示磁道柱面號(hào)的高2位。ES:BX指出寫往磁盤所數(shù)據(jù)的內(nèi)存地址。出口參數(shù):除非產(chǎn)生錯(cuò)誤,信息都寫入磁盤。若產(chǎn)生錯(cuò)誤,CF置1,AH內(nèi)為錯(cuò)誤代碼。第8章中斷與系統(tǒng)功能調(diào)用【例8.4】本例中讀取A驅(qū)0面10道1扇區(qū)中的數(shù)據(jù)到內(nèi)存buf處,然將這此數(shù)據(jù)逐個(gè)字節(jié)加1,最后再寫回原處。DATA SEGMENTERROR_MESSAGE DB 0AH,'ERROR!','$' ;出錯(cuò)時(shí)的提示OK_MESSAGE DB 0AH,'OK!','$' ;成功后的提示BUF DB 512DUP(0) ;磁盤數(shù)據(jù)緩沖區(qū)DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA第8章中斷與系統(tǒng)功能調(diào)用START:
MOV AX,DATA
MOV DS,AX
MOV AH,2 ;讀扇區(qū)
MOV AL,1 ;讀1個(gè)扇區(qū)
MOV DL,0 ;讀A驅(qū)
MOV DH,0 ;讀0面
MOV CH,10 ;讀第10磁道
MOV CL,1 ;讀第1扇區(qū)
PUSH DS
POP ES
MOV BX,OFFSET BUF ;讀出數(shù)據(jù)放到BUF處
INT 13H ;讀調(diào)用
JC ERROR ;出錯(cuò),轉(zhuǎn)ERROR處
MOV CX,512
MOV SI,OFFSET BUF第8章中斷與系統(tǒng)功能調(diào)用L1: INC BYTE PTR [SI]
INC SI
LOOP L1 ;這個(gè)循環(huán)將BUF內(nèi)的512個(gè)字節(jié)各自加1
MOV AH,3 ;寫扇區(qū)
MOV AL,1
MOV DL,0
MOV DH,0
MOV CH,10
MOV CL,1
PUSH DS
POP ES
MOV BX,OFFSET BUF
INT 13H ;寫調(diào)用,寫的位置同上面讀的位置
JC ERROR
MOV AH,9 ;若都成功,顯示成功提示
MOV DX,OFFSET OK_MESSAGE
INT 21H
JMP END1第8章中斷與系統(tǒng)功能調(diào)用ERROR: ;失敗時(shí)顯示提示
MOV DX,OFFSETERROR_MESSAGE
MOV AH,9
INT 21H
END1:
MOV AH,4CH
INT 21H
CODE ENDS
END START第8章中斷與系統(tǒng)功能調(diào)用2.顯示功能
(1)BIOS的顯示功能
DOS的顯示功能相當(dāng)簡單,而BIOS的顯示功能則非常豐富。如DOS功能調(diào)用中不能顯示圖形,即使顯示字符,也不能控制顯示位置,不能設(shè)置字符顏色等。因而實(shí)際應(yīng)用軟件開發(fā)中屏幕操作總是調(diào)用BIOS來完成,而很少有僅靠DOS調(diào)用完成的情況。BIOS的顯示功能集中在10H號(hào)中斷中。其各個(gè)子功能基本情況如表8-7所示:第8章中斷與系統(tǒng)功能調(diào)用表8-7BIOS的10H號(hào)能調(diào)用的子功能AH功能AH功能00置顯示方式09寫字符和屬性01置光標(biāo)類型0A寫字符02置光標(biāo)位置0B置彩色調(diào)色板03讀光標(biāo)位置0C寫點(diǎn)04讀光筆位置0D讀點(diǎn)05選擇當(dāng)前顯示頁0E以電傳方式寫字符06當(dāng)前顯示頁上滾0F取當(dāng)前顯示頁07當(dāng)前顯示頁下滾13寫字符串08讀字符和屬性第8章中斷與系統(tǒng)功能調(diào)用(2)顯示方式
PC機(jī)的基本顯示方式有2種,一種是文本方式,一種是圖形方式。
在文本方式下,屏幕可顯示的最小單位是字符,字符可以設(shè)置背景色、前景色、閃爍等屬性。CGA顯示器有40×25字符低分辨率和80×25高分辨率兩種方式。文本方式下屏幕上的每個(gè)字符在顯存中占二個(gè)字節(jié),一個(gè)字節(jié)對應(yīng)ASCII碼,一個(gè)字節(jié)對應(yīng)屬性值。由于屏幕上最多有2000個(gè)這符,只需4000個(gè)字節(jié)的顯存即可。因而32K的顯存被劃分成8份使用,每份4K,稱為一個(gè)顯示頁。一次只有一個(gè)顯示頁中的數(shù)據(jù)顯示在屏幕上,這個(gè)頁稱為當(dāng)前頁。系統(tǒng)中有相應(yīng)的方法控制切換當(dāng)前頁。第8章中斷與系統(tǒng)功能調(diào)用②圖形方式
在圖形方式下,屏幕上可控制的最小單位是點(diǎn),CGA將顯示屏幕劃分為320×200個(gè)象素的中分辨率和640×200個(gè)象素的高分辨率方式。在中分辨率方式下,每個(gè)象素可以有4種不同的顏色顯示,背景可以有16種顏色。在高分辨率方式下,只能以黑白方式顯示。在圖形方式下,屏幕有光標(biāo)但不顯示。
第8章中斷與系統(tǒng)功能調(diào)用(3)字符屬性
在文本方式下,字符屬性用一個(gè)字節(jié)表示,屬性字節(jié)格式如下:
D7:閃爍。
D6—D4:背景色
D3—D0:前景色
顏色屬性與取值對應(yīng)關(guān)系如表8-8所示:
第8章中斷與系統(tǒng)功能調(diào)用表8-8顏色屬性與取值顏色值(Bin)顏色值(Bin)顏色值(Bin)顏色值(Bin)黑0000紅0100灰1000淺紅1100藍(lán)0001紫0101淺藍(lán)1001品紅1101綠0010棕0110淺綠1010黃1110青0011灰白0111淺白1011白1111第8章中斷與系統(tǒng)功能調(diào)用(4)光標(biāo)與窗口
在文本方式下,光標(biāo)可由程序設(shè)置其形狀或是否顯示,由10H號(hào)功能調(diào)用的1號(hào)子功能完成;也可以調(diào)置或讀取其位置,由10H號(hào)功能調(diào)用的2、3號(hào)子功能完成。另外,當(dāng)前光標(biāo)處顯示的字符也可以讀出,由10H號(hào)功能調(diào)用的8號(hào)子功能完成。
窗口是屏幕上的一個(gè)矩形區(qū)域,可以獨(dú)立進(jìn)行顯示文本的輸出及上卷、下卷等操作。屏幕上可以同時(shí)設(shè)置多個(gè)窗口。窗口上卷時(shí),超過頂部的行將自動(dòng)丟失,出現(xiàn)在底部的新行被填為空格。上、下滾動(dòng)窗口的操作分別由10H號(hào)功能調(diào)用的6、7號(hào)子功能完成,清屏操作也是借助于這二種操作完成的,只要在其入口參數(shù)中設(shè)置AL=0即可。第8章中斷與系統(tǒng)功能調(diào)用(5)文本顯示10H號(hào)功能調(diào)用中常用的文本顯示子功能如表8-9所示。10H號(hào)功能調(diào)用的子功能09H和子功能0AH都能把一個(gè)字符傳送到顯示屏幕,然后光標(biāo)返回到它的初始位置,所以在當(dāng)前光標(biāo)位置上寫一字符之后,必須用10H號(hào)功能調(diào)用的子功能02H移動(dòng)光標(biāo)到下一個(gè)字符位置上。這兩種子功能的區(qū)別是:AH=09H的功能把字符及其屬性輸出到當(dāng)前光標(biāo)位置上,而AH=OAH的子功能只輸出字符,它的屬性值就是這一位置上先前已具有的屬性。OAH功能在使用黑白顯示器時(shí)特別方便,因?yàn)榇藭r(shí)我們很少改變顯示字符的屬性。如果想在顯示字符后自動(dòng)后移光標(biāo)位置,則應(yīng)用0EH號(hào)子功能。第8章中斷與系統(tǒng)功能調(diào)用表8-9BIOS的文本顯示功能AH功能入口參數(shù)出口參數(shù)1置光標(biāo)類型(CH)0~3=光標(biāo)開始行(CL)0~3=光標(biāo)結(jié)束行2置光標(biāo)位置BH=頁號(hào)DH=行DL=列3讀光標(biāo)位置BH=頁號(hào)CH=光標(biāo)開始行CL=光標(biāo)結(jié)束行DH=行DL=列第8章中斷與系統(tǒng)功能調(diào)用AH功能入口參數(shù)出口參數(shù)6當(dāng)前顯示頁上卷AL=上卷行數(shù),AL=0全屏幕為空白BH=卷入行屬性CH=左上角行號(hào)CL=左上角列號(hào)DH=右下角行號(hào)DL=右下均列號(hào)7當(dāng)前顯示頁下卷AL=下卷行數(shù),AL=0全屏幕為空白BH=卷入行屬性CH=左上角行號(hào)CL=左上角列號(hào)DH=右下角行號(hào)DL=右下角列號(hào)表8-9BIOS的文本顯示功能第8章中斷與系統(tǒng)功能調(diào)用AH功能入口參數(shù)出口參數(shù)8讀光標(biāo)位置的屬性和字符BH=顯示頁AH=屬性9在光標(biāo)位置顯示字符及其屬性BH=顯示頁AL=字符BL=屬性CX=字符重復(fù)次數(shù)A在光標(biāo)位置只顯示字符BH=顯示頁AL=字符CX=字符重復(fù)次數(shù)表8-9BIOS的文本顯示功能E以電傳方式寫字符AL=字符ASCII碼BL=前景色(圖形方式下)=0(文本方式下)第8章中斷與系統(tǒng)功能調(diào)用【例8.5】本例中程序運(yùn)行后先清屏,然后在20行25列處顯示10個(gè)星號(hào)。
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AH,6 ;上滾窗口
MOV AL,0 ;上滾行數(shù)
MOV CH,0 ;窗口左上角行號(hào)
MOV CL,0 ;窗口左上角列號(hào)
MOV DH,24 ;窗口右下角行號(hào)
MOV DL,79 ;窗口右下角列號(hào)
MOV BH,1FH ;窗口底部空白行屬性:藍(lán)底白字
INT 10H第8章中斷與系統(tǒng)功能調(diào)用 MOV AH,2 ;置光標(biāo)位置
MOV BH,0 ;頁號(hào)0
MOV DH,20 ;行號(hào)為20
MOV DL,25 ;列號(hào)為25
INT 10H
MOV AH,9 ;顯示字符功能
MOV AL,'*' ;顯示字符ASCII碼
MOV BH,0 ;設(shè)置頁號(hào)
MOV BL,7 ;字符屬性
MOV CX,10 ;重復(fù)次數(shù)
INT 10H
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START返回本節(jié)首頁返回上一節(jié)返回本章首頁第8章中斷與系統(tǒng)功能調(diào)用8.3.3圖形顯示程序設(shè)計(jì)編制圖形程序是程序設(shè)計(jì)中非常有趣和有價(jià)值的工作之一。在圖形領(lǐng)域中,匯編語言具有潛在的優(yōu)點(diǎn),因?yàn)槠聊簧巷@示的一個(gè)圖象由成千上萬個(gè)元素組成,處理這些圖象需要大量的指令。以速度而論,匯編語言遠(yuǎn)比高級(jí)語言快得多,最高級(jí)的圖形技術(shù),例如動(dòng)畫,往往以匯編語言編寫才更逼真、有效。
1.顯示功能
如上節(jié)所述,BIOS的顯示功能全部集中在10H號(hào)功能調(diào)用中。10H號(hào)功能調(diào)用中常用的圖形方式子功能如表8-10所示:
第8章中斷與系統(tǒng)功能調(diào)用表8-10BIOS的圖形顯示功能AH功能入口參數(shù)出口參數(shù)0設(shè)置顯示方式AL=0040×25黑白文本方式AL=0140×25彩色文本方式AL=0280×25黑白文本方式AL=0380×25彩色文本方式AL=04320×200彩色圖形方式AL=05320×200黑白圖形方式AL=06640×200黑白圖形方式B置彩色調(diào)色板BH指明要執(zhí)行的功能=0:設(shè)置當(dāng)前調(diào)色板背景色=1:選擇調(diào)色板BL其含義取決于BH值若BH=0:此寄存器中設(shè)置背景色代碼(0—0FH)若BH=1:此寄存器中放置調(diào)色板號(hào)第8章中斷與系統(tǒng)功能調(diào)用AH功能入口參數(shù)出口參數(shù)C寫點(diǎn)DX=行(0—199)CX=列(0—639)AL=象素值(中分辨率方式下合法象素值為0—3,高分辨率方式下為0或1。若AL的最高位為1,表示新的象素與當(dāng)前屏幕上的象素進(jìn)行異或顯示。)D讀點(diǎn)DX=行(0—199)CX=列(0—639)AL=象素值表8-10BIOS的圖形顯示功能第8章中斷與系統(tǒng)功能調(diào)用2.圖形方式下的分辨率與顏色
顯示器(實(shí)際由顯示卡控制)默認(rèn)的顯示方式是文本方式,要想設(shè)置為圖形方式,需要調(diào)用INT10H的00號(hào)子功能完成。
在圖形方式中,屏幕被視為M×N的點(diǎn)陣,每個(gè)點(diǎn)的坐標(biāo)上的圖象元素就是一個(gè)象素。在圖形方式下顯存中要對屏幕上的內(nèi)容按點(diǎn)存儲(chǔ),由于顯存容量有限,在320×200中分辨率下,每個(gè)點(diǎn)(象素)的顏色用2個(gè)二進(jìn)制位來表示,故可有4種顏色;在640×200象素的高分辨率下,每個(gè)點(diǎn)(象素)的顏色用1個(gè)二進(jìn)制位來表示,故只有黑白2種顏色。
第8章中斷與系統(tǒng)功能調(diào)用程序如下:
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AH,0
MOV AL,4
INT 10H ;設(shè)置320×200彩色圖形方式
MOV BX,100 ;控制循環(huán)次數(shù)
MOV DX,0 ;寫點(diǎn)行坐標(biāo)
MOV CX,0 ;寫點(diǎn)列坐標(biāo)
MOV AL,2 ;寫點(diǎn)的顏色,紅色
MOV AH,0CH ;設(shè)置調(diào)用寫點(diǎn)子功能【例8.6】本例運(yùn)行后先將屏幕設(shè)置為320×200彩色圖形方式,然后在(0,0)~(99,99)處畫一條紅色線。第8章中斷與系統(tǒng)功能調(diào)用L1:
INT 10H
INC CX
INC DX
DEC BX
JNZ L1 ;控制循環(huán)100次
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START
返回上一節(jié)返回本節(jié)首頁返回本章首頁第8章中斷與系統(tǒng)功能調(diào)用實(shí)訓(xùn)一PC機(jī)間的相互通信:中斷方式實(shí)訓(xùn)內(nèi)容:設(shè)計(jì)一套系統(tǒng),能在兩臺(tái)PC機(jī)之間以中斷方式實(shí)現(xiàn)串行通信。本實(shí)訓(xùn)的知識(shí)點(diǎn)與要求同第七章的實(shí)訓(xùn)二,但是CPU與外設(shè)交換數(shù)據(jù)的方式改為中斷方式。分析:該系統(tǒng)應(yīng)包含硬件連接圖及軟件設(shè)計(jì)兩部分。由于8250中斷方面的知識(shí)以前章節(jié)中未講,所以下面先對相關(guān)知識(shí)作一下簡介,最后再給出參考硬件連接圖及程序。第8章中斷與系統(tǒng)功能調(diào)用1.8250的中斷方式8250可以以中斷方式工作(系統(tǒng)分配的中斷向量號(hào)為0CH),在初始化中斷允許寄存器時(shí)將第0~3位中某一位或幾位置1,則對應(yīng)的條件發(fā)生時(shí)8250將向CPU發(fā)送中斷請求信號(hào)。當(dāng)引發(fā)中斷的條件在二個(gè)或二個(gè)以上時(shí),在中斷服務(wù)程序內(nèi)必須斷別是何種原因引發(fā)的中斷,以便確定處理方法。為此,需要讀取中斷標(biāo)識(shí)寄存器,其標(biāo)志位指明了中斷的原因。第8章中斷與系統(tǒng)功能調(diào)用中斷標(biāo)識(shí)寄存器各位含義如下:
位00=還有其它中斷等待處理。1=無其它中斷等待處理。
1—2指明中斷原因:
00=MODEM狀態(tài)改變。
01=發(fā)送保持寄存器空。
10=接收數(shù)據(jù)準(zhǔn)備好。
11=接收出錯(cuò)或收到間斷狀態(tài)。
3—7未用,為0。
另外,在PC機(jī)內(nèi)中斷控制器8259A被初始化為普通結(jié)束方式,故外中斷的中斷服務(wù)程序在結(jié)束前必須給8259A發(fā)中斷結(jié)束命令,即執(zhí)行如下兩條指令:
MOV AL,20H
OUT 20H,AL第8章中斷與系統(tǒng)功能調(diào)用2.參考硬件連接圖及程序
硬件連接圖:仍采用圖7-6即可。
參考程序:
本程序是一個(gè)接收方程序(發(fā)送方程序可直接使用上節(jié)的程序),其功能是接收發(fā)送方發(fā)來的字符,然后顯示在屏幕上。接收過程以中斷方式進(jìn)行,用戶按Ctrl-C鍵可退出程序。程序如下:CODE SEGMENT
ASSUMECS:CODE
NEW_INT: ;接收字符的中斷處理程序
STI ;CPU開中斷
MOV DX,3F8H ;接收字符
IN AL,DX
MOV DL,AL ;顯示接收字符第8章中斷與系統(tǒng)功能調(diào)用 MOV AH,2
INT 21H
CMP DL,0DH ;判斷是否為回車
JNZ L2 ;不是,轉(zhuǎn)L2處
MOV DL,0AH ;若是,加顯示一個(gè)換行符
MOV AH,2
INT 21HL2: MOV AL,20H ;發(fā)中斷結(jié)束命令(EOI) OUT 20H,AL IRET第8章中斷與系統(tǒng)功能調(diào)用START: ;主程序部分
MOV AH,35H
MOV AL,0CH
INT 21H ;讀取原0CH號(hào)中斷服務(wù)程序的地址
PUSH BX
PUSH ES
;以上地址入棧保存(以便程序退出時(shí)再恢復(fù)內(nèi)容)
MOV AX,CS
MOV DS,AX
MOV DX,OFFSETNEW_INT
MOV AH,25H
MOV AL,0CH
INT 21H
;將NET_INT位置登記為0CH號(hào)中斷服務(wù)程序的地址第8章中斷與系統(tǒng)功能調(diào)用;以下初始化8250
MOV DX,3FBH ;指向線路控制寄存器
MOV AL,80H ;位7置1
OUT DX,AL ;發(fā)送此字節(jié)
MOV DX,3F9H ;指向波特率除數(shù)的高字節(jié)
MOV AL,0 ;1200BPS對應(yīng)的高字節(jié)
OUT DX,AL ;發(fā)送此字節(jié)
DEC DX ;指向波特率除數(shù)的低字節(jié)
MOV AL,60H ;1200BPS對應(yīng)的低字節(jié)
OUT DX,AL ;發(fā)送此字節(jié)
MOV AL,1BH
;數(shù)據(jù)長度為8位,1個(gè)奇偶校驗(yàn)位,偶校驗(yàn),1個(gè)停止位
MOV DX,3FBH ;指向線路控制寄存器
OUT DX,AL ;發(fā)送此字節(jié) 第8章中斷與系統(tǒng)功能調(diào)用 MOV DX,3FCH ;設(shè)置MODEM控制寄存器
MOV AL,0BH ;允許8250發(fā)中斷
OUT DX,AL
MOV DX,3F9H ;指向中斷允許寄存器
MOV AL,1 ;允許數(shù)據(jù)接收準(zhǔn)備好中斷
OUT DX,AL ;發(fā)送此字節(jié)
CLI
;關(guān)中斷,以便對中斷控制器8259A進(jìn)行操作
IN AL,21H ;讀取中斷屏蔽寄存器的內(nèi)容
AND AL,0EFH
;將COM1中斷(即IRQ4引腳)的對應(yīng)位置0,開中斷。
OUT 21H,AL ;寫入中斷控制器8259A中
STI ;開中斷第8章中斷與系統(tǒng)功能調(diào)用L1: ;主程序循環(huán),等待收到字符的中斷發(fā)生。
MOV AH,0
INT 16H ;讀取鍵盤字符
CMP AL,03 ;比較是否為CTRL-C鍵
JNZ L1 ;若不是,繼續(xù)循環(huán)
EXIT: ;退出處理
MOV AH,25H
MOV AL,0CH
POP DS
POP DX
INT 21H
;恢復(fù)中斷矢量表中0CH號(hào)中斷服務(wù)程序的原地址。
MOV AH,4CH
INT 21H ;返回DOS
CODE ENDS
END START返回本章首頁第8章中斷與系統(tǒng)功能調(diào)用實(shí)訓(xùn)二發(fā)聲程序設(shè)計(jì)實(shí)訓(xùn)內(nèi)容:編一發(fā)聲程序,能播放簡單的音樂。分析:PC機(jī)系統(tǒng)的發(fā)聲原理如第七章第一節(jié)中的圖7-2所示。8253定時(shí)計(jì)數(shù)器的計(jì)數(shù)通道2用于系統(tǒng)的揚(yáng)聲器音頻信號(hào)提供,但8253計(jì)數(shù)通道2輸出的方波受8255APB0的控制,只有當(dāng)PB0輸出高電平時(shí)才允許計(jì)數(shù)通道2的方波輸出。該方波又與PB1相與后送揚(yáng)聲器的驅(qū)動(dòng)電路,去驅(qū)動(dòng)揚(yáng)聲器發(fā)聲。一般情況下,可讓PB0輸出高電平,通過對8253編程設(shè)置方波輸出頻率以控制發(fā)聲頻率。通過控制8255APB1輸出以控制發(fā)聲時(shí)間。
8253計(jì)數(shù)值的計(jì)算方法為: 計(jì)數(shù)值=時(shí)鐘頻率÷音符頻率(時(shí)鐘頻率=11.9318MHZ=1234DCH)第8章中斷與系統(tǒng)功能調(diào)用音符與頻率關(guān)系對照表如表8-11所示:音名CDEFGABCDEFGABC音符1?2?3?4?5?6?7?1234567i頻率131147165175196220247262294330349392440494523表8-10音符與頻率關(guān)系表第8章中斷與系統(tǒng)功能調(diào)用參考程序:本程序能演奏世界名曲《兩只老虎》,流程圖參見圖8-3。圖8-3(a)主程序流程圖
以INDEX為索引,從頻率表FREQ中取一頻率值
顯示曲名
開始
調(diào)發(fā)聲子程序
INDEX+2→INDEX
所取頻率值為0?YN結(jié)束
第8章中斷與系統(tǒng)功能調(diào)用進(jìn)入
返回
保護(hù)現(xiàn)場
讀取時(shí)鐘當(dāng)前值→CX:DX
以INDEX為索引,從表TIME中查出發(fā)聲時(shí)間CX:DX+發(fā)聲時(shí)間→SI:DI
讀取當(dāng)前時(shí)鐘值→CX:DX
CX:DX與SI:DI相減
YN夠減?恢復(fù)現(xiàn)場圖8-3(b)延時(shí)子程序流程圖
1234DCH÷DI
音符頻率計(jì)數(shù)值
以INDEX為索引從表FREQ中取出一音符頻率→DI
初始化8253通道2:方波輸出
計(jì)數(shù)值寫入8253
調(diào)用延時(shí)子程序
進(jìn)入
控制8255A打開門控,使發(fā)聲關(guān)閉門控
圖8-3(c)發(fā)聲子程序流程圖
返回
第8章中斷與系統(tǒng)功能調(diào)用DATA SEGMENT
FREQ DW 2DUP(262,294,330,262)
;依次定義各個(gè)音符的頻率,0:樂曲結(jié)束
DW 2DUP(330,349,392)
DW 2DUP(392,440,392,349,330,262)
DW 2DUP(294,196,262),0
TIME DW 10DUP(6),12,6,6,12
;依次定義各個(gè)音符的演奏時(shí)間,這個(gè)時(shí)間為系統(tǒng)
DW 2DUP(3,3,3,3,6,6)
;時(shí)鐘的計(jì)數(shù)值,系統(tǒng)時(shí)鐘每計(jì)一個(gè)數(shù)為55MS,
DW 2DUP(6,6,12)
;定義樂曲中八分音符為3個(gè)計(jì)數(shù)值,即165MS,
;同理6、
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 出租鐵床改造合同范本
- 廠區(qū)綠化管護(hù)合同范本
- 課題申報(bào)書ai怎么寫的
- 作文評價(jià)研究課題申報(bào)書
- 光纖熔接勞務(wù)合同范本
- 公司建筑材料租賃合同范本
- 醫(yī)療耗材中標(biāo)合同范本
- 醫(yī)生自費(fèi)進(jìn)修合同范本
- 中德儲(chǔ)蓄合同范本
- 課程評價(jià)課題申報(bào)書
- 2025屆上海市(春秋考)高考英語考綱詞匯對照表清單
- 2024年江西交通職業(yè)技術(shù)學(xué)院單招職業(yè)技能測試題庫及答案解析
- word公章模板
- 中西醫(yī)結(jié)合腫瘤學(xué)試卷(含答案)
- 開學(xué)第一課我們開學(xué)啦主題班會(huì)PPT課件(帶內(nèi)容)
- 體育訓(xùn)練隊(duì)隊(duì)規(guī)
- 電梯工程開工報(bào)告(直梯)(共1頁)
- ANSI B165《鋼制管法蘭及法蘭管件》
- 集團(tuán)公司財(cái)務(wù)管理內(nèi)部交易管理辦法,
- 視頻會(huì)議系統(tǒng)測試方案匯總
- 五年級(jí)第二學(xué)期體育知識(shí)結(jié)構(gòu)圖
評論
0/150
提交評論