第17章 使用BIOS进行键盘输入和磁盘读写

17.1 int9中断例程对键盘输入的处理

键盘输入将引发int9中断,BIOS 提供了int9中断例程。

int9:

从60h端口读出扫描码,将其转化为相应的ASCII码或状态信息,储存在内存的指定空间(键盘缓冲区或状态字节)中。

一般的键盘输入,在CPU执行完int9后都放到了键盘缓冲区中。键盘缓冲区中有16个字单元,可以储存15个按键的扫描码和对应的ASCII码。

17.2使用int 16h中断例程读取键盘缓冲区

BIOS提供了int 16h 中断例程,int16h 中断例程中包含的一个最重要的功能是从键盘缓冲区中取出一个键盘输入,该功能的编号是0。

mov ah,0
int 16h

结果:(ah)=扫描码,(al)=ASCII码

编程:接受键盘输入'r' 'g' 'b'

r将前景置为红

g前景置为绿

b将前景置为蓝

assume cs:code,ds:data,ss:stack
data segment
         db 128 dup(0)
data ends

stack segment stack
          db 128 dup(0)
stack ends




code segment

    start:mov  ax,stack
          mov  ss,ax
          mov  sp,128

          mov  ah,0                          ;调用16h
          int  16h
    ;属性字节格式:7  6  5  4    3      2  1  0
    ;含义         BL R  G  B    I      R  G  B
    ;            闪烁  背景     高亮      前景
    ;R:  红色     G:绿色     B:蓝色

    ;字节属性对应内存地址又低到高。
    ;ax寄存器先ah后al   所以ah对应前景
          mov  ah,1                          ;将前景色蓝色置为1此时如果不改变ah,前景会被设置为蓝色
          cmp  al,'r'
          je   red
          cmp  al,'g'
          je   green
          cmp  al,'b'
          je   blue
          jmp  short sret

    red:  shl  ah,1                          ;当输入为r时跳转到这里,然后继续向下执行
                                            ;也就是说会左移两个位,这时候相当于红色被置为1
    green:shl  ah,1     

    blue: mov  bx,0b800h
          mov  es,bx
          mov  bx,1
          mov  cx,2000
    s:    and  byte ptr es:[bx],11111000b
          or   es:[bx],ah
          add  bx,2
          loop s

          jmp start

    sret: mov  ax,4C00h
          int  21h


code ends
              end start


              mov ax,4C00h
              int 21h


code ends

end start

17.3字符串的输入

assume cs:code,ds:data,ss:stack
data segment
         db 128 dup(0)
data ends

stack segment stack
          db 128 dup(0)
stack ends




code segment

    start:    mov  ax,stack
              mov  ss,ax
              mov  sp,128

              mov dh,12
              mov dl,16
              call getstr

              mov  ax,4C00h
              int  21h
    ;==================================接收字符串
    getstr:   push ax
    getstrs:  mov  ah,0
              int  16h
              cmp  al,20h
              jb   nochar   ;   ASCII码小于20h就不是字符了
              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



    charstack:jmp  short  charstart

    table     dw   charpush,charpop ,charshow
    top       dw   0                            ;   栈顶


    charstart:push bx
              push dx
              push di

              push es

              cmp  ah,2
              ja   sret
              mov  bl,ah
              mov  bh,0
              add  bx,bx
              jmp  word ptr table[bx]


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

    charpop:  cmp  top ,0
              je   sret
              dec  top
              mov  bx,top
              mov  al,[si][bx]
              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  bx,0

    charshows:cmp  bx,top
              jne  noempty
              mov  byte ptr es:[di],' '
              jmp  sret

    noempty:  mov  al,[si][bx]
              mov  es:[di],al
              mov  byte ptr es:[di+2],' '
              inc  bx
              add  di,2
              jmp  charshows

    sret:     pop  es
              pop  di
              pop  dx
              pop  bx
              ret






code ends

end start

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

y6y6y666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值