. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->使用BIOS进行键盘输入和磁盘读写
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  分享17.3程序设计,光标位置可以移动,欢迎大家指教!  [待解决] 回复[ 0次 ]   点击[ 347次 ]  
weijiabai
[帖 主]   [ 发表时间:2013-05-15 15:04 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-05-02 10:02
assume ds:data,cs:code,ss:stack
data segment
     db 2000 dup(0)            ;用来存放从键盘输入的字符
     db 'Please input the string:',0
     db 'Warning:The key you press is not a char!Please press again!',0
data ends

stack segment
     db 128 dup(0)
stack ends

code segment

      start:mov ax,data
            mov ds,ax
            mov ax,stack
            mov ss,ax
            mov sp,128
            mov dh,0
            mov dl,24
            mov si,0
            mov di,0
            mov bx,0b800h
            mov es,bx

    cursor: mov ah,2      ;调用bios中断的10h号中断的2号功能,设置光标位置
            mov bh,0      ;在第0页显示
            int 10h
            cmp dh,0
            jne getstrs
            cmp dl,24
            je s1
            jmp getstrs

        s1: mov al,ds:[si+7d0h]
            cmp al,0
            je getstrs
            mov byte ptr es:[di],al
            mov byte ptr es:[di+1],00000010b
            inc si
            add di,2
            jmp s1

            
               
   getstrs: mov si,0
            mov ah,0          
            int 16h
            
            cmp al,20h         ;ASCII码小于20h,说明不是字符
            jb nochar
            mov ah,0
            call charstack     ;字符入栈
            mov ah,2
            call charstack     ;显示栈中的字符
            inc dl             ;设置光标位置指向下一个字符
            cmp dl,80          ;判断光标位置是否为最后一列
            jne cursor
            inc dh             ;如果光标移到最后一列,则指向下一行
            mov dl,0           ;光标位置重新回到新一行第0列
            jmp cursor


    nochar: cmp ah,0eh        ;退格键的扫描码
            je backspace
            cmp ah,1ch        ;Enter键的扫描码
            je enter

            mov si,25
            mov di,12*160+20
        s2: mov al,ds:[si+7d0h]
            cmp al,0
            je getstrs
            mov byte ptr es:[di],al
            inc byte ptr es:[di+1]
            inc si
            add di,2
            jmp s2
            jmp getstrs

 backspace: mov ah,1
            call charstack    ;字符出栈
            mov ah,2
            call charstack    ;显示栈中剩下的字符
            cmp dh,0
            je next

            cmp dl,0
            je next1
            dec dl
            jmp cursor

     next1: dec dh
            mov dl,79
            jmp cursor

      next: cmp dl,24
            je getstrs 
            dec dl
            cmp dl,24
            je t1
            jmp cursor
         t1:mov ah,2
            mov bh,0
            int 10h
            jmp getstrs

     enter: mov ah,0
            mov al,0
            call charstack   ;0入栈
            mov al,2
            call charstack   ;显示栈中的字符

            mov ax,4c00h
            int 21h

 charstack:jmp short charstart

 table dw charpush,charpop,charshow
 top dw 0          
            
  charstart:cmp ah,2
            ja sret
            mov bl,ah
            mov bh,0
            add bx,bx
            jmp word ptr cs:table[bx]

            
   charpush:mov bx,top   
            mov ds:[si+bx],al
            inc top
            jmp sret



    charpop:cmp top,0
            je sret
            dec top
            mov bx,top
            mov al,ds:[si+bx]
            jmp sret
  
   charshow:mov bx,0b800h
            mov es,bx
            mov di,48
            mov bx,0

  charshows:cmp bx,top       ;此时bx=0,用于判断top是否为0,即栈中字符的个数是否为0
            jne noempty
            mov byte ptr es:[di],' '
            jmp sret

    noempty:mov al,ds:[si+bx]
            mov es:[di],al
            mov byte ptr es:[di+1],00000100b
            inc bx
            add di,2
            jmp charshows

      sret:ret     

code ends
end start
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved