【汇编语言】外中断(一)—— 外中断的魔法:PC机键盘如何触发计算机响应

文章目录
- 前言
- 1. 背景介绍
- 2. 接口芯片和端口
- 3. 外中断信息
- 3.1 什么是外中断信息
- 3.2 外中断源的分类
- 3.2.1 可屏蔽中断
- 3.2.1.1 什么是可屏蔽中断?
- 3.2.1.2 可屏蔽中断的处理过程
- 3.2.2 不可屏蔽中断
- 3.2.2.1 什么是不可屏蔽中断?
- 3.2.2.2 不可屏蔽中断的处理过程
- 4. PC 机键盘的处理过程
- 4.1 键盘输入
- 4.2 引发9号中断
- 4.3 执行int 9中断例程
- 4.3.1 主要过程
- 4.3.2 补充说明
- 结语
前言
📌
汇编语言是很多相关课程(如数据结构、操作系统、微机原理)的重要基础。但仅仅从课程的角度出发就太片面了,其实学习汇编语言可以深入理解计算机底层工作原理,提升代码效率,尤其在嵌入式系统和性能优化方面有重要作用。此外,它在逆向工程和安全领域不可或缺,帮助分析软件运行机制并增强漏洞修复能力。
本专栏的汇编语言学习章节主要是依据王爽老师的《汇编语言》来写的,和书中一样为了使学习的过程容易展开,我们采用以8086CPU为中央处理器的PC机来进行学习。
1. 背景介绍
以前我们讨论的都是CPU对指令的执行。我们知道,CPU 在计算机系统中,除了能够执行指令,进行运算以外,还应该能够对外部设备进行控制,接收它们的输入,向它们进行输出。
也就是说,CPU 除了有运算能力外,还要有 I/O( Input/Output ,输入/输出)能力。
比如,我们按下键盘上的一个键,CPU最终要能够处理这个键。在使用文本编辑器时,按下a键后,我们可以看到屏幕上出现“a”,是CPU将从键盘上输入的键所对应的字符送到显示器上的。
要及时处理外设的输入,显然需要解决两个问题:
(1)外设的输入随时可能发生,CPU如何得知?
(2)CPU 从何处得到外设的输入?
我们以键盘输入为例,讨论这两个问题。
2. 接口芯片和端口
前面我们讲过,在PC 系统的接口卡和主板上,装有各种接口芯片。这些外设接口芯片的内部有若干寄存器,CPU 将这些寄存器当作端口来访问。
-
外设的输入不直接送入内存和CPU ,而是送入相关的接口芯片的端口中;
-
CPU 向外设的输出也不是直接送入外设,而是先送入端口中,再由相关的芯片送到外设。
-
CPU 还可以向外设输出控制命令,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制。
✍可见,CPU 通过端口和外部设备进行联系。
3. 外中断信息
3.1 什么是外中断信息
现在,我们知道了外设的输入被存放在端口中,可是外设的输入随时都有可能到达,CPU 如何及时地知道,并进行处理呢?
更一般地讲,就是外设随时都可能发生需要CPU及时处理的事件,CPU如何及时得知并进行处理?
CPU 提供中断机制来满足这种需要。
前面讲过,当CPU的内部有需要处理的事情发生的时候,将产生中断信息,引发中断过程。这种中断信息来自CPU的内部。
还有一种中断信息,来自于CPU外部,当CPU外部有需要处理的事情发生的时候,比如说,外设的输入到达,相关芯片将向CPU发出相应的中断信息。CPU在执行完当前指令后,可以检测到发送过来的中断信息,引发中断过程,处理外设的输入。
3.2 外中断源的分类
在PC系统中,外中断源一共有以下两类。
3.2.1 可屏蔽中断
3.2.1.1 什么是可屏蔽中断?
可屏蔽中断是CPU可以不响应的外中断。
CPU是否响应可屏蔽中断,要看标志寄存器的IF位的设置。当CPU检测到可屏蔽中断信息时:
-
如果IF=1,则CPU 在执行完当前指令后响应中断,引发中断过程;
-
如果IF=0,则不响应可屏蔽中断。
3.2.1.2 可屏蔽中断的处理过程
我们回忆一下内中断所引发的中断过程:
(1)取中断类型码n;
(2)标志寄存器入栈,IF=0,TF=0;
(3)CS、IP 入栈;
(4)(IP)=(n*4),(CS)=(n*4+2)
由此转去执行中断处理程序。
可屏蔽中断所引发的中断过程 ,除在第一步的实现上有所不同外,基本上和内中断的中断过程相同。
因为可屏蔽中断信息来自于CPU外部,中断类型码是通过数据总线送入CPU 的;而内中断的中断类型码是在CPU内部产生的。
现在,我们可以解释中断过程中将IF置为0的原因了。
将IF置0的原因就是,在进入中断处理程序后,禁止其他的可屏蔽中断。
当然,如果在中断处理程序中需要处理可屏蔽中断,可以用指令将IF置1 。
8086CPU 提供的设置IF的指令如下:
sti,用于设置IF=1;
cli,用于设置IF=0。
3.2.2 不可屏蔽中断
3.2.2.1 什么是不可屏蔽中断?
不可屏蔽中断是CPU 必须响应的外中断。
当CPU 检测到不可屏蔽中断信息时,则在执行完当前指令后,立即响应,引发中断过程。
3.2.2.2 不可屏蔽中断的处理过程
对于8086CPU 不可屏蔽中断的中断类型码固定为2。所以中断过程中,不需要取中断类型码。
不可屏蔽中断的中断过程:
-
标志寄存器入栈,IF=0,TF=0;
-
CS、IP入栈;
-
(IP)=(8),(CS)=(0AH)。
几乎所有由外设引发的外中断,都是可屏蔽中断。当外设有需要处理的事件(比如说键盘输入)发生时,相关芯片向CPU 发出可屏蔽中断信息。
不可屏蔽中断是在系统中有必须处理的紧急情况发生时用来通知CPU的中断信息。
在我们的内容中,主要讨论可屏蔽中断。
4. PC 机键盘的处理过程
下面我们看一下键盘输入的处理过程,并以此来体会一下PC机处理外设输入的基本方法。
4.1 键盘输入
键盘上的每一个键相当于一个开关,键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描。
-
按下一个键时,开关接通,该芯片就产生一个扫描码,扫描码说明了按下的键在键盘上的位置。扫描码被送入主板上的相关接口芯片的寄存器中,该寄存器的端口地址为60H 。
-
松开按下的键时,也产生一个扫描码,扫描码说明了松开的键在键盘上的位置。松开按键时产生的扫描码也被送入60H 端口中。
一般将按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。
扫描码长度为一个字节,通码的第 7 位为 0 ,断码的第7位为1,即:断码 = 通码+80H。
比如:g键的通码为22H,断码为a2H。
下表是键盘上部分键的扫描码,只列出通码。

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

