[079][汇编语言]检测点17.1 int 16H 0号中断:从缓冲区读取一个键盘输入

检测点17.1

检测点17.1.png
  • TF = 1 时,CPU可以响应中断,比如 BIOS的 int 9H中断例程(功能是向键盘缓冲区写入数据)
  • BIOS的int 16H中断例程(功能是从缓冲区读取一个键盘输入)
  • 缓冲区有数据的时候,就读取缓冲区的第一个字单元,这时候允许不允许响应 int 9H都可以的,也就是说无所谓TF =1 (可响应)还是TF = 0(屏蔽)
  • 缓冲区为空的时候,当然要置TF = 1 (可响应),使得接受键盘输入填充缓冲区,因此这时候TF = 1

解析参考

  • https://www.cnblogs.com/monster-prince/p/5525220.html

int 16H 0号中断例程

  • 编程:接收用户的键盘输入,输入'r',将屏幕上的字符设置为红色、输入'g',将屏幕上的字符设置为绿色、输入'b',将屏幕上的字符设置为蓝色


    int 16H 0号中断例程.png
assume cs:code
code segment
start:  mov ah,0
        int 16h
        
        mov ah,1
        cmp al,'r'
        je red
        cmp al,'g'
        je green
        cmp al,'b'
        je blue
        jmp short sret
        
    red:    shl ah,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
            
    sret:   mov ax,4c00H
            int 21H
            
    code ends
    end start

代码说明

输入 r 时,
指令会从标号 red 开始执行
执行完 shl ah,1
之后会接着从green标号开始执行
又是一句 shl ah,1

由于 ah = 0000 0001 H
经过两次 左移 变成 ah = 0000 0100 H

颜色属性按照
颜色  闪烁  R G B 高亮  R G B 
ah =  0    0 0 0   0   1 0 0 
从而完成前景色设置为 红色

BIOS int 16H 0 号中断例程

  • (1)检测键盘缓冲区中是否有数据;
  • (2)如果则继续做第(1)步;
  • (3)读取缓冲区的第一个字单元中的键盘输入;
  • (4)将读取的扫描码送入ah,ASCII码送入al;
  • (5)将已读取的键盘输入从缓冲区中删除。

你可能感兴趣的:([079][汇编语言]检测点17.1 int 16H 0号中断:从缓冲区读取一个键盘输入)