. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->使用BIOS进行键盘输入和磁盘读写
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  课本306页,字符串输入中显示子程charshows清屏语句的疑惑。  [已解决] 回复[ 3次 ]   点击[ 437次 ]  
jjch224
[帖 主]   [ 发表时间: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则是在每输出一个字符以后都输出一个空格,都能达目的。只需要其中的任意一个语句即可,另外一个是多余的,调试无问题。
jjch224
[第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
jjch224
[第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。
jjch224
[第3楼]   [ 回复时间:2010-09-01 10:06 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:0
注册日期:2010-07-09 09:48
此贴由 贴主 于 [ 2010-09-01 10:06 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved