鱼C论坛

 找回密码
 立即注册
查看: 2913|回复: 0

[技术交流] 17.3,抛弃字符栈...

[复制链接]
发表于 2011-11-30 21:24:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

程序框架图

                               
登录/注册后可看大图

                               
登录/注册后可看大图

程序运行截图

程序代码:
assume    cs:code
        code    segment
      table dw  showstr,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
                        je  Nub1        ;如果退格键则调用1号(字符串删除)功能
                        cmp ah,1ch
                        je  Nub2         ;如果是Enter则调用2号(字符串结束)功能
                        jmp scan
   
          Nub0:   mov dl,al        

                        mov al,0
                        jmp  fun_tab          ;进入功能地址表取功能地址
         
          Nub1:   mov al,1
                       jmp  fun_tab
   
          Nub2:  mov al,2
   
    fun_tab:   add al,al
                      mov ah,0
                      mov bx,ax
                      jmp word ptr table[bx]   
;调用各功能

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





想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-19 12:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表