蒙珣的博客

活好当下,做好今天该做的事情。

0%

实验17 编写包含多个功能子程序的中断例程

1.编程,接收用户的键盘输入,输入”r”,将屏幕上的字符设置为红色;输入”g”,将屏幕上的字符设置为绿色;输入”b”,将屏幕上的字符设置为蓝色

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
assume cs:code

code segment

start: mov ah,0
int 16h

mov ah,1
cmp al,'r'
je red

cmp al,'g'
je green

cmp al,'b'
je blue
jmp short sret

red: shl ah,1

green: shl ah,1

blue: mov bx,0b800h
mov es,bx
mov bx,1
mov cx,2000

s: and byte ptr es:[bx],11111000b
or es:[bx],ah
add bx,2
loop s

sret: mov ax,4c00h
int 21h

code ends

end start

编写一个接收字符串输入的子程序,实现下面3个基本功能。因为在输入的过程中需要显示,子程序的参数如下
(dh)、(dl)字符串在屏幕上显示行、列位置
ds:si指向字符串的存储空间,字符串以0为结尾符

最基本的字符串输入程序,需具备下面的功能
1.在输入的同时需要显示这个字符串
2.一般在输入回车符后,字符串输入结束
3.能够删除已经输入的字符

我们可以简单的确定程序的处理过程
1.调用int 16h读取键盘输入
2.如果是字符,进入字符栈,显示字符栈中的所有字符;继续执行步骤1
3.如果是退格键,从字符栈中弹出一个字符,显示字符栈中的所有字符,继续执行步骤1
4.如果是Enter键,向字符栈中压入0,返回

子程序:字符栈的入栈、出栈和显示
参数说明:(ah)=功能号,0表示入栈,1表示出栈,2表示显示
ds:si 指向字符栈空间
对于0号功能:(al)=入栈字符
对于1号功能:(al)=返回的字符
对于2号功能:(dh)、(dl)=字符串在屏幕上显示的行、列位置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60

charstack: jmp short charstack

table dw charpush,charpop,charshow
top dw 0 ;栈顶

charstart: push bx
push dx
push di
push es

cmp ah,2
ja sret
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx]

charpush: mov bx,top
mov [si][bx],al
inc top
jmp sret

charpop: cmp top,0
je sret
dec top
mov bx,top
mov al,[si][bx]
jmp sret

sharshow: mov bx,0b800h
mov es,bx
mov al,160
mov ah,0
mul dh
mov di,ax
add dl,dl
mov dh,0
add di,dx

mov bx,0

charshows: cmp bx,top
jne noempty
mov byte ptr es:[di],' '
jmp sret

noempty: mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],' '
inc bx
add di,2
jmp charshows

sret: pop es
pop di
pop dx
pop bx
ret