• 使用BIOS进行键盘输入【编程:字符串的输入】


    ;=======字符串的输入=========
    ;功能:
    ; 1、在输入的同时显示这个字符串
    ; 2、在输入回车符后,字符串输入结束
    ; 3、能够删除已经输入的字符
    ;
    ;字符串的入栈、出栈、显示
    ;参数说明:
    ; 1、(ah)=功能号,
    ;   0表示入栈
    ;   1表示出栈
    ;   2表示显示
    ; 2、ds:si指向字符栈空间
    ; 3、 对于0号功能:(al)=入栈字符
    ;  对于1号功能:(al)=返回的字符
    ;  对于2号功能:(dh)、(dl)=字符串在屏幕上显示的行、列位置

    assume cs:code, ds:stack
    
    stack segment
     dd 128 dup(0)
    stack ends
    
    code segment
    start:  
      mov ax, cs
      mov ds, ax
      mov si, 0
      mov dh, 12
      mov dl, 40
      call getstr
    
      mov ax, 4c00h
      int 21h
    
    ;=============================
    ;接收字符串输入控制
    ;=============================
    getstr:
       push ax
       
    getstrs:
       mov ah, 0  
       int 16h
       cmp al, 20h  ;al中存放的是扫描码对应的ASCII码
       jb nochar  ;ASCII码小于20h, 说明不是字符
       
       ;字符入栈
       mov ah, 0  ;ah: 0号功能 字符入栈  、 al:为入栈数据
       call charstack
       ;显示栈中的字符
       mov ah, 2
       call charstack
       jmp short getstrs
         
    nochar:   
       cmp ah, 0eh  ;退格键的扫描码
       je backspace 
       cmp ah, 1ch  ;Enter键的扫描码
       je enter  
       jmp short getstrs  
       
    ;退格键
    backspace:
       mov ah, 1
       call charstack ;字符出栈
       mov ah, 2
       call charstack ;显示栈中的字符
       jmp short getstrs
    
    ;Enter键  
    enter:
       mov al, 0
       mov ah, 0  ;入栈0
       call charstack
       mov ah, 2
       call charstack ;显示栈中的字符
       
       pop ax
       ret
       
       
    ;==========================================================
    ;字符串的入栈、出栈、显示
    ;参数说明:
    ;1、(ah)=功能号,
    ;   0表示入栈
    ;   1表示出栈
    ;   2表示显示 
    ;2、ds:si指向字符栈空间
    ;3、对于0号功能:(al)=入栈字符
    ; 对于1号功能:(al)=返回的字符
    ; 对于2号功能:(dh)、(dl)=字符串在屏幕上显示的行、列位置
    ;==========================================================  
    charstack: 
       jmp short charstart
     table dw charpush, charpop, charshow
     top  dw 0 ;保存栈顶  注意:始终指向栈顶有效字符的上一个
    
    charstart:
       push bx
       push dx
       push di
       push si
       push es
       
       cmp ah, 2
       ja sret  ;ja高于则转移
       mov bl, ah
       mov bh, 0
       add bx, bx ;功能号*2 = 对应的功能子程序在地址表中的偏移
       jmp word ptr table[bx]
       
    
    ;字符入栈
    charpush:
       mov bx, top  ;取得栈顶
       mov [si][bx], al
       inc top   ;栈顶+1
       jmp short sret
    ;字符出栈
    charpop:
       cmp top, 0 ;检查栈是否为空
       je sret 
       dec top  ;栈顶-1  此时指向栈顶的有效字符
       mov bx, top
       mov al, [si][bx] ;把取出的字符保存在al中
       jmp short sret
    
    ;字符显示
    charshow:
       mov bx, 0b800h
       mov es, bx
       mov al, 160
       mov ah, 0
       mul dh     ;ax=al*dh=160*行数
       mov di, ax
       add dl, dl  ;dl+dl = 偏移量
       mov dh, 0
       add di, dx  ;di=(160*行数)+2*列数
       
       mov bx, 0
     charshows:
       cmp bx, top  ;bx为 存放数据空间的偏移
       jne noempty  ;栈不为空 显示
       mov byte ptr es:[di], ' ' 
       jmp short sret 
       
     noempty:
       mov al, [si][bx]
       mov es:[di], al
       mov byte ptr es:[di+2], ' ' ;如果是删除 就可以把删除的字符清空
       inc bx
       add di, 2
       jmp short charshows
    ;结束
    sret:
       pop es
       pop si
       pop di
       pop dx
       pop bx
       ret
          
    code ends
    end start
  • 相关阅读:
    为什么大家都说 SELECT * 效率低?
    一个 Java 方法,最多能定义多少参数?
    牛逼哄哄的布隆过滤器,到底有什么用?
    10w+ Excel 数据导入,怎么优化?
    为什么 wait 方法要在 synchronized 中调用?
    使用Redis存储聊天数据的一种方案(使用lua解决原子性问题)
    Linux下安装redis
    Django Rest Framework组件:解析器JSONParser、FormParser、MultiPartParser、FileUploadParser
    API测试之Postman使用全指南(转载)
    Django Rest Framework组件:序列化与反序列化模块Serializer
  • 原文地址:https://www.cnblogs.com/qintangtao/p/2874560.html
Copyright © 2020-2023  润新知