匯編語言課件第8章綜合程序設(shè)計_第1頁
匯編語言課件第8章綜合程序設(shè)計_第2頁
匯編語言課件第8章綜合程序設(shè)計_第3頁
匯編語言課件第8章綜合程序設(shè)計_第4頁
匯編語言課件第8章綜合程序設(shè)計_第5頁
已閱讀5頁,還剩65頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第8章綜合程序設(shè)計

8.1顯示程序設(shè)計8.1.1顯示程序概述8.1.2顯示程序設(shè)計實例8.2鍵盤輸入輸出程序設(shè)計8.2.1鍵盤輸入輸出程序概述8.2.2鍵盤輸入輸出程序設(shè)計實例8.3文件管理8.3.1文件管理概述8.3.2文件管理設(shè)計實例8.1.1顯示程序概述兩類顯示方式:文本顯示方式:DOS操作系統(tǒng)圖形顯示方式:WINDOWS操作系統(tǒng)8.1.1顯示程序概述1.文本顯示方式所謂文本顯示方式是指以字符為單位的顯示方式。文本方式是圖形適配器器的默認(rèn)方式,主要用于字符文本處理。文本顯示模式下,顯示器的屏幕被劃分為80列25行,所以每一屏最多可顯示2000(80*25)個字符,也就需要4000個字節(jié)來存儲一屏的顯示信息。一般用行號和列號組成的坐標(biāo)未定位屏幕上的每個可顯示位置,左上角的坐標(biāo)規(guī)定為(0,0),向右增加列號,向下增加行號,這樣右下角的坐標(biāo)便是(79,24)。8.1.1顯示程序概述2.顯示屬性屏幕上顯示的字符取決于字符的ASCII碼及字符顯示屬性。在單色顯示時,顯示屬性定義了閃爍、反相和高亮度等顯示特性。在彩色顯示時,屬性還定義了前景色和背景色。圖8-1顯示屬性各字段位定義8.1.1顯示程序概述8.1.1顯示程序概述8.1.1顯示程序概述顯示適配卡帶有顯示存儲器,用于存放顯示屏幕上顯示文本的代碼及屬性或圖形信思。顯示存儲器作為系統(tǒng)存儲器的一部分,可用訪問普通內(nèi)存的方法訪問顯示存儲器。通常為顯示存儲器安排的存儲地址空間的段值是B800H或B000H,對應(yīng)的內(nèi)存區(qū)域就稱為顯示緩沖區(qū)。假設(shè)段值是B800H。文本顯示模式下,屏幕的每一個顯示位置依次對應(yīng)顯示存儲區(qū)中的兩個字節(jié)單元,這種對應(yīng)關(guān)系如圖8-2所示。在圖中,為了直觀起見,將存儲器地址從上到下編碼,即高地址端存下端。8.1.1顯示程序概述圖8-2顯示位置與存儲區(qū)的對應(yīng)關(guān)系8.1.1顯示程序概述為了在屏幕上某個位置顯示字符,只需把要顯示字符的代碼及屬性填到顯示存儲區(qū)中的對應(yīng)存儲單元即可。下面的程序片段屬性在屏幕的左上角以黑底白字顯示字符“A”:

MOVAX,B800H MOVDS,AX MOVBX,0 MOVAL,‘A’ MOVAH,07H MOV[BX],AX8.1.1顯示程序概述如果要了解屏幕上某個顯示位置的字符是什么,或顯示的顏色是什么,那么只要從顯示存儲區(qū)中的對應(yīng)存儲單元中取出字符的代碼和屬性即可。下面的程序片段取得屏幕右下角顯示字符的代碼及屬性:

MOVAX,B800H MOVDS,AX MOVBX,(8*)*2 MOVAX,[BX]這種直接存取顯示存儲器進(jìn)行顯示的方法稱為直接寫屏。利用直接寫屏方法,程序可實現(xiàn)快速顯示。但編程較復(fù)雜,并且最終的程序也與顯示適配卡相關(guān)。所以,一般不采用直接寫屏方法,而是調(diào)用BIOS提供的顯示I/O程序。3.調(diào)用BIOS提供的顯示I/O程序顯示I/O程序的主要功能列于表8-3。在調(diào)用I/O程序的某個功能時,根據(jù)要求設(shè)置好入口參數(shù),把功能編號置入AH寄存器中,然后發(fā)出中斷指令“INT10H”。3.調(diào)用BIOS提供的顯示I/O程序顯示I/O程序的主要功能列于表8-3。在調(diào)用I/O程序的某個功能時,根據(jù)要求設(shè)置好入口參數(shù),把功能編號置入AH寄存器中,然后發(fā)出中斷指令“INT10H”。8.1.1顯示程序概述4.DOS功能中的屏幕輸出屏幕輸出是最常用的一種輸出形式,DOS操作系統(tǒng)提供了幾種實現(xiàn)屏幕輸出的功能調(diào)用。INT21H中的相關(guān)功能如下:

02H——顯示的字符;

06H——控制臺的輸入/輸出:當(dāng)DL≠0FFH,表示顯示字符;

09H——在屏幕上顯示一個字符串。8.1.1顯示程序概述5.圖形顯示方式圖形顯示是目前最常用的一種顯示方式,也是WINDOWS操作系統(tǒng)的默認(rèn)顯示方式。在該顯示方式下,我們可以看到優(yōu)美的圖象、VCD、瀏覽豐富多彩的網(wǎng)頁等。8.1.1顯示程序概述6.設(shè)置光標(biāo)設(shè)置光標(biāo)是一個基本的中斷請求,因為光標(biāo)的位置決定了下一個字符將在哪里顯示或輸入。屏幕處理的BIOS操作取決于INT10H以及AH中的功能碼。例如,INT10H的02H功能是告訴BIOS設(shè)置光標(biāo),并將要求的頁號裝入BH(頁號通常為0),行號裝入DH,列號裝入DL。8.1.2顯示程序設(shè)計實例

【例8-1】在屏幕上顯示字符串“EXAMPLEOFSTRINGDISPLAY!”

DATASEGMENTSTRDB0DH,0AH,`EXAMPLEOFSTRINGDISPLAY!$`DATAENDSSTACKSEGMENT STACK DB 100DUP(0)

STACKENDSCODESEGMENTASSUMEDS:DATA,CS:CODE,SS:STACKBEGIN: MOVAX,DATA MOVDS,AX LEADX,STR MOVAH,9 INT21H MOVAH,4CH INT21HCODEENDS ENDBEGIN【例8-2】采用直接寫屏法在屏幕上用多種方式顯示“BEIJING2008”。

WIDE=5COLUMBIA=10STOPIN=1BHDSEGSEGMENTMESSDB‘BEIJING2008’MESSLEN=$-0FFSETMESSCOLORBDB04H,70H,13H,7DH,23HCOLORELABELBYTEDSEGENDSCSEGSEGMENTASSUMECS:CSEG,DS:DSBEGIN:MOVAX,DSEGMOVDS,AXMOVDI,OFFSETCOLORESTEPC:INCDICMPDI,OFFSETCOLORJNZSTEPSMOV DI,OFFSETCOLORSTEPS:MOVBI,[DI]MOVSI,OFFSETMESSMOVCX,MESSLENMOV DH,WIDEMOV DL,COLUMBIA

CALLCLASSMOVAH,0INT16HCMPAL,STOPINJNZSTEPCMOVAX,4C00HINT2LHCLASSPROCMOVAX,08800HMOVES,AXMOVAL,80MULDHXORDH,DHADDAX,DXADDAX,AXXCHGAX,BXMOVAH,ALJCXZCLASS2CLASSL:MOVAL,[SI]INCSIMOVES:[BX],AXINCBXINCBXLOOPCLASSLCLASS2:RETCLASSENDPCSEGENDSENDBEGIN【例8-3】用“霓虹燈”的顯示方式顯示字符串“HELLO”,按ESC鍵時結(jié)束程序的運行。MODELSMALL,C.DATAKBESCEQU1BHBUFFDB"H",15,"E",15,"L",15,"L",15,"O",15.CODECLEARPROCNEARUSESAXBXCXDX;清屏幕,并保護(hù)所用寄存器MOVCL,0MOVCH,0MOVDL,79MOVDH,24;(0,0)-(24,79)是屏幕的左上角和右下角MOVBH,7MOVAL,0MOVAH,6INT10HRETCLEARENDP.STARTUPCALLCLEARMOVAX,DSMOVES,AXMOVSI,9AGAIN:

MOVBUFF[SI],15;把前一次的紅色還原ADDSI,2.IFSI>9MOVSI,1.ENDIFMOVBUFF[SI],12;把當(dāng)前字符以紅色顯示MOVBH,0MOVCX,5MOVDH,5MOVDL,20;顯示位置從(5,20)開始LEABP,BUFFMOVAL,2MOVAH,13HINT10H;調(diào)用中斷10H之功能13HMOVAH,1INT16H;檢查是否有按鍵JZAGAIN;若無字符可讀,則繼續(xù)循環(huán)MOVAH,0INT16HCMPAL,KBESCJNZAGAIN;若按鍵不是ESCAPE,則繼續(xù)循環(huán).EXIT0END【例8-4】在256色320×200的圖形顯示模式下,從屏幕最左邊向最右邊,依次畫豎線(從頂?shù)降祝?,線的顏色從1依次加1。要求用中斷調(diào)用的方法來畫線。MODELSMALL.DATAMODEDB?;保存當(dāng)前顯示模式.CODEVLINEPROCNEARUSESAXBXDX;CX=豎線所在的列,AL=線的顏色MOVDX,0MOVBH,0MOVAH,0CHDRAW:VLINEINT10HINCDXCMPDX,200JLDRAWRETENDP.STARTUPMOVAH,0FHINT10HMOVMODE,AL;保存當(dāng)前顯示模式,在程序結(jié)束前恢復(fù)之MOVAH,0MOVAL,13HINT10H;設(shè)置256色320×200的圖形顯示模式MOVCX,0MOVAL,01H;CX=線所在列,AL=線的顏色DRAW:CALLVLINEINCALINCCXCMPCX,320JLDRAW;從左到右畫320條豎線MOVAH,0INT16H;等待一個按鍵MOVAL,MODEMOVAH,0INT10H;恢復(fù)原來的屏幕顯示模式.EXIT0END【例8-5】在顯示器上繪制一方框圖形DATASEGMENTROWDW40COLDW80CHXDW60CHYDW40CLRDB1DATAENDSTK1SEGMENTPARASTACKDW20HDUP(0)STK1ENDSCSGSEGMENTASSUMECS:CSG,DS;DATA,SS:STACKLSQR:MOVAX,DATA’MOVDS,AXMOVAH,O;選擇顯示方式

