第9章BIOS和DOS中断 9,1键盘IO 92显示器IO 93打印机IO 94串行通信口IO
第9章 BIOS和DOS中断 9.1 键盘I/O 9.2 显示器I/O 9.3 打印机I/O 9.4 串行通信口I/O
91键盘IO 键盘的中断有3个 (1)DOS的21H号中断,提供功能较强的读键功能; (2)BIOS的16H号中断,提供较低层次的服务 (3)BIOs的9号中断,这是键盘硬中断,每当键盘上有键 被按下,键盘都会通过接口向CPU提出9号中断请求
9.1 键盘I/O 键盘的中断有3个: (1)DOS的21H号中断,提供功能较强的读键功能; (2)BIOS的16H号中断,提供较低层次的服务; (3)BIOS的9号中断,这是键盘硬中断,每当键盘上有键 被按下,键盘都会通过接口向CPU提出9号中断请求
9119号中断与键盘工作原理 键盘上的按键分为普通键和控制键两类。控制键包括 Shift Ctr、AIt、 Capslock等,其余为普通键。 对于每个普通键,根据各键在键盘上的分布位置对键进行编 码,得到键盘扫描码(P317)。每个键还有ASCI码。 当发生9号中断请求时,表明键盘有按键信息需要送到主机中, 在没有被屏蔽的情况下,CPU将响应该中断,执行一次9号中 断服务程序,处理从键盘传来的信息。 9号中断服务程序的功能主要有:如果是控制键被按下或松开, 就把BOS数据区中的键盘状态字节作相应调整;如果是普通 键,则把按键的扫描码和ASCI码一起存入键盘缓冲区
9.1.1 9号中断与键盘工作原理 键盘上的按键分为普通键和控制键两类。控制键包括Shift、 Ctrl、Alt、CapsLock 等,其余为普通键。 对于每个普通键,根据各键在键盘上的分布位置对键进行编 码,得到键盘扫描码(P317)。每个键还有ASCII码。 当发生9号中断请求时,表明键盘有按键信息需要送到主机中, 在没有被屏蔽的情况下,CPU将响应该中断,执行一次9号中 断服务程序,处理从键盘传来的信息。 9号中断服务程序的功能主要有:如果是控制键被按下或松开, 就把BIOS数据区中的键盘状态字节作相应调整;如果是普通 键,则把按键的扫描码和ASCII码一起存入键盘缓冲区
计算机启动后,在内存较低端物理地址400H起,紧接在中断向量表的 后面)有一段供BIOS使用的数据区,其中包括存放各控制键状态的键盘 状态字节和存放普通键的32字节键盘缓冲区。 键盘缓冲区是一个先进先出的环形队列,共32字节,可以存放15个键的 扫描码和ASCI码。其所占内存区域如下: KBHead dw?;其内存地址为000:04|H,缓冲区头指针 KBTail dw?;其内存地址为000041CH,缓冲区尾指针 KBBuff dw16DUP(2);其内存地址为00004EH, 读键时可以从队列首部取走键值,9号中断则把新的按键置入队列尾部。 当键盘缓冲区已满,而键盘上还有普通键被按下时,键盘仍然会提出中 断申请,但9号中断的服务程序中会忽略该按键,并使计算机的小喇叭 发出“嘀”的一声,以表示缓冲区已满
计算机启动后,在内存较低端(物理地址400H起,紧接在中断向量表的 后面)有一段供BIOS使用的数据区,其中包括存放各控制键状态的键盘 状态字节和存放普通键的32字节键盘缓冲区。 键盘缓冲区是一个先进先出的环形队列,共32字节,可以存放15个键的 扫描码和ASCII码。其所占内存区域如下: KBHead DW ? ;其内存地址为0000:041AH,缓冲区头指针 KBTail DW ? ;其内存地址为0000:041CH,缓冲区尾指针 KBBuff DW 16 DUP(?);其内存地址为0000:041EH, 读键时可以从队列首部取走键值,9号中断则把新的按键置入队列尾部。 当键盘缓冲区已满,而键盘上还有普通键被按下时,键盘仍然会提出中 断申请,但9号中断的服务程序中会忽略该按键,并使计算机的小喇叭 发出“嘀”的一声,以表示缓冲区已满
键盘状态字节在物理地址41TH处,每一位代表一个控制键, 为1表示该键处于按下的状态,为0则是松开的。状态字节 的各个位与控制键的对应关系见表94。 表94状态字节与控制键的对应关系 位号76 4 32 控制键 Insert CapsLock| Num Lock Scroll Lock Alt Ctrl左shif右shif
表9.4 状态字节与控制键的对应关系 位号 7 6 5 4 3 2 1 0 控制键 Insert CapsLock Num Lock Scroll Lock Alt Ctrl 左shift 右shift 键盘状态字节在物理地址417H处,每一位代表一个控制键, 为1表示该键处于按下的状态,为0则是松开的。状态字节 的各个位与控制键的对应关系见表9.4
912BIOS键盘中断 16H号中断是BIOS提供给用户程序使用的一个软件中断, 以INT16H指令调用,提供基本的键盘服务,包括读键、判 断有无普通键按下、读取控制键的状态等子功能。 1.0号子功能—读普通键 如果键盘缓冲区不空,则从缓冲区的环型队列首部取走 个按键,把按键的扫描码放到AH中,ASCI码放到AL中 作为出口参数; 如果键盘缓冲区是空的,则等待有效按键输入
9.1.2 BIOS键盘中断 16H号中断是BIOS提供给用户程序使用的一个软件中断, 以INT 16H指令调用,提供基本的键盘服务,包括读键、判 断有无普通键按下、读取控制键的状态等子功能。 1.0号子功能──读普通键 如果键盘缓冲区不空,则从缓冲区的环型队列首部取走 一个按键,把按键的扫描码放到AH中,ASCII码放到AL中 作为出口参数; 如果键盘缓冲区是空的,则等待有效按键输入
2.1号子功能—不改变缓冲区的读键 当键盘缓冲区中还存放有没取走的有效按键时,出口参 数中ZF=0,AX=扫描码与ASCI码。 如果键盘缓冲区已空,则ZF=1表示无键可读。 1号子功能与0号的差别。 首先,在缓冲区为空时,0号子功能将等待按键,1号子 功能则不等待,而是以ZF置1表示(这是很多电脑游戏软件 典型的读键方式)。 其次,如果缓冲区不空,0号子功能会取走该键,而1号 子功能并不取走,只把它复制到AX中
2.1号子功能──不改变缓冲区的读键 当键盘缓冲区中还存放有没取走的有效按键时,出口参 数中ZF=0,AX=扫描码与ASCII码。 如果键盘缓冲区已空,则ZF=1表示无键可读。 1号子功能与0号的差别。 首先,在缓冲区为空时,0号子功能将等待按键,1号子 功能则不等待,而是以ZF置1表示(这是很多电脑游戏软件 典型的读键方式)。 其次,如果缓冲区不空,0号子功能会取走该键,而1号 子功能并不取走,只把它复制到AX中
3.2号子功能——读控制键状态 直接从BIOS数据区中复制出键盘状态字节的值,放到 AL中作为出口参数。 4.10H号子功能——读键并清除键盘缓冲区 读键的情况与0号子功能完全相同,10H号子功能在读 完键后还会清除键盘缓冲区中剩余的所有按键数据
3.2号子功能──读控制键状态 直接从BIOS数据区中复制出键盘状态字节的值,放到 AL中作为出口参数。 4.10H号子功能──读键并清除键盘缓冲区 读键的情况与0号子功能完全相同,10H号子功能在读 完键后还会清除键盘缓冲区中剩余的所有按键数据
913DOS的输入子功能 DOS提供的输入子功能见P320。 1.7号子功能—无回显输入 直接调用前面所说的16H号中断的0号子功能。 2.8号子功能—无回显输入 7号非常接近,只是对按键增加了CtrH+ Break的处理。 3.0AH号子功能—输入字符串(P321) 读入一串字符并存入用户定义的缓冲区中
9.1.3 DOS的输入子功能 DOS提供的输入子功能见P320。 1.7号子功能──无回显输入 直接调用前面所说的16H号中断的0号子功能。 2.8号子功能──无回显输入 7号非常接近,只是对按键增加了Ctrl+Break的处理。 3.0AH号子功能──输入字符串(P321) 读入一串字符并存入用户定义的缓冲区中
4.0BH号子功能—判断按键状态 用于判断键盘缓冲区是否为空,出口参数是: 当键盘缓冲区不空时,AL=0FFH 当键盘缓冲区为空时,AL≠0FFH 5.0CH号子功能—清除键盘缓冲区后再读键入口参数: AH=oCHa AL=清除缓冲区后再执行的功能号,可以是1、7、8。 出口参数: 按AL中的功能号,与DOS的3个子功能出口参数对应相同。 先把键盘缓冲区清空,然后再根据AL中的值,执行DOS 的1号、7号或8号子功能
4.0BH号子功能──判断按键状态 用于判断键盘缓冲区是否为空,出口参数是: 当键盘缓冲区不空时,AL=0FFH; 当键盘缓冲区为空时,AL≠0FFH。 5.0CH号子功能──清除键盘缓冲区后再读键入口参数: AH=0CH; AL=清除缓冲区后再执行的功能号,可以是1、7、8。 出口参数: 按AL中的功能号,与DOS的3个子功能出口参数对应相同。 先把键盘缓冲区清空,然后再根据AL中的值,执行DOS 的1号、7号或8号子功能