首页 理论教育 微型计算机原理:提问及回答

微型计算机原理:提问及回答

时间:2023-11-03 理论教育 版权反馈
【摘要】:如果用户键入的字符串长度已经超过了缓冲区第一个字节给出的最大字符数,则DOS将拒绝接受多余的字符并响铃提示。由于DOS功能调用的0A号功能使用一个字节表示字符串的最大长度,使用该功能输入的字符串长度不可能超过255个字节。DOS功能调用的6号功能同时提供了屏幕输出和键盘输入的能力,而执行哪项功能则由DL寄存器的内容决定。表4-5 INT 16H指令的三个基本键盘操作功能这三个操作提供的功能比DOS功能调用所提供的功能更加基本。

微型计算机原理:提问及回答

DOS功能调用的2、6、9号功能和INT 10H BIOS视频中断提供了屏幕输出的能力,而紧接着“Hello,world!”程序的下一个程序将是“What’s your name?”,用来展示键盘输入的功能。

DOS操作系统提供了一系列的键盘操作能力,这些键盘操作能力由表4-4中的DOS功能调用完成。

4-4 DOS操作系统的键盘操作功能

978-7-111-46342-9-Chapter04-38.jpg

下面的程序段就可以实现从键盘读入一个字符的功能:

978-7-111-46342-9-Chapter04-39.jpg

这段程序执行时,将先在屏幕上输出一句“Are you sure?(y/n)”,然后等待用户输入一个字符,并判断该字符是否是小写字母‘y’,再根据判断结果进行不同的操作。这里用来从键盘读入一个字符的就是DOS功能调用的1号功能,它将等待用户从键盘输入一个字符,并将这个字符的字符码(ASCⅡ码)存放在AL寄存器返回给主程序。

DOS功能调用的1号功能在读入字符的同时会将这个字符显示在屏幕上(回显)。而在某些时候,比如输入密码的时候,回显是不可接受的。这时DOS功能调用的7号和8号功能就可以提供输入字符但不回显的能力,其接口与1号功能相同。7号功能和8号功能的区别在于对<Ctrl+Break>组合键的检测上,7号功能不检测该组合键,而8号功能调用等待用户输入字符时如果<Ctrl+Break>组合键被按下则会被检测并最终触发DOS软中断INT 23H。

很显然,在循环语句的配合下1、7、8号DOS功能调用就可以实现从键盘读入一个字符串的功能,但这需要比较烦琐的程序设计。为了减少程序设计的工作量,DOS功能调用提供了0AH号功能,提供从键盘读入一个字符串的能力。DOS功能调用的0A号功能的接口如下:

AH=0AH

DS:DX=缓冲区首地址

在DS:DX指向的缓冲区中,第一个字节应当在调用DOS功能调用的0AH号功能之前被设置为缓冲区可以容纳的最大字符数,第二个字节将被DOS功能调用的0AH号功能填入实际读入的字符数(不包括输入的回车),在INT 21H指令被执行后,DOS将等待用户从键盘输入一个字符串,并以回车表示字符串输入的结束。如果用户键入的字符串长度已经超过了缓冲区第一个字节给出的最大字符数,则DOS将拒绝接受多余的字符并响铃提示。

下面就是使用0A号功能调用编写的“What’s your name?”程序。

978-7-111-46342-9-Chapter04-40.jpg

978-7-111-46342-9-Chapter04-41.jpg

在这段程序中,字符串缓冲区的定义是由下面三行程序完成的:

MAX DB 32

LEN DB ?

BUF DB 32 DUP(?)

这里MAX定义了字符串中字符数的最大值为32,LEN字节等待DOS功能调用填入输入的字符串长度,而BUF的32个字节用来存放用户从键盘输入的字符。下面三行程序完成读入字符串到缓冲区的功能:

MOV AH,OAH

MOV DX,OFFSET MAX

INT 21 H;wait for input(www.xing528.com)

需要注意的是,缓冲区的起始地址是MAX标号的地址,而字符串实际存入的地址是从BUF标号开始的32个字节。最后,在用户按<Enter>键完成输入时,DOS功能调用将字符串的长度(不含<Enter>键)填入LEN。由于输入的字符串没有用‘$’字符结尾,无法用DOS功能调用的9号功能输出到屏幕,但是LEN中的长度信息则可以指引程序通过循环使用DOS功能调用的2号功能完成屏幕输出。