MOVAL,06H;置640*200圖形方式

INT10HMOVDX,ROWMOVCX,COLCALLPROXMOVDX,ROWMOVCX,C0L,UMADDCX,CHXCALLPROYMOVDX,ROWMOVCX,COLCALLPROY

MOVDX,ROWADDDX,CHYMOVCX,COLCALLPROXMOVAH,4CHLNT2LHPROXPROCMOVBP,CHX;線長NEXT1:MOVBH,0INCCXMOVAL,CLRMOVALL,0CH INTL0H DECBP JNENEXT1 RETPROXENDPPROYPROCMOVBP,CHYNEXT2:MOVBH,0 INCDX MOVAL,CLR MOVALL,0CH INT10H DECBP JNENEXT2 RETPROYENDPCSGENDSENDSQR【例8-6】下列程序?qū)⑵聊坏牡?0行復(fù)制到20行,該程序在高分辨圖模式下運行。程序首先判斷當(dāng)前顯示模式是否為高分分辨,若不是則轉(zhuǎn)移到BAD_MODE,并顯示“THEMODEMUSTBESETTOHIGHRESOLUTION”。DATASEGMENTMSGDB‘THEMODEMUSTBESETTOHIGHRESOLUTION’NEQU$—MSG;顯示字符個數(shù)DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,ES:DATAMAINPROCFARSTART:MOVAX,DATAMOVDS,AXMOVAH,0MOVAL,10H;設(shè)置為10H模式

INT10HCMPAL,0FH;讀模式

INT10H

CMP AL,0EH ;若小于0EH模式則轉(zhuǎn)JL BAD_MODECMP AL,13H ;若是256色的13H模式則轉(zhuǎn)JZBAD_MODEMOVCX,639;開始列號LPI:MOVAH,0DH ;讀像素點調(diào)用MOVBH,0 ;0頁MOVDX,10;10行INT10HMOVAH,0CH ;寫像素點調(diào)用MOVDX,20 ;20行INT10HDECCXCMPCX,0FFFFHJNZLP1MOVAH,4CHINT21HBAD_MODE:MOVAX,DATAMOVES,AXMOVAH,3 ;讀光標(biāo)位置功能調(diào)用MOVBH,0 ;0頁INT10H ;DX中有光標(biāo)位置MOVDL,0 ;選0列MOVAX,1300H ;寫字串MOVBH,0;0頁MOVBL,3;顏色為3號LEABP,MSG;字節(jié)的偏移地址MOVCX,N;字串長度INT10HMOVAH,4CHINT21HCODEENDSENDSTART8.2鍵盤輸入輸出程序設(shè)計

8.2.1鍵盤輸入輸出程序概述8.2.2鍵盤輸入輸出程序設(shè)計實例8.2.1鍵盤輸入輸出程序概述

1.鍵盤輸入2.DOS功能中的鍵盤輸入3.BIOS中的鍵盤輸入4.直接操作端口的鍵盤輸入5.鍵盤中斷的處理過程6.鍵盤緩沖區(qū)8.2.1鍵盤輸入輸出程序概述1.鍵盤輸入鍵盤上的每一個鍵相當(dāng)于一個開關(guān),鍵盤中有個芯片對鍵盤上的每一個鍵的開關(guān)狀態(tài)進(jìn)行掃描。按下一個鍵時,開關(guān)接通,該芯片就產(chǎn)生一個掃描碼,掃描碼說明了按下的鍵在鍵盤上的位置。鍵盤狀態(tài)字節(jié)各位記錄的信息如下:0:右SHIFT狀態(tài),置1表示按下右SHIFT鍵;1:左SHIFT狀態(tài),置1表示按下左SHIFT鍵;2:CTRL狀態(tài),置1表示按下CTRL鍵;3:ALT狀態(tài),置1表示按下ALT鍵;4:SCROLLLOCK狀態(tài),置1表示SCROLL指示燈亮;5:NUMLOCK狀態(tài),置1表示小鍵盤輸入的是數(shù)字;6:CAPSLOCK狀態(tài),置1表示輸入大寫字母;7:INSERT狀態(tài),置1表示處于刪除態(tài);8:INSERT狀態(tài),置1表示處于按下;9:CAPSLOCK狀態(tài),置1表示按下;10:NUMLOCK狀態(tài),置1表示按下;11:SCROLLLOCK狀態(tài),置1表示按下;12:^PAUSE狀態(tài),置1表示按下;13:SYSRQ狀態(tài),置1表示按下;14:左ALT狀態(tài),置1表示按下ALT鍵;15:左CTRL狀態(tài),置1表示按下CTRL鍵。8.2.1鍵盤輸入輸出程序概述2.DOS功能中的鍵盤輸入鍵盤輸入是一種最常用的輸入方式,所以,在DOS操作系統(tǒng)中,提供了能實現(xiàn)各種鍵盤輸入的功能,INT21H中的相關(guān)功能如下:

