汇编网首页登录博客注册
zihaolee的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  

[2010-05-09 21:30] 17.3:字符串的输入

理解了很长的时间,终于调出来了。

assume cs:code,ds:data 
data segment 
  db 65535 dup(0) 
data ends 
code segment 
start:  
           mov ax,data 
           mov ds,ax ;字符串存放段
           call getstr ;调用接受字符串输入子程序
           
           mov ax,4c00h 
           int 21h 
  ;=========================================
 getstr :  push ax 
 getstrs:  mov ah,0 
           int 16h 
           
           cmp al,20h ;ASCII少于20h不是字符
           jb nochar           
           mov ah,0 
           call charstack ;字符入栈     
           mov ah,2 
           call charstack ;字符显示
           jmp getstrs 

  nochar:  cmp ah,0eh ;检测是否退格键扫描码
           je backspace 
           cmp ah,1ch ;检测是否Enter扫描码
           je enter 
           jmp getstrs ;再读取字符 

backspace: mov ah,1 
           call charstack ;字符出栈
           mov ah,2 
           call charstack ;字符显示
           jmp getstrs 

    enter: mov al,0 
           mov ah,0 
           call charstack ;0字符入栈
           mov ah,2 
           call charstack ;字符显示
           pop ax 
           ret 
 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 ;子程序:字符串入栈,出栈,显示
 ;参数:(ah)=功能号,0入栈、1出栈、2显示
 ;      0 功能:(al)=入栈字符
 ;      1 功能:(al)=返回的字符
 ;      2 功能:(dh)行,(dl)列
 ;      ds:si指向字符位置
 ;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
 charstack:  jmp short charstart 

 table      dw charpush,charpop,charshow 
 top        dw 0  ;指示字符栈的顶位

 charstart:  push bx 
             push dx 
             push di 
             push es 

             cmp ah,2 ;没有(ah)>2的功能
             ja sret 
             mov bl,ah 
             mov bh,0 
             add bx,bx ;功能的调用
             jmp word ptr table[bx] 

   charpush: mov si,top
             mov ds:[si],al ;字符存入ds:[si]中
             inc top  ;top指向顶位
             jmp sret
             
   charpop:  cmp top,0 ;判断有没字符可减
             je sret 
             dec top ;顶位退一位
            ;------------------------------ 
            ;mov si,top                  
            ;mov al,[si]          
            ;------------------------------  
            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 si,0 

  charshows:cmp si,top ;判断是否全部输出
            jne noempty 
            mov byte ptr es:[di],' ' ;;覆盖前一位(应该是作退格功能) 
            ;mov byte ptr es:[di+1],07h 
            jmp sret 
  noempty:  mov al,[si] 
            mov es:[di],al ;传送字符到显存
            ;mov es:[di+1],07h
            ;mov byte ptr es:[di+2],' ' 
            inc si ;指向内存的下一个字符
            add di,2 
            jmp charshows 

       sret:pop es 
            pop di 
            pop dx 
            pop bx 
            ret 
            
code ends 
end start
评论次数(0)  |  浏览次数(517)  |  类型(各次练习) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码