汇编键盘输入与缓冲

来源:互联网 发布:淘宝设置全球购 编辑:程序博客网 时间:2024/05/19 21:03

先来看数据段的声明缓冲区的三行代码:

buf db 8        db ?            db 8 dup(?)

再来看代码段执行键盘输入的三行代码:

        lea dx,buf            mov ah,10        int 21h

分析:

    1.对于缓冲区声明代码中,如果我们把第一行去掉,将标签buf加在第二行或第三行前面会是什么结果呢?答案是,编译能通过,链接也能通过,但是运行时会出现错误提示如下:

造成这个错误的原因是什么呢?废话,当然是我们将第一行去掉造成的!可是,为什么呢?真正的原因是,第一行为我们的缓冲区指定了最大可接收的字符长度。它的作用有两个:1.决定了该缓冲区可接收的最大字符数,且最后一个为回车(本例中最多接收8个);2.决定了我们整个缓冲区实际占用内存大小(Byte),为最大可接收字符长度加上2(本例中为10个Byte,至于为什么后面解释)。

对于第一个作用,反映在本例中就是,我们在终端输入到第7个字符(不含enter键)时就无法再继续输入了,只能按enter键结束输入。

对于第二个作用,看后面分析。

    2.对于缓冲区的声明代码,如果我们把第二行去掉会是什么结果呢?答案是,编译能通过,链接也能通过,运行也正常。似乎它没什么作用,事实上它只是做初始化工作。那么为什么要声明这一个字节呢?答案是,它用来接收我们实际输入的字符数目(不包括最后的换行符)。例如在本例中,加入我们输入"1989"然后按enter键,那么buf对应的内存单元存储情况是:08h 04h 31h 39h 38h 39h 0dh 00 00 00;如果我们输入"1111111"然后按enter键,那么buf对应的内存单元存储情况是:08h 07h 31h 31h 31h 31h 31h 31h 31h 0dh。

    3.对于缓冲区的声明代码,如果我们把第三行去掉会是什么结果呢?答案是,编译能通过,链接也能通过,运行也正常。似乎它也没什么作用,事实上它也只是做初始化工作(一般我们都会为其初始化)。

要特别注意的是:①缓冲区声明代码的第一行是一定要有的,而且要给出明确的数字,它占用buf的第一个字节

                                ②缓冲区声明代码的第二行是可选的(最好写上),但是在运行时系统会强制分配这么一个字节,它占用buf的第二个字节

                                ③缓冲区声明代码的第三行也是可选的(最好写上),它从buf的第三个字节开始占用buf的最后所有的字节

                                ④我们从键盘输入时输入的字符总数被buf第一个字节存储的数据限制,按回车后,字符从buf的第三个字节开始存储,系统自动将字符总数(不含最后的换行                                       符)存入到buf的第二个字节。

到此对于前面的"第二个作用"已经有了很明确的解释。