01H——帶回顯的鍵盤輸入

06H——控制臺的輸入/輸出:當(dāng)DL=0FFH,表示鍵盤輸入

07H——不回顯、不過濾的鍵盤輸入

08H——不回顯的鍵盤輸入

0AH——鍵盤輸入字符串

0BH——檢查鍵盤輸入狀態(tài)

0CH——清除輸入緩沖區(qū)的輸入功能8.2.1鍵盤輸入輸出程序概述3.BIOS中的鍵盤輸入在BIOS系統(tǒng)中,提供了中斷16H來實現(xiàn)鍵盤輸入功能。其具體的功能如下:

00H、10H——從鍵盤讀一個字符,輸入字符不回顯

01H、11H——判斷鍵盤緩沖區(qū)內(nèi)是否有字符可讀

02H——讀取當(dāng)前鍵盤狀態(tài)字8.2.1鍵盤輸入輸出程序概述4.直接操作端口的鍵盤輸入鍵盤輸入端口的地址為60H,我們可以用指令I(lǐng)N從該端口讀取當(dāng)前按鍵的掃描碼。例如:

MOVDX,60HINAL,DX

鍵盤的輸入到達(dá)60H端口時,相關(guān)的芯片就會向CPU發(fā)出中斷信息。CPU檢測到該中斷信息后,則響應(yīng)中斷,引發(fā)中斷過程,轉(zhuǎn)去執(zhí)行中斷。8.2.1鍵盤輸入輸出程序概述5.鍵盤中斷的處理過程當(dāng)用戶按鍵時,鍵盤接口會得到一個代表該按鍵的鍵盤掃描碼,同時產(chǎn)生一個中斷請求。如果鍵盤中斷是允許的,那么CPU通常就會響應(yīng)中斷請求。因為鍵盤中斷的中斷號型號為9,所以CPU響應(yīng)鍵盤中斷,就是轉(zhuǎn)入9號中斷處理程序。我們把9號中斷處理程序稱為鍵盤中斷處理程序。鍵盤中斷服務(wù)程序首先從鍵盤接口取得按鍵的掃描碼,然后根據(jù)其掃描碼判斷用戶所按的鍵并作相應(yīng)的處理,最后通知中斷控制器本次中斷結(jié)束并實現(xiàn)中斷返回。6.鍵盤緩沖區(qū)鍵盤緩沖區(qū)是一個環(huán)形隊列,其性質(zhì)與《數(shù)據(jù)結(jié)構(gòu)》課程中對“環(huán)形隊列”所描述的性質(zhì)完全一致。雖然緩沖區(qū)的本身長度為16個字,但出于判斷“對列滿”的考慮,它最多只能保存15個鍵盤信息。當(dāng)緩沖區(qū)滿時,系統(tǒng)將不再接受按鍵信息,而會發(fā)出“嘟”的聲音,以示要暫緩按鍵。鍵盤輸入輸出程序設(shè)計實例

【例8-7】用鍵盤最多輸入10個字符,并存入內(nèi)存變量BUFF中,若按“CTRL+ENTER”鍵,則表示輸入結(jié)束。方法1:用BIOS中的中斷功能

.MODELSMALLCRENEQU0AH.DATABUFFDB10DUP(?).CODE.STARTUPMOVCX,0AHLEABX,BUFF.REPEATMOVAH,0HINT16H;.BREAK.IFAL=CRENMOV[BX],ALINCBX.UNTILCXZ.EXIT0END方法2:用DOS中的功能調(diào)用.MODELSMALL.DATABUFFDB10,?,10DUP(?).CODE.STARTUPLEADX,BUFFMOVAH,0AHINT21H;.EXIT0END【例8-8】在屏幕中間部位開出一個窗口,接收從鍵盤輸入的字符,并顯示在窗口的最底行,當(dāng)窗口底行顯示滿時,內(nèi)容就向上滾動一行;用戶按CTRL+C鍵時,結(jié)束運行。WINWH:40 ;窗口寬度WINUP:8;窗口左上角行號WINL:20;窗口左上角列號WINDW:17;窗口右下角行號WINR:WINL+WINWH-1 ;窗口右下角列號CR:74H;屬性值PG:0 ;顯示頁號CRT:03H;結(jié)束符ASCII碼;代碼段CSEGSFGMFNTASSUMECS:CSEGBEGIN:MOVAL,PG;選擇顯示頁

MOVAH,5INT10HMOVCH,WINUP ;清規(guī)定窗口

MOVCL,WINLMOVDH,WINDWMOVDL,WINRMOVBH,CRMOVAL,0MOVAH,6INT10HMOVBH,PG;定位光標(biāo)到窗口左下角

