7、键盘输入的举例
例8.1 用键盘最多输入10个字符,并存入内存变量Buff中,若按“Enter”键,则表示输入结束。
解:
1、方法1
.MODEL SMALL
CR EQU 0DH ;定义“回车”键的符号名
.DATA
Buff DB 10 DUP(?)
.CODE
.STARTUP
MOV CX, 0AH
LEA BX, Buff
.REPEAT
MOV AH, 0H
INT 16H ;用BIOS中的中断功能
.BREAK .IF AL==CR
MOV [BX], AL
INC BX
.UNTILCXZ
.EXIT 0
END
2、方法2
.MODEL SMALL
.DATA
Buff DB 10, ?, 10
DUP(?) ;注意缓冲区的定义方式
.CODE
.STARTUP
LEA DX, Buff
MOV AH, 0AH
INT 21H ;用DOS中的功能调用
.EXIT 0
END
8.3.3 打印输出的中断功能
打印输出是一种硬拷贝输出,也是一种常用的输出形式。随着计算机应用领域的不断扩大,外围设备的重视程度也越来越高。目前,打印机的种类已日益丰富,有针式打印机、喷墨打印机和激光打印机等。从打印色彩来看,既有普通的黑色打印,也有彩色打印。总之,计算机打印输出的品质是越来越高。
1、打印机状态字
打印机状态字记录着打印机的当前工作情况(或状态),它相当于CPU中的程序状态字和键盘状态字。
若在某个程序中要包含打印功能,那么,程序员可通过打印状态字来了控制打印过程,并向使用者提供各种有用信息。比如:提示使用者“打印机无纸了”或打印机处于脱机状态(Off Line)等。
2、打印控制命令
在打印时,程序员往往要控制文本的输出格式,比如:换页、换行、字体或字号等。若要实现对打印格式的控制,就必须要知道控制打印机的控制字符和控制命令。一些常用的打印控制字符如表8.3所示。
表8.3 常用的打印控制字符
字符值 功能描述
09H 水平制表符,跳到下一个制表位置
0AH 换行
0CH 换页
0DH 回车
打印机还有其它的控制命令,如:ESC命令序列,该序列由字符ESC(其ASCII为1BH)和一些数值组成。表8.4列举了LQ-1600K打印机的几个控制命令。对于其它各类打印机的控制命令,要参阅其使用手册。
表8.4 LQ-1600K打印机的几个控制命令
控制命令 命令的数值 功能描述
ESC @ 1BH 40H 初始化打印机
ESC 4/ESC 5 1BH 34H/1BH 35H 设定/取消斜体打印
ESC S 0/ESC S 1 1BH 53 0/1BH 53 1 设定上/下角标打印
ESC T 1BH 54H 取消上/下角标打印
ESC l n 1BH 6CH n 设定左边界,n为当前字符的宽度
3、DOS功能中的打印输出
在DOS操作系统中,INT 21H提供了一种打印输出的功能调用。其具体描述如下:
05H——向连接在LPT1端口上的打印机输出一个字符
40H——向先前打开的文件写入指定数量的字节,可以把打印机看作为标准的输出文件
有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之字符功能调用类。
4、BIOS中的打印输出
BIOS系统提供了中断17H来实现打印输出功能。其具体的功能如下:
00H——向指定的打印机输出一个字符
01H——初始化指定的打印机
02H——读取指定打印机的状态
有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之并行口服务。
8.3.4 串行通信口的中断功能
计算机的通信功能是现代计算机网络的最基本功能。如果计算机没有通信功能,计算机网络环境也就无从谈起。一台计算机与其它计算机(或设备)之间通信除了必要的物理连接之外,它们之间通信接口的功能就是另一个极其重要的功能模块。
从计算机通信的本质来看,通信就是发送或接受具有一定格式的二进制位。这些二进制位通过一些应用程序——如浏览器——的解释显示成具有不同表达形式的文字或图象。
为了方便实现计算机的通信功能,在系统的低层或操作系统中都有不同程度的支持,如:DOS、BIOS和NETBIOS等系统中都相应通信功能或中断服务。下面仅仅介绍在汇编语言程序中如何使用通信功能,有关通信功能的详细内容在《计算机通信与接口技术》课程会有更深入的论述。
1、DOS中的通信功能
INT 21H提供了对通信口COM1操作的功能调用。其具体描述如下:
03H——从辅助设备读入一个字符,该辅助设备的缺省值为COM1
04H——向辅助设备输出一个字符,该辅助设备的缺省值为COM1
有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之字符功能调用类。
2、BIOS中的通信功能
BIOS系统提供了中断14H来实现对通信端口的控制能。这些具体的功能如下:
00H——初始化通信口 02H——从通信口读入字符
01H——向通信口输出字符 03H——读取通信口状态
有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之串行口服务。
3、通信功能的应用举例
例8.9 把字符串”Hello, World”从COM1端口传输出去。在传输过程中,要求传输速率为9600波特,字长为8位,1位停止位,无齐偶校验。
解:
.MODEL SMALL
.DATA
MSG DB ”Hello, World”
MLen EQU $-MSG
.CODE
.STARTUP
MOV AL, 0E3H ;0E3—9600、无齐偶校验、字长8位,1位停止位
MOV DX, 0
MOV AH, 0
INT 14H ;初始化通信口COM1
MOV BX, OFFSET MSG
MOV CX, MLen
MOV DX, 0
again:
MOV AL, [BX]
MOV AH, 1
INT 14H
TEST AH, 80H ;如果发送字符失败,继续发同一个字符,这里可能
JNZ again ;构成死循环。在实际工作过程中,还有其它考虑。
INC BX
LOOP again
EXIT 0
END
例8.10 把从COM1端口读入的字符显示在屏幕上。如果通信端口数据未准备好,则程序处于等待状态;若传输出错,则用红色显示字符”?”。
解:
……
again:
MOV DX, 0
MOV AH, 3
INT 14H
TEST AH, 1H ;检测状态字节AH的最后一位,看数据是否准备好
JZ again
MOV DX, 0
MOV AH, 2
INT 14H ;从COM1端口读字符
TEST AH , 80H ;检测读字符是否成功
.IF ZERO? ;读字符成功
AND AL, 7FH ;屏蔽掉最高位,使之为字符
MOV BL, 15 ;正常颜色:白色
.ELSE
MOV AL, '?' ;显示字符”?”
MOV BL, 12 ;错误颜色:红字
.ENDIF
MOV BH, 0
MOV AH, 0EH
INT 10H
JMP again
……
8.3.5 鼠标的中断功能
鼠标是现在计算机系统中的一个常用输入设备,它为使用计算机带来了很大的方便,鼠标指针的各种表现形式还反映了系统(或应用程序)当前处于什么样的工作状态。许多计算机使用者为体现其个性化还选择各自喜欢的鼠标图形,所以,了解和掌握计算机系统对鼠标所提供的功能对理解鼠标的各种操作也是有一定的帮助。
1、鼠标中断的常用功能
BIOS系统提供了中断33H来实现鼠标中断功能,其常用的功能如下:
00H—初始化鼠标
01H—显示鼠标指针
02H—隐藏鼠标指针
03H—读取鼠标位置及其按钮状态
04H—设置鼠标指针位置
05H—读取鼠标按键信息
06H—读取鼠标按钮释放信息
07H—设置鼠标水平边界
08H—设置鼠标垂直边界
09H—设置图形鼠标形状
0AH—设置本文鼠标形状
0BH—读取鼠标移动计数
0CH—为鼠标事件设置处理程序
0FH—设置鼠标计数与象素比
10H—设置鼠标指针隐藏区域
14H—替换鼠标事件中断
18H—为鼠标事件设置替换处理程序
19H—读取替换处理程序的地址
1DH—为鼠标指针选择显示页
1EH—读取鼠标指针的显示页
有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅附录3之鼠标功能中断。
2、鼠标指针的设置
鼠标指针主要有二种表现形式:文本鼠标和图形鼠标。文本鼠标又分为软指针和硬指针。软指针是用各种字符来作鼠标指针,而硬指针是用方块光标的大小来表示鼠标指针,其效果类似于INT 10H之功能01H——设置光标类型。
图形鼠标的表现形式与文本鼠标相比就显得更加丰富多彩,可用各种不同的指针形状来反映系统当前所处的工作状态和所能进行的操作。在Windows操作系统及其应用程序中使用了很多指针形状的变化来表达各种有用信息。
鼠标的文本软指针与图形指针的形成过程相一致,它需要两部分信息:象素掩码和光标掩码。其指针形成过程如下:
1)、用象素掩码与当前鼠标所处位置的象素信息进行“逻辑与”运算;
2)、光标掩码与步骤1的运算结果再进行“异或”操作,该操作所得到的16×16位的0/1信息就构成了当前鼠标指针的形状。
假设象素掩码为全0。全0的象素掩码与屏幕上的显示信息“逻辑与”后,所得结果仍为全0,全0的运算结果再和“光标掩码”进行“异或”操作,这时,所得结果显然与“光标掩码”完全一样,所以,看到的鼠标指针形状就是光标掩码所表达的指针形状。
综合上述,可得结论:若象素掩码为全0,那么,鼠标的形状就是16×16位光标掩码所表示的指针形状,鼠标所到之处就看不到该区域内(16×16点阵范围)的其它显示信息。
在Windows操作系统及其应用程序中,在16×16点阵范围内,除了看不见被各种形状指针覆盖的部分之外,还能看见其它小区域,这是因为鼠标的“象素掩码”取其“光标掩码”的反相点阵所致。感兴趣的读者可验证或证明之。
(1)硬指针的设置
设置鼠标硬指针的中断功能使用方式:
MOV BX, 1 ;硬指针
MOV CX, 01H ;鼠标硬指针的起始扫描线
MOV DX, 0FH ;鼠标硬指针的结束扫描线
MOV AX, 0AH ;设置文本鼠标指针
INT 33H
(2)软指针的设置
设置鼠标软指针的中断功能使用方式:
MOV BX, 0 ;软指针
MOV DL, 'A' ;用字符'A'作为鼠标指针符号
MOV DH, 07FH ;置鼠标的颜色
MOV CX, 0 ;置象素位掩码
MOV AX, 0AH
INT 33H ;设置文本鼠标指针
(3)图形指针的设置
设置鼠标软指针的中断功能使用方式:
……
PMask DW 16 dup(?);象素位掩码,PMask可以是~CMask
CMask DW 16 dup(?);光标掩码,二者紧相邻
……
MOV AX, DS
MOV ES, AX
LEA DX, PMask ;ES:DX=象素位掩码的起始地址
MOV BX, 0
MOV CX, 0 ;在鼠标指针范围内,(0,0)点为指示点
MOV AX, 09H
INT 33H ;设置图形鼠标指针