例如,在数据区定义的字符缓冲区如下:
MAXLEN DB 32
ACTLEN DB ?
STRING DB 32 DUP(?)
输入字符串的指令如下:
LEA DX, MAXLEN ; DX指向缓冲区
MOV AH, 0AH ; 输入字符串
INT 21H
如果我们键入字符串:
By brooks too broad for leaping↙
此时缓冲区MAXLEN 的各存储单元图示如动画。
在许多应用程序中,要求用户输入姓名,地址或其它字符串,使用21H 中断的功能A输入字符串时,特别要注意缓冲区的定义。缓冲区的第一个字节保存最大字符数,这个最大字符数由用户程序给出。如果键入的字符数比此数大,那就会发出"嘟嘟"声,而且光标不再向右移动。由于缓冲区的最大字符数仅用一个字节(8位)来表示,所以缓冲区的逻辑上限为255字节。
第二个字节是实际输入字符的个数,这个数据是由功能A 填入的,而不是由用户填入。在这两个字节之后,字符串就按字节存入缓冲区,最后一个字节是结束字符串的回车符0DH,因此整个缓冲区的字节空间应定义为最大字符数(包括Return在内)加2。INT
21H的功能A把实际字符数(不包括Return)填入缓冲区的第二个字节,并保持DS : DX 指向缓冲区的第一个字节。当然,缓冲区还可定义为:
STRING DB 32, ?, 32 DUP (?)
此时要注意,读取缓冲区中的字符要从STRING+2开始,STRING+1单元是实际键入的字符数。