屏幕處理和鍵盤輸入基本特性
《屏幕處理和鍵盤輸入基本特性》由會員分享,可在線閱讀,更多相關(guān)《屏幕處理和鍵盤輸入基本特性(79頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 第8章 屏幕處理和鍵盤輸入基本特性 8.1 中斷指令I(lǐng)NT 8.2 基本屏幕處理 8.3 鍵盤輸入 8.4 屏幕顯示和鍵盤操作(擴(kuò)充DOS) 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.1 中斷指令I(lǐng)NT 中斷指令I(lǐng)NT的功能是中斷程序的執(zhí)行,轉(zhuǎn)移到DOS或BIOS處理某一項指定工作后,再回到程序繼續(xù)執(zhí)行。中斷常用來執(zhí)行輸入或輸出操作。為了可靠地返回中斷處的程序,所有的中斷必須留下蹤跡。為了實現(xiàn)這些要求,中斷指令I(lǐng)NT執(zhí)行下列的步驟: 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 中斷指令I(lǐng)NT
2、的功能是中斷程序的執(zhí)行,轉(zhuǎn)移到DOS或BIOS處理某一項指定工作后,再回到程序繼續(xù)執(zhí)行。中斷常用來執(zhí)行輸入或輸出操作。為了可靠地返回中斷處的程序,所有的中斷必須留下蹤跡。為了實現(xiàn)這些要求,中斷指令I(lǐng)NT執(zhí)行下列的步驟: 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 (1) 將堆棧指針SP減2,再將標(biāo)志寄存器PSW內(nèi)容壓入堆棧中。 (2) TF和IF標(biāo)志位清0。 (3) 將堆棧指針SP減2,再將CS寄存器內(nèi)容壓入堆棧中。 (4) 將堆棧指針SP減2,再將指令指針寄存器IP的內(nèi)容壓入堆棧中。 (5) 執(zhí)行中斷所要求的操作。 (6) 從中斷中彈出各個寄存器的內(nèi)容,再返回到INT指令的
3、下一條指令繼續(xù)執(zhí)行。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 這些過程是自動完成的,程序員所要做的僅是定義一個足夠大的堆棧段,以確保壓入和彈出的操作能順利完成。 本章介紹兩種形式的中斷:BIOS的INT 10H,它負(fù)責(zé)屏幕處理;DOS的INT 21H負(fù)責(zé)輸出顯示和接受輸入。INT 21H通常被稱為某項操作的DOS系統(tǒng)功能調(diào)用。依照不同的需求目的,分別使用INT 10H 或INT 21H 完成不同的操作。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.2 基本屏幕處理 本節(jié)介紹較早期DOS對屏幕的處理方法。它們是設(shè)定光標(biāo)的位置、清除屏幕和顯示字符。 8.
4、2.1 設(shè)定光標(biāo)位置 屏幕是由一格一格的小方格所組成的,光標(biāo)可以設(shè)定在任意的小方格上。例如,典型的監(jiān)視器有25行(024)、80列(079)。表8-1是光標(biāo)位置的例子。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 表8-1 光 標(biāo) 位 置位置十進(jìn)制數(shù)十六進(jìn)制數(shù)行列行列左上角00 00 00 00 右上角00 79 00 4F屏幕中央12 39/40 0C 27/28左下角24 00 18 00右下角24 79 18 4F 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 INT 10H的特色是可以把光標(biāo)定在屏幕的任何位置以及清除屏幕。下面的例子是把光標(biāo)放在第5行、
5、12列的位置上。 MOV AH, 02 ;功能號定址要求 MOV BH, 00 ;第0頁 MOV DH, 05 ;第5行 MOV DL, 12 ;第12列 INT 10H ;中斷轉(zhuǎn)移至BIOS 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 AH的值02通知BIOS要設(shè)定光標(biāo),行和列的值必須放到DX寄存器中,頁數(shù)通常是0,放在BH中。其他寄存器的內(nèi)容不需要。也可以用MOV指令和十六進(jìn)制的立即數(shù)來設(shè)定光標(biāo)位置。例如: MOV DX ,050CH ;第5行、第12列 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.2.2 清除屏幕 系統(tǒng)的提示命令通常都會留在屏幕上,
6、直到新的信息顯示或屏幕向上卷動,提示命令才會消失。當(dāng)程序開始時,若想要清除屏幕,也可以從屏幕的任何位置開始清除到行和列編號較高的位置。方法是把終止行、列的值送入DX中,07送入BH中,設(shè)定AX為0600H。下面是一個清除整個屏幕的例子: 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 MOV AX,0600H ;AH=06(屏幕上卷),AL=00(整個屏幕) MOV BH,07 ;正常屬性(黑白) MOV CX,0000 ;起始位置0行、0列 MOV DX,184FH ;終止位置(24/79) INT 10H 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 上述操作
7、是把屏幕上卷成空白。假如,屏幕右下角坐標(biāo)所設(shè)定的值大于184FH,會使屏幕的卷動超過一幀畫面,造成某些地方被清除兩次,雖然這種疏忽在單色屏幕上不會造成什么傷害,但是在彩色監(jiān)視器上,可能會造成嚴(yán)重的錯誤。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.2.3 顯示字符 通常程序會顯示一些信息,以提示程序已經(jīng)完成或發(fā)生錯誤,或者提示使用者輸入信息,或說明下一步的操作。 較早期的DOS將要顯示在屏幕上的信息定義在數(shù)據(jù)段中;設(shè)定AH為09(DOS功能調(diào)用號),并且使用DOS功能調(diào)用INT 21H。要顯示的內(nèi)容以符號“$”作為結(jié)束標(biāo)志,如下所示: 第 8章 屏 幕 處 理 和 鍵 盤
8、 輸 入 基 本 特 性 NAMPRMP DB Customer name?,$ MOV AH,09 LEA DX,NAMPRMP INT 21H 符號“$”也可以直接寫在提示語句內(nèi),如Customer name?$,或?qū)懺谙乱恍小5荒苡蒙鲜龅牟僮鲗⒆址?”顯示在屏幕上。如果在提示信息后省略了符號“$”,上述指令會繼續(xù)顯示字符,直到遇到一個“$”字符為止。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 LEA指令將NAMPRMP的地址裝入DX 寄存器中,使得DOS能夠找到所要顯示的信息。LEA只是裝入NAMPRMP在數(shù)據(jù)段的偏移地址,DOS利用DS寄存器的值乘以10H加上D
9、X(DS:DX)的值,確定出存儲器的物理地址即實際地址。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.2.4 顯示ASCII碼字符集 例8.1 顯示00HFFH的ASCII字符集。 256個ASCII碼字符,大部分都能以一個符號顯示在屏幕上,因為00H和FFH沒有符號表示,所以顯示空白,但是在ASCII碼中,真正的空白是20H。程序清單如下: ; filename:L81.ASM ; 數(shù)據(jù)段 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 DATA SEGMENT CTR DB 00H, $DATA ENDS; 堆棧段STACK_ SEGMENT PARA
10、STACK STACK DW 100 DUP(?)STACK_ ENDS; 代碼段CODE SEGMENT PARA CODE 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 ; 主程序MAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK_START: PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX CALL BIOCLR CALL CIOSET 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 CALL DIODISP RET MAIN ENDP; 清除屏幕BIOCLR PROC
11、MOV AX,0600H MOV BH,07 MOV CX,0000 MOV DX,184FH INT 10H RET 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 BIOCLR ENDP; 設(shè)置光標(biāo)0行、0列CIOSET PROC MOV AH,02 MOV BH,00 MOV DX,0C28H INT 10H RET CIOSET ENDP 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 ; 顯示ASCII碼字符集DIODISP PROC MOV CX,256 LEA DX,CTRD20: CMP CTR,08H JB D30 CMP CTR,0DH JBE
12、D40 D30: MOV AH,09 INT 21H 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 D40: INC CTR LOOP D20 RETDIODISP ENDP; CODE ENDS END START 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 說明:例8.1會出現(xiàn)如下問題,符號“$”并不顯示在屏幕上;介于08H到0DH之間的字符是一些特殊的格式控制符,用來作為退位和其他的一些控制,它們將會使光標(biāo)移動。 建議:鍵入例8.1中的程序,然后編譯、鏈接,生成一個可執(zhí)行的文件,如ASCII.EXE,然后執(zhí)行該文件。 第 8章 屏 幕 處 理 和 鍵 盤
13、 輸 入 基 本 特 性 結(jié)果:屏幕上顯示的第一行,由一個空白開始(00H),然后是兩個“笑臉”(01H、02H),再接著是紅心,方塊和梅花(03H、04H和05H),07H會使喇叭響一聲,06H會顯示黑桃,但是會被08H到0DH的控制字符所清除,0DH會使光標(biāo)跳到下一行的開頭,0EH是音樂符號,7FH以上的字符都是圖形符號。 可以修改例8.1的程序,以便跳過這些控制字符。下面的一段指令可以跳過介于08H 到0DH的所有字符。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 CMP CTR,08H ;低于08H? JB D30 ;不高于/等于,則跳到顯示 CMP CTR,0DH
14、;不高于0DH? JBE D40 ;不高于,則跳過顯示D30: MOV AH,09 ;顯示低于08H高于0DH的ASCII碼字符 INT 21HD40: INC CTR 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.3 鍵 盤 輸 入 實現(xiàn)從鍵盤接受輸入的程序和顯示輸出的做法相似。對于早期DOS的輸入方法,需設(shè)置輸入?yún)^(qū)以指明輸入信息的參數(shù),使得中斷指令I(lǐng)NT能夠處理。 首先,用于輸入的中斷必須知道輸入信息的最大長度,其目的是在使用者輸入太長的信息時發(fā)出警告,并且不再接受輸入字符。其次,輸入操作會計算出真正的輸入字符的長度,共占用多少個字節(jié),并將其值 放入輸入?yún)?shù)表中。 第
15、8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.3.1 鍵盤輸入字符 下面的例子是首先為輸入定義一個參數(shù)表。LABEL是一條偽指令,類型為字節(jié)類型(BYTE),指示參數(shù)表的開始。參數(shù)表的第1個字節(jié)是限制輸入字符的最大長度,因為只占一個字節(jié),所以輸入的最大長度為FFH或255。第2個字節(jié)是留給DOS存儲真正的輸入字符長度的。從第3個字節(jié)開始,是存放輸入字符的地方。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 NAMEPAR LABEL BYTE ;參數(shù)表的開始MAXLEN DB 20 ;輸入字符的最大長度ACTLEN DB ? ;真實的輸入字符長度NAMEFLD
16、DB 20 DUP( ) ;鍵盤輸入字符的存儲處 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 此參數(shù)表的LABEL是一條偽指令,不占存儲空間。利用AH為10(0AH)的DOS功能調(diào)用(INT 21H),可以實現(xiàn)接受鍵盤輸入字符。方法是把參數(shù)表(本例中為NAMEPAR)的地址送入DX寄存器中,然后發(fā)出INT 21H 調(diào)用。 MOV AH,0AH ;請求輸入功能號為0AH LEA DX,NAMEPAR ;參數(shù)表首地址填入DX INT 21H ;DOS中斷 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 INT 21H指令會等待使用者輸入字符,并且檢查輸入字符個數(shù)是否
17、超過參數(shù)表中的最大長度(本例中是20)。當(dāng)使用者按下回車鍵(0DH)即表示結(jié)束輸入,結(jié)束符(0DH)也會跟著進(jìn)入到輸入字符欄(本例為NAMEFLD)。假如,輸入一個叫BROWN(回車Enter)的名字,則輸入?yún)?shù)表的內(nèi)容將成為:十進(jìn)制20 5 B R O 十六進(jìn)制14 05 42 52 4FW N Enter 20 20 57 4E 0D 20 20 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 此中斷操作同時也傳送回輸入名字的長度05,存入?yún)?shù)表的第2個字節(jié),在本例中為ACTLEN。回車鍵字符存放在NAMEFLD+5的位置。因為0DH是不能輸出符號的,在此以Enter表示,雖
18、然最大的輸入長度為20,但必須包含0DH,所以真正輸入的名字只能有19個字符。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.3.2 鍵盤輸入并顯示名字 例8.2 要求用戶輸入名字,并將它顯示在屏幕中央,同時發(fā)出嘟的一聲響聲。通過例8.2對8.3.1節(jié)中的內(nèi)容進(jìn)行使用。 程序清單如下: ; filename:L82.ASM;STACK_SEGMENTPARASTACKSTACKDW32DUP(?)STACK_ ENDS 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 ;DATA SEGMENTPARADATANAMEPAR LABEL BYTE;參數(shù)表開始MA
19、XNLEN DB 20;輸入名字的最大長度NAMELEN DB ? ;真正輸入名字的長度NAMEFLD DB 20DUP(), $ ;輸入名字的存放處PROMPT DB NAME?, $;提示句 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 DATA ENDS;CODESGSEGMENTPARACODEMAIN PROC FAR ASSUMECS:CODESG,DS:DATA,SS:STACK_,ES:DATABEGIN: PUSHDS SUBAX,AX PUSHAX 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 MOVAX,DATA MOVDS,AX MOVE
20、S,AX CALLQ10CLR ;清屏 A20LOOP: MOVDX,0000 ;設(shè)定光標(biāo)0行0列 CALLQ20CURS ;屏幕設(shè)置 CALLB10PRMP ;顯示提示語句 MOVCX,20 MOVSI,0000 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 B30: MOVNAMEFLDSI,20H ;字符存放單元裝入20H(空白) INCSI LOOPB30 CALLD10INPUT;輸入名字 CALLQ10CLR;清屏 CMPNAMELEN,00 JE A30 ;輸入字符長度為0,結(jié)束 CALLE10CODE;插入鈴聲與字符$ CALLF10CENT;顯示輸入的名字 第
21、 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 JMPA20LOOPA30: RETMAINENDP; 顯示提示B10PRMPPROCNEAR MOVAH,09LEADX,PROMPTINT21HRET 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 B10PRMPENDP; 接受輸入名字D10INPUTPROCNEARMOVAH,0AH;接受輸入LEADX,NAMEPARINT21HRET D10INPUTENDP 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 ; 插入鈴聲與$字符E10CODEPROCNEAR MOVBH,00 MOVBL,NAME
22、LEN ;BX中存放輸入字符的長度MOVNAMEFLDBX,07 ;回車符(0DH)由07替換 MOVNAMEFLDBX+1, $ ;07后放字符$ RETE10CODEENDP 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 ; 顯示輸入的名字F10CENTPROCNEAR MOV DL,NAMELEN;輸入字符的長度送入 DLSHRDL,1;右移1位(除以2) NEG DL;正號變更為負(fù)號 ADD DL,40;光標(biāo)列定位值MOV DH,12;光標(biāo)行定位值 CALL Q20CURS;設(shè)置光標(biāo)位置 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 MOVAH,09LE
23、ADX,NAMEFLD;顯示名字 INT21HRETF10CENTENDP ; 清屏 Q10CLR PROCNEAR MOVAX,0600H MOVBH,07 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 MOVCX,0000 MOVDX,184FH INT10HRETQ10CLRENDP ; 設(shè)置頁號與光標(biāo)位置Q20CURSPROCNEAR 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 MOVAH,02MOVBH,00INT10HRETQ20CURSENDPCODESGENDS ENDBEGIN 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 程
24、序說明如下: 1) 屏幕中央 重復(fù)執(zhí)行上述步驟,用戶通過鍵盤輸入名字,直到輸入一個回車(Enter)為止。假設(shè)輸入的名字是AI HUALIN。 (1) 將長度09除以2等于4。 (2) 從40減此值等于36。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 在子程序F10CENT中,SHR指令將長度09向右移1位,形成除以2的效果,使00001001變成00000100。NEG指令變更正負(fù)號,把+4變成-4。ADD加上40得到列的位置36,并將它存入DL寄存器中。光標(biāo)被設(shè)定在第12行、36列的位置,此時顯示在屏幕上的名字如下: (12行)AI HUALIN (列) 36 40 第
25、 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 2) 響聲 子程序E10CODE中的一條指令,是在輸入名字欄插入喇叭鳴叫的字符(07),字符07緊跟在輸入的名字之后: MOV NAMEFLDBX,07 該條指令前的兩條指令用于設(shè)定BX寄存器裝入輸入字符的長度。本條MOV指令的作用是把BX中的長度值與NAMEFLD的偏移地址相結(jié)合,并把07送到這個結(jié)合后的偏移地址單元中,如一個長度為5個字符的輸入,這條指令將把07送入NAMEFLD+05偏移地址的單元中(取代回車符0DH)。在子程序E10CODE中的最后一條指令,緊跟著07加入一個“$”,使得子程序E10CENT在顯示名 字的同時發(fā)
26、出嘟的一聲。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 3) 只輸入Enter(回車符) 假如,用戶所鍵入的名字超過參數(shù)表中給出的最大長度(本例大于19)時,系統(tǒng)會發(fā)出報警的喇叭聲,并且只能接受Enter(回車符)。但是,如果只輸入一個Enter鍵,系統(tǒng)會接受,并且在參數(shù)表中的輸入長度欄中放入一個0,如下所示: 參數(shù)表NAMEPAR(十六進(jìn)制):14 00 0D 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 在要求輸入名字的提示下,用戶可以簡單地只按下Enter鍵,來表示輸入內(nèi)容的結(jié)束,即當(dāng)輸入名字的長度為0時,本程序確定輸入內(nèi)容已結(jié)束。 4) 替換或清除E
27、nter(回車符) 為了實現(xiàn)不同的用途,可以用空格符(20H)取代 NAMEFLD中某些處的回車符(0DH)。 NAMELEN這個欄包含了輸入的真正長度,并且可以用來提供任何字符的相對偏移地址。例如,假設(shè)NAMELEN的值為5,則0DH的偏移地址是NAMEFLD+5。可以把這個長度裝入BX寄存器中,并 且利用BX當(dāng)作NAMEFLD的索引地址。如: 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 MOV BH,00 MOV BL,NAMELEN ;BX為0005 MOV NAMEFLDBX,20H ;清除回車鍵替換為空格 第3條MOV指令傳送一個空格(20H)給NAMEFLD+5單
28、元。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 5) 清除輸入?yún)^(qū)域 輸入?yún)^(qū)域的內(nèi)容將被輸入的字符所取代,而其他區(qū)域仍保留原來的字符,直到另有其他輸入字符取代它們?yōu)橹?。假設(shè)下面的例子是連續(xù)輸入的: (1) BROWN 14 05 42 52 4F 57 4E 0D 20 20 - 20 (2) HAMILTON 14 08 48 41 4D 49 4C 54 4F 4E 0D 20 (3) ADAMS 14 05 41 44 41 4D 53 0D 4F 4E 0D 20 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 HAMILTON 取代了比較短的名字BRO
29、WN。但是,因為ADAMS名字比HAMILTON名字短,所以它只能取代至HAMIL,并且T字符被回車符(0DH)所取代。殘留的字符ON,仍緊跟在ADAMS之后。良好的編程習(xí)慣是,在送出要求輸入的提示語句之前,先把NAMEFLD清為空格。如: MOV CX,20 ;重復(fù)20次 MOV SI,0000 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 B30: MOV NAMEFLDSI,20H ;給名字處存入空格字符 INC SI ;加1 LOOP B30 ;循環(huán)20次 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 若不用SI寄存器,也可以使用DI或BX寄存器。更有效
30、的方法是一次傳送一個字的空格字符,只需循環(huán)10次。但是,因為NAMEFLD被定義為DB(BYTE)的類型,所以必須用WORD和PTR(Pointer)運(yùn)算符來更改它的類型。如: MOV CX,10 ;重復(fù)10次 LEA SI,NAMEFLD ;設(shè)SI為起始地址 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 B30: MOV WORD PTRSI,2020H ;給名字處寫入2個空格 INC SI INC SI ;加2 LOOP B30 ;循環(huán)10次 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 傳送空格的字到SI間接尋址的單元,本例中用LEA指令來設(shè)定起始地址值,
31、并對于B30:的MOV指令使用了另外一些處理方法,這是由于不能將此指令寫成如下的格式: MOV WORD PTRNAMEFLD,2020H ; 不合理的指令格式 這樣,借清除輸入?yún)^(qū)域的方法,可解決輸入名字是否比上一次輸入短的困擾。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.4 屏幕顯示和鍵盤操作(擴(kuò)充DOS) 本節(jié)將要討論DOS 2.0以上版本的屏幕顯示和鍵盤操作方法。DOS以文件管理的方式管理設(shè)備,在要求I/O設(shè)備動作時,只需要把I/O設(shè)備的代號送入BX寄存器中即可。下列是標(biāo)準(zhǔn)設(shè)備號: 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 0 輸入設(shè)備,鍵盤為
32、標(biāo)準(zhǔn)輸入 1 輸出設(shè)備,顯示器為標(biāo)準(zhǔn)輸出 2 錯誤輸出設(shè)備,總是顯示器 3 輔助設(shè)備,一般為通訊設(shè)備 4 標(biāo)準(zhǔn)打印機(jī) 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 DOS中斷是INT 21H,要求功能調(diào)用的功能號碼被放至AH中;3FH的功能是輸入,40H的功能是輸出。設(shè)定CX的值為所要輸入或顯示的字節(jié)個數(shù)(長度),并且把輸入或輸出區(qū)域的偏移地址送入DX中。 當(dāng)處理的動作成功時,會把進(jìn)位標(biāo)志CF清為0,并且將真正輸入或顯示的字符個數(shù)放在AX中。當(dāng)處理動作不成功時,進(jìn)位標(biāo)志CF將被設(shè)置為1,并且會把錯誤代碼(本例為6)放入AX。因為AX的內(nèi)容可能為長度值,也可能為錯誤代碼,所以能判
33、斷錯誤情況的唯一方法是去測試進(jìn)位標(biāo)志CF,雖然鍵盤和屏幕上出現(xiàn)錯誤的情況是罕見的。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.4.1 在屏幕上顯示 下列指令說明如何使用DOS擴(kuò)充的功能,要求顯示在屏幕上。 DISAREA DB 20 DUP( ) ;顯示區(qū)域 MOV AH,40H ;要求顯示MOV BX,01 ;輸出的設(shè)備管理MOV CX,20 ;最大20個字節(jié)LEA DX,DISAREA ;顯示區(qū)域 INT 21H ;調(diào)用DOS 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 LEA把DISAREA的偏移地址裝入DX中,使得DOS能找到所要顯示的內(nèi)容。操
34、作成功時會把進(jìn)位標(biāo)志清為0,并且設(shè)定AX的值為所顯示字節(jié)的個數(shù)。不成功的操作也可能發(fā)生,其原因在于進(jìn)行了不正當(dāng)?shù)墓芾?。此操作將CF標(biāo)志設(shè)為1,并把錯誤代碼(本例為6)放入AX之中。因為AX可以為顯示字符的長度值,也可以為錯誤代碼,所以唯一能判斷錯誤情況的方法是測試CF標(biāo)志。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 練習(xí)在屏幕上顯示 讓我們利用DEBUG去檢查中斷的內(nèi)部效果。裝入DEBUG,當(dāng)它的提示符“-”出現(xiàn)時,鍵入A 100,以便在指令代碼段偏移地址100處開始輸入?yún)R編語言指令。要注意的是,DEBUG假設(shè)所有被輸入的數(shù)都是十六進(jìn)制。 100 MOV AH,40 102
35、 MOV BX,01 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 105 MOV CX,09 (輸出的長度) 108 MOV DX,10E 10B INT 21 10D RET 10E DB YOUR NAME 上面的程序段設(shè)定AH的值為40H,是要求顯示功能號,并且設(shè)定DX為10EH,這個位置是要顯示字符串“YOUR NAME”的地址,在整個程序的最后面,類型被定義成字節(jié)。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 當(dāng)鍵入完上述的指令,再按一次回車鍵,就會退出A命令。利用U命令(U 100,10D)反匯編此程序,再反復(fù)地利用R和T命令去追蹤執(zhí)行。當(dāng)執(zhí)行到
36、INT 21H指令時,也就是到達(dá)10BH位置時,它的執(zhí)行會跳往BIOS;利用G命令(G 10D)直接執(zhí)行到下一條指令。執(zhí)行完G命令后,YOUR NAME 將被顯示在屏幕上,最后利用Q命令,退出DEBUG而將控制權(quán)交還給DOS。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.4.2 從鍵盤接受輸入 下面的例子說明,如何利用DOS擴(kuò)充功能所提供的方法,實現(xiàn)從鍵盤接受輸入。 INAREA DB 20 DUP( ) ;輸入?yún)^(qū)域MOV AH,3FH ;要求輸入功能號MOV BX,00 ;對鍵盤的設(shè)備管理MOV CX,20 ;最大20個字節(jié)LEA DX,INAREA ;輸入?yún)^(qū)域 INT
37、 21H ;調(diào)用DOS 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 LEA指令將INAREA的偏移地址送入DX。INT 21H中斷會使系統(tǒng)停下來等待使用者輸入字符,但是并不檢查輸入字節(jié)是否已經(jīng)超過CX寄存器內(nèi)容的值(本例為20),鍵入回車鍵(0DH)即表示輸入的結(jié)束。例如,輸入的字符串為“PC Vsers Group”,使得INAREA 的內(nèi)容如下所示: PC Vsers Group,0D,0A 輸入的字符串后緊跟著你所輸入的Enter(0DH)和不用你輸入的換行Line Feed(0AH)。因為這種特色,輸入?yún)^(qū)域的最大數(shù)目和長度將另外附加2個字節(jié)。假如你所輸入的個數(shù)比最大長
38、度短時,在存儲器中輸入字符 的存儲位置將和上面的例子相同。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 當(dāng)處理動作成功時,將把CF標(biāo)志清為0(通過測試可得知),并且把輸入字節(jié)的個數(shù)放入AX中。在先前的例子中,長度為14,加上Enter和Line Feed兩個字節(jié),也可以說長度為16。如前所述,程序可以確定字符的真正長度。 因為對設(shè)備管理的錯誤,也有可能出現(xiàn)不成功的處理情形。當(dāng)這種情況發(fā)生時,會將CF標(biāo)志設(shè)為1,并把錯誤代碼(本例為6)放入AX中。因為AX可為輸入字符的長度,也可以為錯誤代碼,所以唯一能確定是否發(fā)生錯誤情況的方法是測試CF標(biāo)志的值。 第 8章 屏 幕 處 理 和
39、 鍵 盤 輸 入 基 本 特 性 假如,所輸入的名字超過CX寄存器的值時,這個處理動作將會接受所有字符。假設(shè)CX的內(nèi)容為08,而使用者輸入的字符串為“PC EXCHANGE”,上述的動作會將前面8個字符“PC EXCHA”放入輸入?yún)^(qū)域,在字符“A”后并沒有附加Enter和Line Feed兩個字符,并且AX的值為08。當(dāng)遇到下一個INT中斷時,它所接受的名字并不是由鍵盤輸入的,而是緩沖器(BUFFER)內(nèi)的字符串,這是因為此時緩沖器(BUFFER)內(nèi)仍殘留著上一次輸入的字符串。輸入?yún)^(qū)域的內(nèi)容將變成“NGE”加上Enter和Line Feed,AX被設(shè)置為5。上述的兩個動作都是正常的,并且將CF
40、標(biāo)志清為0。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 第一次 INT 21H:PC EXCHA AX=08 第二次 INT 21H:NGE 0D 0A AX=05 當(dāng)一個程序告知使用者,他所輸入的字符個數(shù)是正確的,它必須符合下列兩個條件:AX的值小于CX的值;AX的值等于CX的值,并且輸入?yún)^(qū)域最后的兩個字符為0D和0A。 早期的DOS對于鍵盤輸入調(diào)用功能0AH,因為具有內(nèi)在的檢查能力,所以能提供一個功能更強(qiáng)的操作方法,至少在輸入文字方面,它是一個較佳的選擇。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 練習(xí)輸入資料 在此提供一個練習(xí),使你能在DEBUG之
41、下觀察輸入資料所造成的影響。這個程序允許你輸入12個字符,包括Enter和Line Feed。裝入DEBUG,當(dāng)提示符“-”出現(xiàn)時,鍵入A 100,表示在指令代碼段位置100處開始輸入?yún)R編語言指令。DEBUG狀態(tài)下的數(shù)字,都被認(rèn)為是十六進(jìn)制。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 100 MOV AH,3F 102 MOV BX,00 105 MOV CX,0C 108 MOV DX,10F 10B INT 21 10D JMP 100 10F DB 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 上述程序段設(shè)定AH和BX的值,要求作鍵盤輸入操作,CX的值
42、是輸入的最大長度,DX被設(shè)定為10FH程序最后一條指令DB的位置;輸入的字符將被存儲在10FH開始的地址位置處。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 當(dāng)你用A命令鍵入完上述指令,再按一次Enter鍵,就會退出A命令。用U命令(U100,10D)去反匯編這段程序。利用R命令、重復(fù)使用T命令,去追蹤前面四條MOV指令所執(zhí)行的結(jié)果。當(dāng)執(zhí)行位置到達(dá)10BH時,利用G 10DH跳過中斷指令(不必追蹤BIOS的執(zhí)行過程)。DEBUG會等待著,讓你輸入字符,并以Enter告知輸入結(jié)束。檢查AX寄存器的內(nèi)容和進(jìn)位標(biāo)志變化的情況,并利用D 10F顯示輸入字符存放在存儲器中的情況。你可以
43、多次地重復(fù)這些動作。最后利用Q命令退出DEBUG。 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 8.4.3 利用Enter、Line Feed和TAB在屏幕上顯示 利用Enter、Line Feed和TAB字符,可讓顯示在屏幕上的字符串更有可讀性,它們分別為回車、換行和跳格。你可使用ASCII格式、十進(jìn)制或十六進(jìn)制來表示這些字符, 例如: ASCII格式 十進(jìn)制 十六進(jìn)制 CR(Enter) 13 0D LF(Line Feed) 10 0A TAB 09 09 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 在低版本DOS或擴(kuò)充版本DOS之下,當(dāng)需要顯示在屏幕
44、上或接受輸入時,都可以利用這些字符,使得光標(biāo)自動地跳到下一行的起始位置。例如: MOV AH,40H ;要求顯示功能 MOV BX,01 ;屏幕處理 MOV CX,31 ;最大輸出長度 LEA DX,MESSAG1 ;顯示的資料位置 INT 21H ;調(diào)用DOS 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 為增強(qiáng)上述程序的可讀性,可以利用EQU偽指令來定義處理字符,進(jìn)行修飾。例如:CR EQU 13 或 EQU 0DHLF EQU 10 或 EQU 0AHTAB EQU 09 或 EQU 09HMESSAGE DB TAB,PC Users Group Annual Repo
45、rt,CR,LF 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 例8.3 在屏幕上顯示字符“PC Users Group Annual Report”。程序清單如下:;filename:L83.ASM ;DATA SEGMENTMESSAGE DB TAB,PC Users Group Annual Report,CR,LFDATA ENDS; STACK_ SEGMENT PARA STACK STACK 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 DB 100 DUP(?)STACK_ ENDS;CODE SEGMENT CR EQU 13 LF EQU 10 TAB EQU 09 ASSUME CS:CODE,DS:DATA,SS:STACK_ 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 BEG:MOV AX,STACK_ MOV SS,AX MOV SP,100 MOV AX,DATA MOV DS,AX MOV AH,40H MOV BX,01 MOV CX,31 第 8章 屏 幕 處 理 和 鍵 盤 輸 入 基 本 特 性 LEA DX,MESSAGE INT 21H MOV AH,4CH INT 21HCODE ENDS END BEG
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。