《屏幕处理和键盘输入基本特性》由会员分享,可在线阅读,更多相关《屏幕处理和键盘输入基本特性(79页珍藏版)》请在金锄头文库上搜索。
1、第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 第第8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.1 中断指令中断指令INT 8.2 基本屏幕处理基本屏幕处理 8.3 键盘输入键盘输入 8.4 屏幕显示和键盘操作屏幕显示和键盘操作(扩充扩充DOS) 第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.1 中断指令中断指令INT中断指令INT的功能是中断程序的执行,转移到DOS或BIOS处理某一项指定工作后,再回到程序继续执行。中断常用来执行输入或输出操作。为了可靠地返回中断处的程序,所有的中断必须留下踪迹。为了实现这些要求,中断指
2、令INT执行下列的步骤:第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 中断指令INT的功能是中断程序的执行,转移到DOS或BIOS处理某一项指定工作后,再回到程序继续执行。中断常用来执行输入或输出操作。为了可靠地返回中断处的程序,所有的中断必须留下踪迹。为了实现这些要求,中断指令INT执行下列的步骤:第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 (1)将堆栈指针SP减2,再将标志寄存器PSW内容压入堆栈中。(2)TF和IF标志位清0。(3)将堆栈指针SP减2,再将CS寄存器内容压入堆栈中。(4)将堆栈指针SP减2,再将指令指针寄存器IP的内容压入
3、堆栈中。(5)执行中断所要求的操作。(6)从中断中弹出各个寄存器的内容,再返回到INT指令的下一条指令继续执行。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 这些过程是自动完成的,程序员所要做的仅是定义一个足够大的堆栈段,以确保压入和弹出的操作能顺利完成。本章介绍两种形式的中断:BIOS的INT10H,它负责屏幕处理;DOS的INT21H负责输出显示和接受输入。INT21H通常被称为某项操作的DOS系统功能调用。依照不同的需求目的,分别使用INT10H或INT21H完成不同的操作。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.2 基本屏幕处理
4、基本屏幕处理本节介绍较早期DOS对屏幕的处理方法。它们是设定光标的位置、清除屏幕和显示字符。 8.2.1 设定光标位置屏幕是由一格一格的小方格所组成的,光标可以设定在任意的小方格上。例如,典型的监视器有25行(024)、80列(079)。表8-1是光标位置的例子。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 表8-1 光 标 位 置位置十进制数十六进制数行列行列左上角00000000右上角0079004F屏幕中央1239/400C27/28左下角24001800右下角2479184F第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 INT10H的特色
5、是可以把光标定在屏幕的任何位置以及清除屏幕。下面的例子是把光标放在第5行、12列的位置上。MOVAH,02;功能号定址要求MOVBH,00;第0页MOVDH,05;第5行MOVDL,12;第12列INT10H;中断转移至BIOS第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 AH的值02通知BIOS要设定光标,行和列的值必须放到DX寄存器中,页数通常是0,放在BH中。其他寄存器的内容不需要。也可以用MOV指令和十六进制的立即数来设定光标位置。例如:MOVDX,050CH;第5行、第12列第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.2.2 清除
6、屏幕系统的提示命令通常都会留在屏幕上,直到新的信息显示或屏幕向上卷动,提示命令才会消失。当程序开始时,若想要清除屏幕,也可以从屏幕的任何位置开始清除到行和列编号较高的位置。方法是把终止行、列的值送入DX中,07送入BH中,设定AX为0600H。下面是一个清除整个屏幕的例子:第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 MOVAX,0600H;AH=06(屏幕上卷),AL=00(整个屏幕)MOVBH,07;正常属性(黑白)MOVCX,0000;起始位置0行、0列MOVDX,184FH;终止位置(24/79)INT10H第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键
7、盘输入基本特性 上述操作是把屏幕上卷成空白。假如,屏幕右下角坐标所设定的值大于184FH,会使屏幕的卷动超过一帧画面,造成某些地方被清除两次,虽然这种疏忽在单色屏幕上不会造成什么伤害,但是在彩色监视器上,可能会造成严重的错误。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.2.3 显示字符通常程序会显示一些信息,以提示程序已经完成或发生错误,或者提示使用者输入信息,或说明下一步的操作。较早期的DOS将要显示在屏幕上的信息定义在数据段中;设定AH为09(DOS功能调用号),并且使用DOS功能调用INT21H。要显示的内容以符号“$”作为结束标志,如下所示:第第8 8章章
8、 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 NAMPRMPDB Customername?,$MOV AH,09LEA DX,NAMPRMPINT 21H符号“$”也可以直接写在提示语句内,如Customername?$,或写在下一行。但不能用上述的操作将字符“$”显示在屏幕上。如果在提示信息后省略了符号“$”,上述指令会继续显示字符,直到遇到一个“$”字符为止。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 LEA指令将NAMPRMP的地址装入DX寄存器中,使得DOS能够找到所要显示的信息。LEA只是装入NAMPRMP在数据段的偏移地址,DOS利用DS寄存器
9、的值乘以10H加上DX(DS:DX)的值,确定出存储器的物理地址即实际地址。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.2.4 显示ASCII码字符集例8.1显示00HFFH的ASCII字符集。256个ASCII码字符,大部分都能以一个符号显示在屏幕上,因为00H和FFH没有符号表示,所以显示空白,但是在ASCII码中,真正的空白是20H。程序清单如下:;filename:L81.ASM; 数据段第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 DATASEGMENTCTRDB00H,$DATAENDS;堆栈段STACK_SEGMENTPARA
10、STACKSTACKDW100DUP(?)STACK_ENDS;代码段CODESEGMENTPARACODE第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 ; 主程序MAINPROCFARASSUMECS:CODE,DS:DATA,SS:STACK_START:PUSHDSSUBAX,AXPUSHAXMOVAX,DATAMOVDS,AXCALLBIOCLRCALLCIOSET第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 CALLDIODISPRETMAINENDP;清除屏幕BIOCLRPROCMOVAX,0600HMOVBH,07MOVCX,000
11、0MOVDX,184FHINT10HRET第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 BIOCLRENDP;设置光标0行、0列CIOSETPROCMOVAH,02MOVBH,00MOVDX,0C28HINT10HRETCIOSETENDP第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 ;显示ASCII码字符集DIODISPPROCMOVCX,256LEADX,CTRD20:CMPCTR,08HJBD30CMPCTR,0DHJBED40D30:MOVAH,09INT21H第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 D40:
12、INCCTRLOOPD20RETDIODISPENDP;CODEENDSENDSTART第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 说明:例8.1会出现如下问题,符号“$”并不显示在屏幕上;介于08H到0DH之间的字符是一些特殊的格式控制符,用来作为退位和其他的一些控制,它们将会使光标移动。建议:键入例8.1中的程序,然后编译、链接,生成一个可执行的文件,如ASCII.EXE,然后执行该文件。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 结果:屏幕上显示的第一行,由一个空白开始(00H),然后是两个“笑脸”(01H、02H),再接着是红心,方块
13、和梅花(03H、04H和05H),07H会使喇叭响一声,06H会显示黑桃,但是会被08H到0DH的控制字符所清除,0DH会使光标跳到下一行的开头,0EH是音乐符号,7FH以上的字符都是图形符号。可以修改例8.1的程序,以便跳过这些控制字符。下面的一段指令可以跳过介于08H到0DH的所有字符。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 CMPCTR,08H;低于08H?JBD30;不高于/等于,则跳到显示CMPCTR,0DH;不高于0DH?JBED40;不高于,则跳过显示D30:MOVAH,09;显示低于08H高于0DH的ASCII码字符INT21HD40:INCCTR
14、第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.3 键键 盘盘 输输 入入实现从键盘接受输入的程序和显示输出的做法相似。对于早期DOS的输入方法,需设置输入区以指明输入信息的参数,使得中断指令INT能够处理。首先,用于输入的中断必须知道输入信息的最大长度,其目的是在使用者输入太长的信息时发出警告,并且不再接受输入字符。其次,输入操作会计算出真正的输入字符的长度,共占用多少个字节,并将其值放入输入参数表中。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.3.1 键盘输入字符下面的例子是首先为输入定义一个参数表。LABEL是一条伪指令,类型为字节
15、类型(BYTE),指示参数表的开始。参数表的第1个字节是限制输入字符的最大长度,因为只占一个字节,所以输入的最大长度为FFH或255。第2个字节是留给DOS存储真正的输入字符长度的。从第3个字节开始,是存放输入字符的地方。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 NAMEPARLABELBYTE;参数表的开始MAXLENDB20;输入字符的最大长度ACTLENDB?;真实的输入字符长度NAMEFLDDB20DUP();键盘输入字符的存储处第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 此参数表的LABEL是一条伪指令,不占存储空间。利用AH为1
16、0(0AH)的DOS功能调用(INT21H),可以实现接受键盘输入字符。方法是把参数表(本例中为NAMEPAR)的地址送入DX寄存器中,然后发出INT21H调用。MOVAH,0AH;请求输入功能号为0AHLEADX,NAMEPAR;参数表首地址填入DXINT21H;DOS中断第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 INT21H指令会等待使用者输入字符,并且检查输入字符个数是否超过参数表中的最大长度(本例中是20)。当使用者按下回车键(0DH)即表示结束输入,结束 符 (0DH)也 会 跟 着 进 入 到 输 入 字 符 栏 (本 例 为NAMEFLD)。假如,输入
17、一个叫BROWN(回车Enter)的名字,则输入参数表的内容将成为:十进制205BRO十六进制140542524FWNEnter2020574E0D2020第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 此中断操作同时也传送回输入名字的长度05,存入参数表的第2个字节,在本例中为ACTLEN。回车键字符存放在NAMEFLD+5的位置。因为0DH是不能输出符号的,在此以Enter表示,虽然最大的输入长度为20,但必须包含0DH,所以真正输入的名字只能有19个字符。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.3.2 键盘输入并显示名字例8.2要求
18、用户输入名字,并将它显示在屏幕中央,同时发出嘟的一声响声。通过例8.2对8.3.1节中的内容进行使用。程序清单如下: ; filename:L82.ASM;STACK_SEGMENTPARASTACKSTACKDW32DUP(?)STACK_ENDS第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 ;DATA SEGMENTPARADATANAMEPAR LABEL BYTE;参数表开始MAXNLEN DB 20;输入名字的最大长度NAMELEN DB ? ;真正输入名字的长度NAMEFLD DB 20DUP(), $ ;输入名字的存放处PROMPT DB NAME?, $
19、 ;提示句第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 DATA ENDS;CODESGSEGMENTPARACODEMAIN PROC FAR ASSUMECS:CODESG,DS:DATA,SS:STACK_,ES:DATABEGIN: PUSHDS SUBAX,AX PUSHAX第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 MOVAX,DATA MOVDS,AX MOVES,AX CALLQ10CLR ;清屏 A20LOOP: MOVDX,0000 ;设定光标0行0列 CALLQ20CURS ;屏幕设置 CALLB10PRMP ;显示提示语
20、句 MOVCX,20 MOVSI,0000第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 B30: MOVNAMEFLDSI,20H ;字符存放单元装入20H(空白) INCSI LOOPB30 CALLD10INPUT;输入名字 CALLQ10CLR;清屏 CMPNAMELEN,00JEA30;输入字符长度为0,结束 CALLE10CODE;插入铃声与字符$ CALLF10CENT;显示输入的名字第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 JMPA20LOOPA30: RETMAINENDP; 显示提示B10PRMPPROCNEAR MOVAH
21、,09LEADX,PROMPTINT21HRET第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 B10PRMPENDP; 接受输入名字D10INPUTPROCNEARMOVAH,0AH;接受输入LEADX,NAMEPARINT21HRETD10INPUTENDP第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 ; 插入铃声与$字符E10CODEPROCNEAR MOVBH,00 MOVBL,NAMELEN ;BX中存放输入字符的长度MOVNAMEFLDBX,07 ;回车符(0DH)由07替换MOVNAMEFLDBX+1, $ ;07后放字符$ RETE
22、10CODEENDP第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 ; 显示输入的名字F10CENTPROCNEAR MOV DL,NAMELEN;输入字符的长度送入 DLSHRDL,1 ;右移1位(除以2)NEG DL;正号变更为负号 ADD DL,40;光标列定位值MOV DH,12;光标行定位值 CALL Q20CURS;设置光标位置第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 MOVAH,09LEADX,NAMEFLD;显示名字INT21HRETF10CENTENDP ; 清屏 Q10CLRPROCNEAR MOVAX,0600H MOVB
23、H,07第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 MOVCX,0000 MOVDX,184FH INT10HRETQ10CLRENDP ; 设置页号与光标位置Q20CURSPROCNEAR第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 MOVAH,02MOVBH,00INT10HRETQ20CURSENDPCODESGENDS ENDBEGIN第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 程序说明如下:1)屏幕中央重复执行上述步骤,用户通过键盘输入名字,直到输入一个回车(Enter)为止。假设输入的名字是AIHUALIN
24、。(1)将长度09除以2等于4。(2)从40减此值等于36。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 在子程序F10CENT中,SHR指令将长度09向右移1位,形成除以2的效果,使00001001变成00000100。NEG指令变更正负号,把+4变成-4。ADD加上40得到列的位置36,并将它存入DL寄存器中。光标被设定在第12行、36列的位置,此时显示在屏幕上的名字如下:(12行)AIHUALIN(列)3640第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 2)响声子程序E10CODE中的一条指令,是在输入名字栏插入喇叭鸣叫的字符(07),字
25、符07紧跟在输入的名字之后:MOVNAMEFLDBX,07该条指令前的两条指令用于设定BX寄存器装入输入字符的长度。本条MOV指令的作用是把BX中的长度值与NAMEFLD的偏移地址相结合,并把07送到这个结合后的偏移地址单元中,如一个长度为5个字符的输入,这条指令将把07送入NAMEFLD+05偏移地址的单元中(取代回车符0DH)。在子程序E10CODE中的最后一条指令,紧跟着07加入一个“$”,使得子程序E10CENT在显示名字的同时发出嘟的一声。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 3)只输入Enter(回车符)假如,用户所键入的名字超过参数表中给出的最大长
26、度(本例大于19)时,系统会发出报警的喇叭声,并且只能接受Enter(回车符)。但是,如果只输入一个Enter键,系统会接受,并且在参数表中的输入长度栏中放入一个0,如下所示:参数表NAMEPAR(十六进制):14000D第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 在要求输入名字的提示下,用户可以简单地只按下Enter键,来表示输入内容的结束,即当输入名字的长度为0时,本程序确定输入内容已结束。4)替换或清除Enter(回车符)为了实现不同的用途,可以用空格符(20H)取代NAMEFLD中某些处的回车符(0DH)。NAMELEN这个栏包含了输入的真正长度,并且可以用来
27、提供任何字符的相对偏移地址。例如,假设NAMELEN的值为5,则0DH的偏移地址是NAMEFLD+5。可以把这个长度装入BX寄存器中,并且利用BX当作NAMEFLD的索引地址。如:第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 MOVBH,00MOVBL,NAMELEN;BX为0005MOVNAMEFLDBX,20H;清除回车键替换为空格第3条MOV指令传送一个空格(20H)给NAMEFLD+5单元。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 5)清除输入区域输入区域的内容将被输入的字符所取代,而其他区域仍保留原来的字符,直到另有其他输入字符取代
28、它们为止。假设下面的例子是连续输入的:(1)BROWN140542524F574E0D2020-20(2)HAMILTON140848414D494C544F4E0D20(3)ADAMS14054144414D530D4F4E0D20第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 HAMILTON取代了比较短的名字BROWN。但是,因为ADAMS名字比HAMILTON名字短,所以它只能取代至HAMIL,并且T字符被回车符(0DH)所取代。残留的字符ON,仍紧跟在ADAMS之后。良好的编程习惯是,在送出要求输入的提示语句之前,先把NAMEFLD清为空格。如:MOV CX,2
29、0;重复20次MOVSI,0000第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 B30:MOV NAMEFLDSI,20H;给名字处存入空格字符INCSI;加1LOOP B30;循环20次第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 若不用SI寄存器,也可以使用DI或BX寄存器。更有效的方法是一次传送一个字的空格字符,只需循环10次。但是,因为NAMEFLD被定义为DB(BYTE)的类型,所以必须用WORD和PTR(Pointer)运算符来更改它的类型。如:MOVCX,10;重复10次LEASI,NAMEFLD ;设SI为起始地址第第8 8章章
30、屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 B30:MOVWORDPTRSI,2020H;给名字处写入2个空格INCSIINCSI;加2LOOPB30;循环10次第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 传送空格的字到SI间接寻址的单元,本例中用LEA指令来设定起始地址值,并对于B30:的MOV指令使用了另外一些处理方法,这是由于不能将此指令写成如下的格式:MOVWORDPTRNAMEFLD,2020H;不合理的指令格式这样,借清除输入区域的方法,可解决输入名字是否比上一次输入短的困扰。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性
31、8.4 屏幕显示和键盘操作屏幕显示和键盘操作(扩充扩充DOS)本节将要讨论DOS2.0以上版本的屏幕显示和键盘操作方法。DOS以文件管理的方式管理设备,在要求I/O设备动作时,只需要把I/O设备的代号送入BX寄存器中即可。下列是标准设备号:第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 0输入设备,键盘为标准输入1输出设备,显示器为标准输出2错误输出设备,总是显示器3辅助设备,一般为通讯设备4标准打印机第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 DOS中断是INT21H,要求功能调用的功能号码被放至AH中;3FH的功能是输入,40H的功能是输出。
32、设定CX的值为所要输入或显示的字节个数(长度),并且把输入或输出区域的偏移地址送入DX中。当处理的动作成功时,会把进位标志CF清为0,并且将真正输入或显示的字符个数放在AX中。当处理动作不成功时,进位标志CF将被设置为1,并且会把错误代码(本例为6)放入AX。因为AX的内容可能为长度值,也可能为错误代码,所以能判断错误情况的唯一方法是去测试进位标志CF,虽然键盘和屏幕上出现错误的情况是罕见的。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.4.1 在屏幕上显示下列指令说明如何使用DOS扩充的功能,要求显示在屏幕上。DISAREADB20DUP();显示区域MOVAH,
33、40H;要求显示MOVBX,01;输出的设备管理MOVCX,20;最大20个字节LEADX,DISAREA ;显示区域INT21H;调用DOS第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 LEA把DISAREA的偏移地址装入DX中,使得DOS能找到所要显示的内容。操作成功时会把进位标志清为0,并且设定AX的值为所显示字节的个数。不成功的操作也可能发生,其原因在于进行了不正当的管理。此操作将CF标志设为1,并把错误代码(本例为6)放入AX之中。因为AX可以为显示字符的长度值,也可以为错误代码,所以唯一能判断错误情况的方法是测试CF标志。第第8 8章章 屏幕处理和键盘输入基
34、本特性屏幕处理和键盘输入基本特性 练习在屏幕上显示让我们利用DEBUG去检查中断的内部效果。装入DEBUG,当它的提示符“-”出现时,键入A 100,以便在指令代码段偏移地址100处开始输入汇编语言指令。要注意的是,DEBUG假设所有被输入的数都是十六进制。100MOVAH,40102MOVBX,01第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 105MOVCX,09(输出的长度)108MOVDX,10E10BINT2110DRET10EDBYOURNAME上面的程序段设定AH的值为40H,是要求显示功能号,并且设定DX为10EH,这个位置是要显示字符串“YOURNAM
35、E”的地址,在整个程序的最后面,类型被定义成字节。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 当键入完上述的指令,再按一次回车键,就会退出A命令。利用U命令(U100,10D)反汇编此程序,再反复地利用R和T命令去追踪执行。当执行到INT21H指令时,也就是到达10BH位置时,它的执行会跳往BIOS;利用G命令(G10D)直接执行到下一条指令。执行完G命令后,YOURNAME将被显示在屏幕上,最后利用Q命令,退出DEBUG而将控制权交还给DOS。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.4.2 从键盘接受输入下面的例子说明,如何利用DO
36、S扩充功能所提供的方法,实现从键盘接受输入。INAREADB20DUP();输入区域MOVAH,3FH;要求输入功能号MOVBX,00;对键盘的设备管理MOVCX,20;最大20个字节LEADX,INAREA;输入区域INT21H;调用DOS第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 LEA指令将INAREA的偏移地址送入DX。INT21H中断会使系统停下来等待使用者输入字符,但是并不检查输入字节是否已经超过CX寄存器内容的值(本例为20),键入回车键(0DH)即表示输入的结束。例如,输入的字符串为“PCVsersGroup”,使得INAREA的内容如下所示:PCVs
37、ersGroup,0D,0A输入的字符串后紧跟着你所输入的Enter(0DH)和不用你输入的换行LineFeed(0AH)。因为这种特色,输入区域的最大数目和长度将另外附加2个字节。假如你所输入的个数比最大长度短时,在存储器中输入字符的存储位置将和上面的例子相同。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 当处理动作成功时,将把CF标志清为0(通过测试可得知),并且把输入字节的个数放入AX中。在先前的例子中,长度为14,加上Enter和LineFeed两个字节,也可以说长度为16。如前所述,程序可以确定字符的真正长度。因为对设备管理的错误,也有可能出现不成功的处理情形
38、。当这种情况发生时,会将CF标志设为1,并把错误代码(本例为6)放入AX中。因为AX可为输入字符的长度,也可以为错误代码,所以唯一能确定是否发生错误情况的方法是测试CF标志的值。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 假如,所输入的名字超过CX寄存器的值时,这个处理动作将会接受所有字符。假设CX的内容为08,而使用者输入的字符串为“PCEXCHANGE”,上述的动作会将前面8个字符“PCEXCHA”放入输入区域,在字符“A”后并没有附加Enter和LineFeed两个字符,并且AX的值为08。当遇到下一个INT中断时,它所接受的名字并不是由键盘输入的,而是缓冲器(
39、BUFFER)内的字符串,这是因为此时缓冲器(BUFFER)内仍残留着上一次输入的字符串。输入区域的内容将变成“NGE”加上Enter和LineFeed,AX被设置为5。上述的两个动作都是正常的,并且将CF标志清为0。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 第一次INT21H:PCEXCHAAX=08第二次INT21H:NGE0D0AAX=05当一个程序告知使用者,他所输入的字符个数是正确的,它必须符合下列两个条件:AX的值小于CX的值;AX的值等于CX的值,并且输入区域最后的两个字符为0D和0A。早期的DOS对于键盘输入调用功能0AH,因为具有内在的检查能力,所
40、以能提供一个功能更强的操作方法,至少在输入文字方面,它是一个较佳的选择。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 练习输入资料在此提供一个练习,使你能在DEBUG之下观察输入资料所造成的影响。这个程序允许你输入12个字符,包括Enter和LineFeed。装入DEBUG,当提示符“-”出现时,键入A100,表示在指令代码段位置100处开始输入汇编语言指令。DEBUG状态下的数字,都被认为是十六进制。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 100MOVAH,3F102MOVBX,00105MOVCX,0C108MOVDX,10F10BIN
41、T2110DJMP10010FDB第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 上述程序段设定AH和BX的值,要求作键盘输入操作,CX的值是输入的最大长度,DX被设定为10FH程序最后一条指令DB的位置;输入的字符将被存储在10FH开始的地址位置处。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 当你用A命令键入完上述指令,再按一次Enter键,就会退出A命令。用U命令(U100,10D)去反汇编这段程序。利用R命令、重复使用T命令,去追踪前面四条MOV指令所执行的结果。当执行位置到达10BH时,利用G10DH跳过中断指令(不必追踪BIOS的执行过
42、程)。DEBUG会等待着,让你输入字符,并以Enter告知输入结束。检查AX寄存器的内容和进位标志变化的情况,并利用D10F显示输入字符存放在存储器中的情况。你可以多次地重复这些动作。最后利用Q命令退出DEBUG。第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 8.4.3 利用Enter、Line Feed和TAB在屏幕上显示利用Enter、LineFeed和TAB字符,可让显示在屏幕上的字符串更有可读性,它们分别为回车、换行和跳格。你可使用ASCII格式、十进制或十六进制来表示这些字符,例如:ASCII格式十进制十六进制CR(Enter)130DLF(LineFeed)
43、100ATAB0909第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 在低版本DOS或扩充版本DOS之下,当需要显示在屏幕上或接受输入时,都可以利用这些字符,使得光标自动地跳到下一行的起始位置。例如:MOVAH,40H;要求显示功能MOVBX,01;屏幕处理MOVCX,31;最大输出长度LEADX,MESSAG1;显示的资料位置INT21H;调用DOS第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 为增强上述程序的可读性,可以利用EQU伪指令来定义处理字符,进行修饰。例如:CREQU13或EQU0DHLFEQU10或EQU0AHTABEQU09或EQ
44、U09HMESSAGEDBTAB,PCUsersGroupAnnualReport,CR,LF第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 例8.3 在屏幕上显示字符“PCUsersGroupAnnualReport”。程序清单如下:;filename:L83.ASM;DATASEGMENTMESSAGEDBTAB,PCUsersGroupAnnualReport,CR,LFDATAENDS;STACK_SEGMENTPARASTACKSTACK第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 DB100DUP(?)STACK_ENDS;CODESEGMENTCREQU13LFEQU10TABEQU09ASSUMECS:CODE,DS:DATA,SS:STACK_第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 BEG:MOVAX,STACK_MOVSS,AXMOVSP,100MOVAX,DATAMOVDS,AXMOVAH,40HMOVBX,01MOVCX,31第第8 8章章 屏幕处理和键盘输入基本特性屏幕处理和键盘输入基本特性 LEADX,MESSAGEINT21HMOVAH,4CHINT21HCODEENDSENDBEG