MOVDH,WINDWMOVDL,WINLMOVAH,2MOVBH,PG;在當(dāng)前光標(biāo)位置顯示所按鍵

MOVCX,1;但沒有移動光標(biāo)MOVAH,0AHINT10HINCDL ;光標(biāo)列數(shù)加1,準(zhǔn)備向右移動光標(biāo)

CMPDL,WINR+1 ;判斷是否越出窗口右邊界

JNZDOCR;不,轉(zhuǎn)

MOVCH,WINUP;是,窗口內(nèi)容上滾一行

MOVCL,WINL ;空出窗口的最底行

MOVDH,WINDWMOVDL,WINRMOVBH,CRMOVAL,1MOVAH,6INT10HMOVDL,WINL;光標(biāo)要回到最左面DOCR:MOVBH,PG;光標(biāo)后移

MOVAH,2INT10HJMPNEXT;繼續(xù)END:

MOVAX,4C00HINT21H ;結(jié)束CSEGENDS【例8-9】寫一個程序完成如下功能:讀鍵盤,并把所按鍵顯示出來,在檢測到按下SHIFT鍵后,就結(jié)束運行。調(diào)用鍵盤I/O程序的2號功能取得變換鍵狀態(tài)字節(jié),進(jìn)而判斷否按下了SHIFT鍵。在調(diào)用0號功能讀鍵盤之前,先調(diào)用2號功能判斷鍵盤是否有鍵可讀,否則會導(dǎo)致不能及時檢測到用戶按下的SHIFT鍵。源程序如下:常量定義:L_SHIFT=00000010BR_SHIFT=00000001B;代碼段CSEGSEGMENTASSUMECS:CSEGSTART:MOVAH,2;取變換鍵狀態(tài)字字

INT16HTESTAL,L_SHIFT+R_SHIFT;判斷是否按下SHIFT鍵

JNZOVER;按下,轉(zhuǎn)

MOVAH,1INT16H;是否有鍵可讀

JZSTART ;沒有,轉(zhuǎn)

MOVAH,0;讀鍵

INT16HMOVDL,AL;顯示所讀鍵

MOVAH,6INT21HJMPSTART;繼續(xù)OVER:MOVAH,4CHINT21HCSEGENDSENDSTART8.3文件管理

8.3.1文件管理概述

1.DOS文件系統(tǒng)數(shù)據(jù)以文件的形式存儲在磁盤上,就像你已經(jīng)存儲的程序一樣。

DOS文件系統(tǒng)支持層次結(jié)構(gòu),以根目錄為樹根,各子目錄為分枝,而文件為葉。

DOS文件系統(tǒng)對文件及目錄的管理與組織依賴一些內(nèi)部表格實現(xiàn)。

DOS文件系統(tǒng)支持層次結(jié)構(gòu),以根目錄為樹根,各子目錄為分枝,而文件為葉。DOS以命令行方式為用戶提供了方便的文件及目錄操作接口,通過文件或目錄的名稱,可讓用戶直接訪問到存放于磁盤上的對應(yīng)文件及目錄。

DOS文件系統(tǒng)對文件及目錄的管理與組織依賴一些內(nèi)部表格實現(xiàn)。這些內(nèi)部表格中記錄文件如何在磁盤上存放,目錄的層次組織等重要信息,包括文件分配表(FAT)、根目錄表等。DOS文件系統(tǒng)

雖然沒有限制保存在文件中的數(shù)據(jù)的類型,但是一個典型的用戶文件由客戶記錄、庫存供應(yīng)或姓名地址表組成。每個記錄包含了有關(guān)詳細(xì)的客戶信息或項目清單信息。在文件里,所有記錄通常有相同的長度和格式。一個記錄包含一個或多個提供有關(guān)記錄信息的字段。例如,對一個客戶文件的記錄,可以包含比如客戶號,姓名,地址和應(yīng)付款這些字段。記錄按客戶號升序排列。處理硬盤上的文件和軟盤上的文件大致相同,對于兩者。你必須提供一個路徑名來存取子目錄中的文件。有許多的特殊中斷服務(wù)支持磁盤輸入輸出。一個程序?qū)懸粋€文件首先使系統(tǒng)在目錄里生成一個入口項。當(dāng)所有文件的記錄寫完,程序關(guān)閉文件,這樣系統(tǒng)就可以完成文件大小的目錄入口項。程序讀一個文件首先要打開文件以確保它是存在的。一旦程序讀完全部記錄,應(yīng)當(dāng)關(guān)閉這個文件,使它對其他程序也是可用的。由于目錄的設(shè)計,你可以順序處理磁盤文件的記錄,也可以隨機(jī)處理磁盤文件的記錄。最高級磁盤處理是通過INT21H,借助于目錄和記錄的“分塊”、“解塊”來支持磁盤處理;最低級磁盤處理是通過BIOS中斷13H。DOS文件系統(tǒng)

