第十七章 使用BIOS进行键盘的输入和磁盘读写
1、int 9中断例程对键盘输入的处理:键盘缓冲区中有16个字单元,可以存储15个按键的扫描码和对应的ASCII码。int 16中断例程读取键盘缓冲区:读取键盘输入的功能编号为0。他们相互配合,实现对键盘的输入和读取。
2、字符串的输入:字符的输入和输出是按照栈的访问规则进行的,即后进先出。这样我们就可以用栈的方式来管理字符串的存储空间,也就是说,字符串的存储空间实际上是一个字符栈,字符栈中的所有字符,从栈底到栈顶,组成一个字符串。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 ;最基本的字符串输入程序,需要具备下面的功能:
2 ;(1) 在输入的同时需要显示这个字符串;
3 ;(2)一般在输入回车符后,字符串输入结束;
4 ;(3)能够删除已经输入的字符。
5
6 ;编写一个接收字符串的输入子程序,实现上面三个基本功能。
7 ;因为在输入的过程中需要显示,子程序的参数如下:
8 ; (dh)、(dl)=字符串在屏幕上显示的行、列位置;
9 ; ds:si 指向字符串的存储空间,字符串以O 为结尾符。
10
11
12 assume cs:code
13
14 code segment
15 start:
16 call getstr
17
18 return:
19 mov ax,4c00h
20 int 21h
21
22 ;完整的接收字符串输入的子程序
23
24 getstr:
25 push ax
26
27 getstrs:
28 mov ah,0
29 int 16h
30
31 cmp al,20h
32 jb nochar
33 mov ah,0;
34 call charstack
35 mov ah,2
36 call charstack
37 jmp getstrs
38
39
40 nochar:
41 cmp ah,0eh
42 je backspace
43 cmp ah,1ch
44 je enter1
45 jmp getstrs
46
47
48 backspace:
49 mov ah,1
50 call charstack
51 mov ah,2
52 call charstack
53 jmp getstrs
54
55 enter1:
56 mov al,0
57 mov ah,0
58 call charstack
59 mov ah,2
60 call charstack
61
62 pop ax
63 ret
64
65
66 ;功能实现子程序
67
68 charstack:
69 jmp short charstart
70
71 table dw charpush,charpop,charshow
72 top dw 0
73
74 charstart:
75 push bx
76 push dx
77 push di
78 push es
79
80 cmp ah,2
81 ja sret
82 mov bl,ah
83 mov bh,0
84 add bx,bx
85 jmp word ptr table[bx]
86
87 charpush:
88 mov bx,top
89 mov [si][bx],al
90 inc top
91 jmp sret
92
93 charpop:
94 cmp top,0
95 je sret
96 dec top
97 mov bx,top
98 mov al,[si][bx]
99 jmp sret
100
101 charshow:
102 mov bx,0b800h
103 mov es,bx
104 mov al,160
105 mov ah,0
106 mul dh
107 mov di,ax
108 add dl,dl
109 mov dh,0
110 add di,dx
111
112 mov bx,0
113
114 charshows:
115 cmp bx,top
116 jne noempty
117 mov byte ptr es:[di],' '
118 jmp sret
119
120 noempty:
121 mov al,[si][bx]
122 mov es:[di],al
123 mov byte ptr es:[di+2],' '
124 inc bx
125 add di,2
126 jmp charshows
127
128 sret:
129 pop es
130 pop di
131 pop dx
132 pop bx
133 ret
134
135 code ends
136 end start