由于DOS功能调用的0A号功能使用一个字节表示字符串的最大长度,使用该功能输入的字符串长度不可能超过255个字节。确切地说,由于输入的最后一个字符必然是回车符(0DH,即用户敲击<Enter>键时所产生的字符),而这个回车符不被计入字符串的长度,所以实际上用于有效输入的字符串长度比最大长度小1。也就是说,在上面例子中LEN返回的结果最大是MAX-1而不是MAX,而0A号功能所能输入的字符串最大长度是254个字节。

在DOS系统中,从键盘输入的字符实际上先放在一个16字节的键盘缓冲区内,功能1,7,8和0AH都是从键盘缓冲区取得输入字符的DOS功能。而功能0CH能清除键盘缓冲区,然后执行在AL中指定的功能,AL指定的功能可以是1,6,7,8或0AH,使用0CH功能可以使程序在输入一个字符之前,将以前键入的字符清除掉。

功能0CH的用法如下:

MOV AH,OCH

MOV AL,08H

INT 21H

这几条指令实际提供的输入功能是8号功能调用,它不回显,但要检测Ctrl-C或Ctrl-Break组合键,如果不想用Ctrl-C或Ctrl-Break来结束程序,可以用功能7代替功能8。

使用0CH功能的好处是可以避免由于偶然超前打入的字符而出现错误。例如在格式化磁盘时,程序员在格式化磁盘程序开始运行时,又超前键入了一个字符,当程序询问使用者是否确实要清除磁盘数据时,若利用0CH功能读取键盘,则先清除缓冲区,再接收用户的回答,这样就可以防止由于刚才超前键入的字符引起的错误动作。

DOS功能调用的0BH号功能检验是否有键被按动,如果有任何一个键被按下,则在AL寄存器中放入0FFH,如没有按下键,则在AL中放00,无论哪种都将继续执行程序中的下一条指令。要注意的是,该功能并不返回实际字符码,仅提供一种是否按键的提示。这是一种不可少的功能,例如希望程序保持运行状态,同时又检验键盘,看用户是否按下任意一个键来终止程序或退出循环。

DOS功能调用的6号功能同时提供了屏幕输出和键盘输入的能力,而执行哪项功能则由DL寄存器的内容决定。当DL寄存器的值为0FFH时,系统尝试读键盘字符,不回显。此时若有字符可取,则返回ZF=0并把字符码存入AL寄存器,否则不等待键盘输入直接返回,并置ZF=1,AL=0。当DL寄存器的值是0~0FEH时,系统执行屏幕输出功能,将AL中的字符输出到屏幕上,光标跟随输出移动,不检验Ctrl-Break键组合。

除了DOS功能调用提供一系列的键盘输入功能之外,BIOS键盘中断INT 16H也提供了三个基本的键盘操作功能,如表4-5所示。

4-5 INT 16H指令的三个基本键盘操作功能

978-7-111-46342-9-Chapter04-42.jpg

这三个操作提供的功能比DOS功能调用所提供的功能更加基本。比如通过BIOS键盘中断可以读取到按键的扫描码。键盘上的每个键都对应一个扫描码,从01(Esc)到83(Del),或从01H到53H,所以根据扫描码就能唯一地确定哪一个键改变了状态。表4-6是键盘上每个键对应的扫描码(十六进制)。

4-6 键盘上每个键对应的扫描码

978-7-111-46342-9-Chapter04-43.jpg

从表4-6中可以看出,通过扫描码可以精确辨认哪个键被按下,由此可以实现区分左右<Shift>键、区分小键盘数字键和主键盘数字键、读取<F1>等没有字符码的功能键等使用DOS功能调用无法实现的功能。另外INT 16H的2号功能还提供了读取键盘状态字节的能力(见图4-4)。键盘状态字节用来表示Shift、Ctrl、Alt、Num Lock、Scroll、Ins和Caps Lock等按键的状态,其中高4位指出各种键盘方式(Ins、Caps Lock、Num Lock、Scroll)是ON(1)还是OFF(0),低4位表示Alt、Ctrl、Shift键是否按动。这8个键有时又被称为变换键。

978-7-111-46342-9-Chapter04-44.jpg

图4-4 键盘状态字节

BIOS中断INT 16H提供了比DOS功能调用键盘相关功能更加基础和底层的一些功能,但是在使用上远远不及DOS功能调用的几种键盘功能快捷和方便,所以一般情况下汇编程序多数使用DOS功能调用提供的键盘功能,除非DOS功能调用INT 21H提供的键盘功能无法满足程序需要,才不得不使用INT 16H BIOS键盘中断。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