當(dāng)為了輸入打開一個文件或為了輸出建立一個文件時,系統(tǒng)就傳遞出一個文件代號。這些操作包括使用ASCIIZ串和INT21H的功能3CH或3DH。返回在AX中的文件代號是有唯一性的一個字長的數(shù)碼,你要把這個文件代號保存在一個字?jǐn)?shù)據(jù)項中,在以后請求存取文件時就使用這個文件代號。一般情況下,第一個返回的文件代號是05。第二個是06,以此類推。系統(tǒng)為正在處理的程序的每個文件保留了一個單獨的文件指針。建立和打開文件操作把文件指針的值初始化為0,即文件的起始位置。文件指針對文件內(nèi)當(dāng)前的偏移地址不斷地進(jìn)行計算。每個讀/寫操作都會使系統(tǒng)通過傳輸?shù)淖止?jié)數(shù)對文件指針增量,然后文件指針就指向要存取的下一個記錄的位置。文件指針對順序和隨機(jī)處理都很方便。對記錄的隨機(jī)處理,程序可以使用INT21H的功能42H把文件指針設(shè)置到文件的任何位置。建立一個新文件或用相同的名字重寫一個舊文件時,首先要使用INT21H的功能3CH。把請求的文件屬性裝入AX,ASCIIZ串的地址裝入DX(新文什在磁盤上的位置)。下例在驅(qū)動器C建立個屬性為0的正常文件:PATHNAM1DB'C:ACCOUNTSFIL',00HFILHAND1DW? ;文件代號MOVAH,3CH;請求建立文件MOVCH,00;正常屬性LEADX,PATHNAM1 ;ASCIIZ串INT21H ;調(diào)用中斷服務(wù)例程JCEREOR ;出錯時的特定動作MOVFILHAND1,AX;保存文件代號到一個字中DOS文件系統(tǒng)

對一個有效的操作,系統(tǒng)用給定的屬性建立個目錄入口,清除進(jìn)位標(biāo)志,并在AX中設(shè)置文件代號。以后存取文件都使用這個文件代號。打開指定文件的同時,把文件指針設(shè)置為0,這時就可以寫文件了。如果文件在指定的路徑上已經(jīng)存在,該操作將文件長度置為0,使新文件對舊文件進(jìn)行重寫。INT21H的功能40H用于在磁盤上寫記錄。在BX中裝入保存的文件代號。CX中是要寫入的字節(jié)數(shù),DX中是輸出區(qū)的地址。下例使用文件代號完成從建文件操作到寫入QDSKAREA中的256字節(jié)的記錄:DOS文件系統(tǒng)

FILHAND1DW?,文件代號DSKAREADB256DUP(‘’);輸出區(qū)MOVAH,40H ;請求寫記錄MOVBX,F(xiàn)ILHAND1;文件代號MOVCX,256;記錄長度LEADX,DSHAREA{輸出區(qū)地址INT21H ;調(diào)用中斷服務(wù)例程JCERROR1;出錯時的特定動作CMPAX,256 ;全部字節(jié)寫完JNEERROR2;未完,則出錯DOS文件系統(tǒng)

一次有效的操作將把記錄寫到磁盤上、對文件指針增量、清除進(jìn)位標(biāo)志、并設(shè)置AX為實際寫入的字節(jié)數(shù)。一個已寫滿的磁盤可能會使實際寫入的字節(jié)數(shù)和要求寫入的字節(jié)數(shù)不同,但是因為系統(tǒng)沒有把這種情況作為一個錯誤報告,因此程序必須測試AX中的返回值。非法操作將設(shè)置進(jìn)位標(biāo)志為1,并返回給AX錯誤碼05(拒絕存取)或06(非法文件代號)。完成寫磁盤文件后,程序必須將這個文件關(guān)閉。在BX裝入文件代號,并調(diào)用INT21H的功能3EH:DOS文件系統(tǒng)

MOVAH,3EH;請求關(guān)文件MOVBX,F(xiàn)TLHAND1;文件代號INT21H;調(diào)用中斷服務(wù)例程JCERROR ;測試錯誤成功的關(guān)閉操作將仍在內(nèi)存緩沖區(qū)中的剩余記錄寫入磁盤,并用日期和文件大小修改FAT和目錄。不成功的操作將設(shè)置進(jìn)位標(biāo)志,AX中的返回碼只可能是錯誤碼06(非法文件代號)。DOS文件系統(tǒng)

讀文件的程序必須首先用INT21H的功能3DH來打開文件。這個操作通過已實際存在的文件名來檢查文件,如果存在,對程序是可用的。在DX中裝入所請求的ASCIIZ串的地址,在AL中裝入一個8位的存取代碼:DOS文件系統(tǒng)

操作目錄的常用功能:39H——創(chuàng)建目錄3BH——設(shè)置當(dāng)前目錄3AH——刪除目錄47H——讀取當(dāng)前目錄用文件句柄操作文件的常用功能:3CH——創(chuàng)建文件4EH——查找到第一個文件3DH——打開文件4FH——查找下一個文件3EH——關(guān)閉文件56H——文件換名3FH——讀文件或設(shè)備57H——讀取/設(shè)置文件的日期和時間40H——寫文件或設(shè)備5AH——創(chuàng)建臨時文件41H——刪除文件5BH——創(chuàng)建新文件42H——設(shè)置文件指針67H——設(shè)置文件句柄數(shù)(最多文件數(shù))43H——讀取/設(shè)置文件屬性6CH——擴(kuò)展的打開文件功能用FCB操作文件的常用功能:0FH——打開文件21H——隨機(jī)讀10H——關(guān)閉文件22H——隨機(jī)寫13H——刪除文件23H——讀取文件的大小14H——順序讀24H——設(shè)置相對記錄數(shù)15H——順序?qū)?7H——隨機(jī)讀塊16H——創(chuàng)建文件28H——隨機(jī)寫塊17H——文件換名磁盤絕對讀寫中斷:中斷25H——磁盤絕對讀中斷中斷26H——磁盤絕對寫中斷系統(tǒng)標(biāo)準(zhǔn)設(shè)備的句柄:0000H——鍵盤0001H——屏幕0002H——錯誤顯示(屏幕)0003H——COM10004H——打印機(jī)文件管理功能