结语
今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下。
也可以点点关注,避免以后找不到我哦!
Crossoads主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的动力!

相关文章:
【汇编语言】外中断(一)—— 外中断的魔法:PC机键盘如何触发计算机响应
文章目录 前言1. 背景介绍2. 接口芯片和端口3. 外中断信息3.1 什么是外中断信息3.2 外中断源的分类3.2.1 可屏蔽中断3.2.1.1 什么是可屏蔽中断?3.2.1.2 可屏蔽中断的处理过程 3.2.2 不可屏蔽中断3.2.2.1 什么是不可屏蔽中断?3.2.2.2 不可屏蔽中断的处理过…...
pymssql-2.1.4.dev5-cp37-cp37m-win_amd64.whl 安装
pip install pymssql 安装pymssql出现下面的问题 error: Microsoft Visual C 14.0 is required. Get it with “Microsoft Visual C Build Tools”: http://landinghub.visualstudio.com/visual-cpp-build-tools 因为要使用python连接sqlserver数据库,需要pymssq…...
在HTML中使用Vue如何使用嵌套循环把集合中的对象集合中的对象元素取出来(我的意思是集合中还有一个集合那种)
在 Vue.js 中处理嵌套集合(即集合中的对象包含另一个集合)时,使用多重 v-for 指令来遍历这些层次结构。每个 v-for 指令可以用于迭代一个特定级别的数据集,并且可以在模板中嵌套多个 v-for 来访问更深层次的数据。 例如ÿ…...
Apriori关联规则算法 HNUST【数据分析技术】(2025)
1.理论知识 Apriori是一种常用的数据关联规则挖掘方法,它可以用来找出数据集中频繁出现的数据集合。该算法第一次实现在大数据集上的可行的关联规则提取,其核心思想是通过连接产生候选项及其支持度,然后通过剪枝生成频繁项集。 Apriori算法的…...
Windows中Microsoft Edge兼容性问题|修复方案
针对Microsoft Edge浏览器在Windows系统中出现的兼容性问题解决步骤和策略: 作者是更改了注册表解决的,问题不一,大家遇到兼容性问题先按照第7个情况进行设置,大部分人是这个情况! 清理缓存和Cookies 按快捷键:ctrlshi…...
Android 蓝牙开发-传输数据
概述 传统蓝牙是通过建立REFCCOM sockect来进行通信的,类似于socket通信,一台设备需要开放服务器套接字并处于listen状态,而另一台设备使用服务器的MAC地址发起连接。连接建立后,服务器和客户端就都通过对BluetoothSocket进行读写…...
webrtc获取IceCandidate流程
在WebRTC(Web Real-Time Communication)中,ICECandidate是一个关键概念,它用于描述在建立点对点(P2P)连接时可以考虑的潜在通信端点。以下是关于WebRTC中ICECandidate的详细解释: 一、ICECandidate的定义 ICECandidate对象通常包含以下关键属性: foundation:用于唯一…...
每天40分玩转Django:Django静态文件
Django静态文件 一、今日学习内容概述 学习模块重要程度主要内容静态文件配置⭐⭐⭐⭐⭐基础设置、路径配置CDN集成⭐⭐⭐⭐⭐CDN配置、资源优化静态文件处理⭐⭐⭐⭐压缩、版本控制部署优化⭐⭐⭐⭐性能优化、缓存策略 二、基础配置 # settings.py import os# 静态文件配置…...
Linux 线程池
1.概念介绍 线程池是一种多线程处理形式,它维护着多个线程,这些线程处于等待状态,随时准备接受任务并执行。线程池的主要目的是为了提高系统的性能和资源利用率,避免在处理短时间任务时频繁创建和销毁线程所带来的开销。 线程池…...
windows使用zip包安装MySQL
windows通过zip包安装MySQL windows通过zip包安装MySQL下载MySQL的zip安装包创建安装目录和数据目录解压zip安装包创建配置目录 etc 和 配置文件 my.ini安装MySQL进入解压后的bin目录执行命令初始化执行命令安装 验证安装查看服务已安装 启动MySQL查看服务运行情况修改密码创建…...
深度学习实战之超分辨率算法(tensorflow)——ESPCN
espcn原理算法请参考上一篇论文,这里主要给实现。 数据集如下:尺寸相等即可 针对数据集,生成样本代码preeate_data.py import imageio from scipy import misc, ndimage import numpy as np import imghdr import shutil import os import…...
Android unitTest 单元测试用例编写(初始)
文章目录 了解测试相关库导入依赖库新建测试文件示例执行查看结果网页结果其他 本片讲解的重点是unitTest,而不是androidTest哦 了解测试相关库 androidx.compose.ui:ui-test-junit4: 用于Compose UI的JUnit 4测试库。 它提供了测试Compose UI组件的工具和API。 and…...
C++简明教程(10)(初识类)
类的教程 C 类的完整教程 C 中,类(class)是面向对象编程的核心概念,用于定义对象的属性(数据成员)和行为(成员函数)。本教程将带你从零开始,循序渐进地学习如何定义和使…...
光谱相机的工作原理
光谱相机的工作原理主要基于不同物质对不同波长光的吸收、反射和透射特性存在差异,以下是其具体工作过程: 一、光的收集 目标物体在光源照射下,其表面会对光产生吸收、反射和透射等相互作用。光谱相机的光学系统(如透镜、反射镜…...
【Linux进程】基于管道实现进程池
目录 前言 1. 进程池 1.1 基本结构: 1.2. 池化技术 1.3. 思路分析 1.4. 代码实现 总结 前言 上篇文章介绍了管道及其使用,本文在管道的基础上,通过匿名管道来实现一个进程池; 1. 进程池 父进程创建一组子进程,子进…...
软件测试之单元测试
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、何为单测 测试有黑盒测试和白盒测试之分,黑盒测试顾名思义就是我们不了解盒子的内部结构,我们通过文档或者对该功能的理解,…...
vscode+编程AI配置、使用说明
文章目录 [toc]1、概述2、github copilot2.1 配置2.2 使用文档2.3 使用说明 3、文心快码(Baidu Comate)3.1 配置3.2 使用文档3.3 使用说明 4、豆包(MarsCode)4.1 配置4.2 使用文档4.3 使用说明 5、通义灵码(TONGYI Lin…...
007-spring-bean的相关配置(重要)
spring-bean的相关配置...
【唐叔学算法】第19天:交换排序-冒泡排序与快速排序的深度解析及Java实现
引言 排序算法是计算机科学中的基础问题,而交换排序作为其中一类经典的排序方法,因其简单直观的思想和易于实现的特点,在初学者中广受欢迎。交换排序的核心思想是通过不断交换相邻元素来达到排序的目的。本文将深入探讨两种典型的交换排序算…...
合并 Python 中的字典
合并 Python 中的字典 如何在 Python 中合并字典? 这取决于你对“合并”一词的具体定义。 在 Python 中使用 | 操作符合并字典 首先,让我们讨论合并字典的最简单方法,这通常已经足够满足你的需求。 以下是两个字典: >>…...
《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...
