- [mywiil] 我没用书上的入栈出栈写,就是先看看不用书上的方法能做出来否? ============== 不错 09/19 09:24
- [njutyangxiao] 谢谢你的指导 09/18 17:00
- [younggay] 嗯,应该说理解的没问题。 09/18 15:41
- [njutyangxiao] 检测点16.1的题目是中是这样定义的: a dw 1,2,3,4,5,6,7,8 b dd 09/16 11:23
- [njutyangxiao] 嗯,谢谢指导 09/16 11:22
- [wsrf] assume伪指令指定了段中标号与相应段寄存器的联系。 09/16 09:46
- [wsrf] 没有问题,不过源代码中 a db 1,2,3,4,5,6,7,8 b dw 0 怎么 09/16 09:43
- [njutyangxiao] 谢谢,keep moving! 09/16 09:06
- [njutyangxiao] 谢谢你的指导 09/16 09:05
- [njutyangxiao] 谢谢你的指导 09/16 09:05
[2009-09-19 21:11] 17.3字符串的接收、显示以及删除(2)
题目:编程,编写一个接受字符串输入的程序,应该有如下功能:
(1)在输入的同时需要显示这个字符串
(2)一般在输入回车符后,字符串输入结束
(3)能够删除已经输入的字符
解答:只是写个测试程序而已
assume cs:codesg,ds:datasg
datasg segment
db 4000 dup(0)
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov si,0
mov dh,12
mov dl,0;设置显示的行号和列号
call getstr;调用处理字符串的子程序
mov ax,4c00h
int 21h
getstr:
push ax
getstrs:
mov ah,0
int 16h
cmp al,20h;如果输入的字符的ASCII码值小于20h,就不是字符
jb isnotchar
mov ah,0
call charstack;否则的话就是字符,调用charstack的0号功能,将其ASCII码值入栈保存起来
mov ah,2
call charstack;调用charstack的2号功能显示字符串
jmp getstrs;显示完之后返回getstrs处继续读取输入的字符
;如果不是字符,就来判断是否是enter键和backspace键
isnotchar:
cmp ah,0eh
je backspace ;是baqckspace键就去删除字符的子程序
cmp ah,1ch
je enter ;是enter键就压入0
jmp getstrs;完了还是返回继续读取键盘输入的字符
;删除字符
backspace:
mov ah,1
call charstack;调用charstack的1号功能
mov ah,2
call charstack;删除完了还要继续显示字符串
jmp getstrs
;
enter:
mov al,0
mov ah,0
call charstack;调用charstack的0号功能压入0
mov ah,2
call charstack;显示字符串
pop ax
ret
charstack:
jmp short charstart
table dw charpush,charpop,charshow
top dw 0
charstart:
push bx
push dx
push di
push es
cmp ah,2
ja sret;如果功能号大于2则跳出此子程序
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx];根据ah的值来调用相应的子程序
;把字符压入
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
charshow:
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],20h ;如果top的值是0 ,就说明还没有字符串
jmp sret
noempty:
mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],20h
mov byte ptr es:[di+1],1h;显示字体的颜色
inc bx
add di,2
jmp charshows
sret:
pop es
pop di
pop dx
pop bx
ret
codesg ends
end start
(1)在输入的同时需要显示这个字符串
(2)一般在输入回车符后,字符串输入结束
(3)能够删除已经输入的字符
解答:只是写个测试程序而已
assume cs:codesg,ds:datasg
datasg segment
db 4000 dup(0)
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov si,0
mov dh,12
mov dl,0;设置显示的行号和列号
call getstr;调用处理字符串的子程序
mov ax,4c00h
int 21h
getstr:
push ax
getstrs:
mov ah,0
int 16h
cmp al,20h;如果输入的字符的ASCII码值小于20h,就不是字符
jb isnotchar
mov ah,0
call charstack;否则的话就是字符,调用charstack的0号功能,将其ASCII码值入栈保存起来
mov ah,2
call charstack;调用charstack的2号功能显示字符串
jmp getstrs;显示完之后返回getstrs处继续读取输入的字符
;如果不是字符,就来判断是否是enter键和backspace键
isnotchar:
cmp ah,0eh
je backspace ;是baqckspace键就去删除字符的子程序
cmp ah,1ch
je enter ;是enter键就压入0
jmp getstrs;完了还是返回继续读取键盘输入的字符
;删除字符
backspace:
mov ah,1
call charstack;调用charstack的1号功能
mov ah,2
call charstack;删除完了还要继续显示字符串
jmp getstrs
;
enter:
mov al,0
mov ah,0
call charstack;调用charstack的0号功能压入0
mov ah,2
call charstack;显示字符串
pop ax
ret
charstack:
jmp short charstart
table dw charpush,charpop,charshow
top dw 0
charstart:
push bx
push dx
push di
push es
cmp ah,2
ja sret;如果功能号大于2则跳出此子程序
mov bl,ah
mov bh,0
add bx,bx
jmp word ptr table[bx];根据ah的值来调用相应的子程序
;把字符压入
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
charshow:
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],20h ;如果top的值是0 ,就说明还没有字符串
jmp sret
noempty:
mov al,[si][bx]
mov es:[di],al
mov byte ptr es:[di+2],20h
mov byte ptr es:[di+1],1h;显示字体的颜色
inc bx
add di,2
jmp charshows
sret:
pop es
pop di
pop dx
pop bx
ret
codesg ends
end start
评论次数(1) |
浏览次数(725) |
类型(汇编作业) |
收藏此文 |