在文件管理功能中,提供了刪除文件、文件改名、讀取和設(shè)置文件屬性、查找文件等功能調(diào)用。(1)刪除文件(2)文件更名(3)獲取、設(shè)置文件屬性(4)文件查找(1)刪除文件功能:從系統(tǒng)中刪除指定的文件。試圖刪除只讀文件或文件找不到,該功能調(diào)用失敗。該功能允許訪問子目錄中的文件。INT21H功能41使用寄存器情況如下:調(diào)用寄存器:AH41HDS:DX指向一個ASCIIZ串形成的文件描述符返回寄存器:·成功:CF清零?!な。篊F置為1,AX中為錯誤代碼。本功能刪除文件的方法是在別目錄項中把文件名的第一個字符標(biāo)識為E5H。如果刪除后沒有創(chuàng)建或改變別的文件,就可以恢復(fù):“被刪除的”文件。目錄項中其他內(nèi)容沒有任何改變,分配給該文件的簇返回給系統(tǒng)重新使用,實際文件沒有改寫。文件管理功能(2)文件更名功能:修改文件名或?qū)⑵湟苿拥酵淮疟P驅(qū)動器上的另外子目錄下。INT21H功能56H使用寄存器情況如下:調(diào)用寄存器:·成功:CF清零?!な。篊F置為1。文件管理功能(3)獲取、設(shè)置文件屬性功能:獲取或者設(shè)置文件屬性。INT21H功能43H使用寄存器情況如下:調(diào)用寄存器:AH 43HAL00H/01H 獲取文件屬性/設(shè)置文件屬性 CX文件新屬性(在設(shè)置時使用)DS:DX指向ASCIIZ串形式的文件描述符的指針返回寄存器·成功:CF清零,CX中為屬性字節(jié)?!な。篊F置為1,AX中為錯誤代碼。文件管理功能(4)文件查找用INT21H中的功能調(diào)用4EH和4FH可以完成文件的查找工作。其中4EH為搜索第一個匹配文件,而4FH在4EH的搜索基礎(chǔ)之上繼續(xù)搜索匹配的文件。1)INT21H功能4EH功能:搜索第一個匹配文件。當(dāng)找到一個與給定的ASCIIZ串相同的文件名后,在磁盤傳送區(qū)(DTA)填上搜索到的文件的信息。該功能只查找滿足屬性要求的文件。調(diào)用寄存器:AH4EHCX搜索時使用的屬性DS:DX 指向ASCIIZ串形式的文件描述符的指針,可包含通配符。返回寄存器:·成功:CF清零?!な。篊F置為1,AX中為錯誤代碼。02H文件未找到03H路徑無效12H沒有更多文件文件管理功能2)INT21H功能4FH功能:與4EH配合使用。當(dāng)成功地調(diào)用功能4EH之后,該功能繼續(xù)搜索滿足要求的文件。調(diào)用該功能時,DTA中必須保留著4EH功能調(diào)用產(chǎn)生的原始信息。通用寄存器:AH4FH返回寄存器:·成功:CF清零。·失敗:CF置為1,AX中為錯誤代碼,AX=12H表示搜索完畢沒有找到文件。該功能調(diào)用不斷更新DTA,修正其中的文件名及其他數(shù)據(jù)信息。DTA由系統(tǒng)管理,在使用4FH功能進(jìn)行連續(xù)搜索時,不允許用戶程序修改DTA,但是可以讀取DTA中的信息。文件管理功能8.3.2文件管理實例【例8-10】文件改名、刪除?!璏ESDB0DH,0AH,`THISISADELETEFILE`,0DH,0AH,`$`FILEDB`C\EXAMPLE1.ASM`,0FILENEW DB`C\EXAMPLE2.ASM`,0ERRMSG DB0DH,0AH,`ERROR`,0DH,0AH,`$`… MOVAX,@DATA MOVDS,AX MOVES,AX MOVDX,OFFSETFILE MOVDI,OFFSETFILENEW MOVAH,56H INT 21H MOVDX,OFFSETFILENEW MOVAH,41H INT 21H JC ERR JMP OK …ERR:…【例8-11】功能43H,獲取、設(shè)定文件屬性…FILENAMEDB`C:\TEST\1.TXT,0ERRMSGDB0DH,0AH,`ERROR`,0DH,0AH,`$`…START: MOV AX,@DATAMOV DS,AXMOV DX,OFFSETFILENAMEMOV AL,01HMOV CX,00HMOV AH,43HINT21HJCERR…ERR…;文件查找…FILENAMEDB`C:\TEST\*.*,0ERRMSGDB0DH,0AH,`ERROR`,0DH,0AH,`$`MYDTA DB128DUP(?),0DH,0AH,`$`……MOV AX,@DATAMOV DX,AXMOV AH,2FHINT21HPUSH BXMOV DX,OFFSETMYDTAMOV AH,1AHINT21HMOV DX,OFFSET FILENAMEMOV CX,00HMOV AH,4EHINT21HJCERRNEXT MOV DX,OFFSET MYDTAADDDX,1EHMOVAH,09HINT21HMOVAH,4FHINT21HJCNOFILEJMPNEXTNOFILE:CMPAX,12HJNZERRJMPOKERR:……OK: POPDXMOVAH,1AHINT21H【例8-12】編寫一個創(chuàng)建子目錄的程序,具體要求如下:

1)用鍵盤輸入一個目錄路徑名,若輸入的字符串為空,則程序運行結(jié)束;

2)若目錄創(chuàng)建成功,顯示成功信息,否則,顯示創(chuàng)建失敗信息。

MODELSMALL.DATADNAMEDB30,?,30DUP(?),0SMSGDB"OK",10,13,"$"FMSGDB"FAILURE",10,13,"$".CODE.STARTUPAGAIN:MOVAH,0AHLEADX,DNAMEINT21H;輸入目錄名MOVBL,DNAME+1CMPBL,0JZOVER;檢查輸入的字符串是否為空XORBH,BHMOVDNAME[BX+2],0;確保字符串以0為結(jié)束標(biāo)志MOVDX,OFFSETDNAME+2MOVAH,39HINT21H;以當(dāng)前輸入的字符串來創(chuàng)建目錄.IFCARRY?LEADX,FMSG.ELSELEADX,SMSG.ENDIFMOVAH,9HINT21HJMPAGAINOVER:.EXIT0END【例8-13】編寫一個類似TYPE命令的程序,其要求如下:

1)用鍵盤輸入文件名(可包含路徑),若輸入的字符串為空,則程序運行結(jié)束;

2)若輸入的文件存在,則顯示其內(nèi)容,否則,顯示文件不存在的信息。.MODELSMALL.DATAFNAMEDB30,?,30DUP(?),0FAILDB"NOTFOUND",10,13,"$"BUFFDB128DUP(?).CODE.STARTUPAGAIN:MOVAH,0AHLEADX,FNAMEINT21H;輸入的文件名MOVBL,FNAME+1CMPBL,0JZOVER;檢查文件名是否為空XORBH,BHMOVFNAME[BX+2],0MOVDX,OFFSETFNAME+2MOVAL,0HMOVAH,3DHINT21H;以只讀方式打開文件JNCSUCCLEADX,FAILMOVAH,9HINT21HJMPAGAINSUCC:

MOVBX,AX;把文件句柄賦給BXREAD:LEADX,BUFFMOVCX,128MOVAH,3FHINT21H;從文件中最多一次讀取128個字符CMPAX,0JZCLOSE;讀取的字符數(shù)為0JCCLOSE;讀錯誤PUSHBX;保護(hù)文件句柄MOVDX,OFFSETBUFFMOVCX,AXMOVBX,1;屏幕設(shè)備的句柄規(guī)定為1MOVAH,40HINT21H;把讀出的字符顯示在屏幕上POPBX;恢復(fù)文件句柄JMPREADCLOSE:MOVAH,3EHINT21HJMPAGAINOVER:.EXIT0END【例8-14】建立一個由用戶鍵入姓名的文件,其主要過程如下:其主要過程如下:

AIOMALN調(diào)用BCSET1,CP2,如果輸入結(jié)束調(diào)用EC3;

BCSET1用INT21H的功能3CH建立文件,并將文件代號保存在一個數(shù)據(jù)項FHD中;

CP2從鍵盤接收輸入,并把姓名之后剩余的輸入?yún)^(qū)清0;

DW02利用INT21H的功能40H寫記錄;

EC3利用INT21H的功能3EH在處理結(jié)束時關(guān)閉文件以建立相應(yīng)的記錄入口;

FD03存屏幕上顯示數(shù)據(jù)。TITLEA17CRFIL(EXB)建立姓名的磁盤文件.MODELSMALL.STACK64.DATANPR LABEL BYTE ;參數(shù)表ML DB30 ;最大長度NEEDB ? ;實際長度NERCDB30DUP(``),0DH;輸入姓名;輸入回車/換行則寫文件ECD DB00;錯誤標(biāo)識FHD DW? ;文件代號PHMEDB`C:\NAMEFILE.DAT`,0PMPTDB `NAME?`OPMSDB`***OPENERROR***`WEMSDB `***WRITEERRO

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論