kane080824 发表于 2011-11-30 21:24:27

17.3,抛弃字符栈...

本帖最后由 kane080824 于 2011-11-30 22:01 编辑

王爽老师17.3章节实现字符串输入用了建立字符栈的方法,其本意应该是是为了让我们多多练习直接定址表和功能模块化,但由此也产生一个问题,由于使用字符栈,每次字符的增加或删减字符串都要重新显示,理论上说有损效率,因为习惯上每输入一个字符不需要每次重新显示之前已输入的字符,删除同理,所以决定抛弃字符栈.

程序框架图
http://bbs.fishc.com/data/attachment/album/201111/30/214738p5popzt4o4u54odp.jpghttp://bbs.fishc.com/data/attachment/album/201111/30/204600fsdd3d75hado3ssa.jpg
程序运行截图

程序代码:
assume    cs:code
      code    segment
    table dwshowstr,delchar,endstr ;功能地址表
   
      start:mov ax,0b800h
               mov es,ax
               mov dh,12       ;行参数
               mov dl,35      ;列参数
   
               mov al,160
               mul dh
               mov di,ax
               add dl,dl
               mov dh,0
               add di,dx       ;字符串指针di参数,指向字符串显示的开始位置
            
               mov cx,di      ;cx指向字符串开始位置,防止删除超界
   
               call input_str;字符串接收子程序
   
               mov ax,4c00h
               int 21h
   
    input_str:
          scan:mov ah,0
                        int 16h          ;调用16h中断侦测键盘输入
   
                        cmp al,20h
                        jnb Nub0       ;如果是字符则调用0号(字符串显示)功能
                        cmp ah,0eh
                        jeNub1      ;如果退格键则调用1号(字符串删除)功能
                        cmp ah,1ch
                        jeNub2       ;如果是Enter则调用2号(字符串结束)功能
                        jmp scan
   
          Nub0:   mov dl,al      
                        mov al,0
                        jmpfun_tab          ;进入功能地址表取功能地址
         
          Nub1:   mov al,1
                     jmpfun_tab
   
          Nub2:mov al,2
   
    fun_tab:   add al,al
                      mov ah,0
                      mov bx,ax
                      jmp word ptr table    ;调用各功能

    showstr:   mov al,dl
                      cmp al,0
                      jequit                         ;判断字符串是否结束
                      mov byte ptr es:,al
                      add di,2
                      jmpscan
   
   delchar:   cmp di,cx
                      je scan
                      sub di,2
                      mov byte ptr es:,' '
                      jmpscan
   
      endstr:   mov dl,0                      ;如果是Enter,则结束字符串输入
                     jmp showstr
   
          quit:ret

   code ends
         end start




页: [1]
查看完整版本: 17.3,抛弃字符栈...