本系列将讲解《汇编语言》一书,本节讲解**【汇编语言】15-外中断基础知识**。
本期源码,欢迎star:
https://github.com/ZYKWLJ/assembly4-homework
| 本节速览 |
|---|
| 1.外中断 是指? |
| 2.给出按键按下后,屏幕上显示出字符的全过程? |
| 3.给出汇编延时的处理过程?本质是什么?本质就是数据在寄存器中无意义的传输。 |
| 4.为了避免大规模地编写屏幕字符驱动程序,我们借用了原来的int 9中断,核心思想是什么?给出整个过程最有意义的地址变化过程。 |
| 5.一口气说出按下ESC后,屏幕上的字符变色的全流程。 |
一、外中断基本介绍
1、外中断
以前我们讨论的都是 CPU对指令的执行 。我们知道,CPU在计算机系统中,除了能够执行指令,进行运算以外,还应该能够对外部设备进行控制,接收它们的输入 ,向它们进行输出 。也就是说,CPU除了有运算能力外,还要有I/O(输入/输出)能力。
比如,我们按下键盘上的一个键,CPU最终要能够处理这个键。在使用文本编辑器时,按下a键后,我们可以看到屏幕上出现“a”,是CPU将从键盘上输入的键所对应的字符送到显示器上的。
这一章中,我们以键盘输入为例,讨论这两个问题。
要及时处理外设的输入,显然需要解决两个问题:
①外设的输入随时可能发生,CPU如何得知?
②CPU从何处得到外设的输入?
无外乎为何时、何处处理外中断的问题。
2、接口芯片和端口
金句:CPU通过端口和外部设备进行联系。
第14章 我们讲过,PC系统的接口卡和主板上,装有各种接口芯片,这些外设接口芯片的内部装有若干寄存器,CPU将这些寄存器当作端口来访问。
端口本就是芯片裸露的寄存器。
外设的输入不直接送入内存和CPU,而是送入相关的接口芯片的端口中;CPU向外设的输出也不是直接送入外设,而是先送入端口中,再由相关的芯片送到外设。
由此可见,这里的芯片 (或者说芯片的端口) 起到了中转站的作用。
CPU还可以向外设输出控制命令,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制。
3、外中断信息
回到第1点, 我们现在想知道的是,
①外设的输入随时可能发生,CPU如何得知?
②CPU从何处得到外设的输入?
显然,通过中断机制。
因为中断机制天然具有停下一件事,转头去做另一件事的能力,这是为外设量身定做的。
之前我们讨论的中断都是来自CPU内部,执行指令时产生的,这种中断,我们称为内中断,因为其中断信息来自CPU内部。
那么对应的外中断就是指来自于CPU外部设备,比如外设的输入到达,相关芯片将向CPU发出相应的中断信息。 CPU在执行完当前指令后,可以检测到发送过来的中断信息,**引发中断过程,**处理外设的输入。
内外中断的本质区别是,内中断是CPU内部产生的信息,中断类型码直接在CPU内部生成;而外中断的中断类型码是在外部产生的,是外设的相关芯片,通过数据总线传送到CPU内部的。 CPU有了中断类型码,才知道该执行 哪一块中断程序。
4、外中断的种类
在PC系统中,外中断一共有两类:
1.可屏蔽中断
可屏蔽中断时CPU可以不响应的中断。响应与否,具体要看标志寄存器的IF位,IF=1,则CPU在执行完正在执行的指令后,立马响应中断过程; IF=0,则不响应可屏蔽中断。
几乎所有的由外设触发的中断都是可屏蔽中断。
我们回顾一下内中断的过程:

可屏蔽外中断除了第一步的中断类型码是由接口芯片通过数据总线传送进CPU之外,其余均相同。
2.不可屏蔽中断
这是CPU必须响应的外中断。在执行完当前指令后,立即执行中断程序。
对于8086CPU,不可屏蔽中断类型码固定为2.
我们几乎不讨论不可屏蔽中断。
二、键盘外中断 实战
1、键盘外中断 背景介绍
我们通过键盘处理输入的过程,切身体会外中断!
1.键盘输入:
键盘上的每一个键 相当于 一个开关,键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描。
按下一个键时,开关接通,该芯片就产生一个扫描码,扫描码说明了按下的键在键盘上的位置。扫描码被送入主板上的相关接口芯片的寄存器中,该寄存器的端口地址为60h。
松开按下的键时,也产生一个扫描码,扫描码说明了松开的键在键盘上的位置。松开按键时产生的扫描码也被送入60h端口中。
一般将按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码,扫描码长度为一个字节,通码 的 第7位为0,断码 的 第7位为1,即:
断码 = 通码 + 80h 。比如,g键的通码为22h,断码为a2h。
2.键盘按键的通码
表15.1是键盘上部分键的扫描码,只列出通码。

3. 引发9号中断
键盘的输入到达60h端口时,相关的芯片就会向CPU发出中断类型码为9的可屏蔽中断信息。CPU检测到该中断信息后,如果IF=1,则响应中断,引发中断过程,转去执行int 9中断例程。
BIOS的9号中断,一般都是处理屏幕输出的。
4. 执行int 9中断例程
BIOS提供了int 9中断例程,用来进行基本的键盘输入处理,主要的工作如下:
(1) 读出60h端口中的扫描码;
(2) 如果是 字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区;
如果是控制键(比如Ctrl)和切换键(比如CapsLock)的扫描码,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储状态字节的单元;
(3) 对键盘系统进行相关的控制,比如说,向相关芯片发出应答信息。
BIOS键盘缓冲区 是系统启动后, BIOS用于存放int 9中断例程所接收的键盘输入的内存区。
该内存区可以存储15个键盘输入,因为int 9中断例程除了接收扫描码外,还要产生和扫描码对应的字符码,所以在BIOS键盘缓冲区中,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码。
0040:17单元存储键盘状态字节,该字节记录了控制键和切换键的状态。键盘状态字节各位记录的信息如下:

2.键盘外中断例程
1.习题分析
从上面的内容中,可以看出键盘输入的处理过程:
-
①键盘产生扫描码;
-
②扫描码送入60h端口;
-
③引发9号中断;
-
④CPU执行int9中断例程处理键盘输入。
上面的过程中,第1、2、3 步都是由硬件系统完成的。我们能够改变的只有 int 9 中断处理程序。我们可以重新编写int9中断例程,按照自己的意图来处理键盘的输入。但是,在课程中,我们不准备完整地编写一个键盘中断的处理程序,因为要涉及一些硬件细节,而这些内容脱离了我们的内容主线。
但是,我们却还要编写新的键盘中断处理程序,来进行一些特殊的工作,那么这些硬件细节如何处理呢?这点比较简单,因为BIOS 提供的 int9 中断例程已经对这些硬件细节进行了处理。我们只要在自己编写的中断例程中调用BIOS的int9中断例程就可以了。
2.编程
编程:在屏幕中间依次显示“a”~“z”,并可以让人看清。在显示的过程中,按下Esc键后,`改变显示的颜色。
这个编程任务分为两个:
- 依次显示`“a”~“z”
- 按下esc变色
我们先来看一下如何依次显示`“a”~“z”
3. 一次显示`“a”~“z”
我们先来看看最基本的,一次显示一串a-z
assume cs:code
code segment
start:
mov ax,0B800h
mov ds,ax
mov di,160*12+80;
mov ax,'a'
mov ah,02h ;green
print:
mov byte ptr [di], al ;write to Video Memory
mov byte ptr [di+1], ah
add al, 1
add di, 2
cmp al,'z'+ 1
jl print
mov ax,4c00h
int 21h
code ends
end start

最低0.47元/天 解锁文章
1223

被折叠的 条评论
为什么被折叠?



