|
主题 : : 课本306页,字符串输入中显示子程charshows清屏语句的疑惑。 [已解决] |
回复[ 3次 ]
点击[ 437次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2010-08-30 12:25 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
课本中charshows子程有2个清屏语句:
mov byte ptr es:[di],' '; A
mov byte ptr es:[di+2],' ';B
只需要其中任意一个就可以了。
假如已作2次输入,输入字符a、b,则在字符栈中的格式应该是a+b+空格,如果此时做一次删除操作,即按backspace键,那么就需要清楚掉b,即用空格代替b,语句A是在bx=top的时候输出一个空格,而语句B则是在每输出一个字符以后都输出一个空格,都能达目的。只需要其中的任意一个语句即可,另外一个是多余的,调试无问题。 | | |
|
|
|
|
[第1楼]
[ 回复时间:2010-08-30 12:27 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
完整程序如下:
;p306字符串输入程序。
assume cs:code
code segment
start:
mov ax,0
mov ds,ax
mov si,200
mov dh,2
mov dl,10
call getstr
mov ax,4c00h
int 21h
getstr:
push ax
getstrs:
mov ah,0
int 16h
cmp al,20h
jb nochar
mov ah,0
call charstack
mov ah,2
call charstack
jmp getstrs
nochar:
cmp ah,0eh;backspace
je backspace
cmp ah,1ch;enter
je enters
jmp getstrs
backspace:
mov ah,1
call charstack
mov ah,2
call charstack
jmp getstrs
enters:
mov al,0
mov ah,0
call charstack; push 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
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;cs[top]指向字符栈顶,cs[top-1]指向当前字符。cs[top]的值是未知的。
mov bx,top
mov al,byte ptr [si][top]
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],' ';清屏
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
code ends
end start | | |
|
|
|
|
[第2楼]
[ 回复时间:2010-08-31 08:38 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
纠正一下:
保留A:mov byte ptr es:[di],' '; 可以剔除语句B,如果只保留B,那么输入的第一个字符是无法清屏的,因为是ds:[di+2],不能取值0.语句A可以,因为,前面有个跳转语句jne noempty。 | | |
|
|
|
|
[第3楼]
[ 回复时间:2010-09-01 10:06 ]
[引用]
[回复]
[ top ] | |
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48 |
此贴由 贴主 于 [ 2010-09-01 10:06 ] 结贴。 结贴原因:问题已解决 | | |
|