java打印对象内存地址 分布式事务 事务消息 分布式事务 几种解决方案 分布式事务-Seata 分布式事务-Seata 分布式事务-LCN-TCC 分布式事务-LCN 分布式事务-消息队列-定时任务-本地事件表 Zuul网关实战02 Zuul网关实战01 灰度发布落地实战2 灰度发布落地实战1 Gsnova on Heroku build Systemd Debian system initialization manage multi id_rsa ubuntu 64bits cannot run 32bits app REHL power auditing Debug Assembly for ARMv8 on QEMU ARM体系结构--寄存器 Run Debian iso on QEMU ARMv8 QEMU ARM64 guide cross compiler install buildroot install QEMU install python入门--数据结构 python入门--内置数据类型 python入门--类 异常 python入门--条件表达式 方法 python入门--数字 字符串 数组 RTC驱动分析 块设备驱动 TCP UDP socket 触摸屏驱动 USB驱动 LED按键中断 LCD 驱动 驱动信号 根文件系统 实验 内核实验 字符设备驱动程序 绪论 uboot 实验 LCD 实验 系统时钟和UART 中断控制器 Nand Flash控制器 MMU 实验 储存管理器实验 GPIO实验 点亮LED 编译加载驱动 制作烧写内核 dnw替代方法 MINI2440 TQ2440安装配套Linux 使用NFS 制作烧写跟文件系统 grub引导Windows 烧写裸版程序-linux Ubuntu 网络没有 eth0 Linux自动挂载 烧写裸板程序 电路基础 Mac词典 Vim插件 Assembly 综合研究 Assembly 指令总结 Assembly 直接定址表 Assembly 使用BIOS进行键盘输入和磁盘读写 Assembly 外中断 Assembly 端口 Assembly int指令 Assembly 内中断 Assembly 标志寄存器 Assembly 转移指令的原理 Assembly Call和ret指令 Assembly 数据处理两个基本问题 Assembly 灵活定位内存地址 Assembly 包含多个段的程序 Assembly [bx] loop Assembly 第一个程序 Assembly 寄存器 (内存访问) Assembly 寄存器 AWS VPN with EC2 hidden file in picture(linux) Assembly 基础 idea shortcuts 常用快捷键 idea plugin folder install ruby and jekyll

Assembly 外中断

2014年10月03日

CPU除了有运算功能外,还要有 I/O(Input/Output,输入/输出)能力。比如键盘按下一个键,CPU最终要能处理这个键。

CPU通过端口和外部设备进行联系

###外中断信息 来自于CPU外部,当CPU外部有需要处理的事情发生的时候,比如:外设的输入到达,相关芯片向CPU发出相应地中断信息,引发中断过程,处理外设的输入

在PC系统中,外中断源一共有以下两类:

###1. 可屏蔽中断 几乎所有外设引发的外中断,都是可屏蔽中断

CPU可以不响应的外中断,根据IF位的设置

IF=1 则CPU在执行完当前指令后响应中断

IF=0 则不响应可屏蔽中断

回忆内中断所引发的中断过程:

  1. 取中断类型码n
  2. 标志寄存器入栈,IF=0,TF=0
  3. CS、IP入栈
  4. (IP)=(n * 4),(CS)=(n * 4 + 2)

可屏蔽中断所引发的中断过程,除在第一步的实现上有所不同外,基本上和内中断的中断过程相同。因为可屏蔽中断信息来自于CPU外部,中断类型码是通过数据总线送入CPU的;而内中断的中断类型码是在CPU内部产生的

在中断处理中需要处理可屏蔽中断,可以用指令设置将IF=1,8086CPU提供的设置IF的指令是:

sti		;设置IF=1
cli		;设置IF=0

###2. 不可屏蔽中断 对于8086CPU,不可屏蔽中断的中断类型码固定为2

不可屏蔽中断过程为:

  1. 标志寄存器入栈,IF=0,TF=0
  2. CS、IP入栈
  3. (IP)=(8),(CS)=(0AH)

不可屏蔽中断是在系统中有必须处理的紧急情况发生时用来通知CPU的中断信息(待学习讨论)


###PC机键盘的处理过程 ####1.键盘输入 键盘上的每一个键相当于一个开关,键盘中有一个芯片对键盘上的每一个的开关状态进行扫描

按下一个键时:开关接通,该芯片产生一个扫描码(键盘上的位置),被送入主板上相关接口芯片的寄存器中,该寄存器的端口地址为60h

松开按下的键时:也产生一个扫描码,也被送入60h

一般按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。扫描码长度为一个字节,通码的第7位为0,断码的第7位为1,即:

断码=通码+80H

键盘扫描码自行Google,keywords:键盘 扫描码

####2.引发int 9号中断 键盘的输入到达60h端口时,相关的芯片就会向CPU发出中断类型码为9的可屏蔽中断信息

####3.执行int 9中断例程 BIOS提供了int 9中断例程,主要工作如下:

  1. 读出60h端口中的扫描码
  2. 如果是字符键的扫描码,将该扫描码和它所对应的字符码(即ASCII码)送入内存中的BIOS键盘缓冲区;如果是控制键(比如Ctrl)和切换键(比如 CapsLock)的扫描码,则将其转变为状态字节(用二进制位记录控制键和切换键状态的字节)写入内存中存储状态字节的单元
  3. 对键盘系统进行相关的控制,比如:向相关芯片发出应答信息

BIOS键盘缓冲区是系统启动后,BIOS用于存放int 9中断例程所接收的键盘输入的内存区。

该内存区可以存储15个键盘输入,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码

###编写int 9中断例程 键盘输入的处理过程:

  1. 键盘产生扫描码
  2. 扫描码送入60h端口
  3. 引发9号中断
  4. CPU执行int 9中断例程处理键盘输入

上面的过程中,第1,2,3步都是由硬件系统完成的,只能够改变int 9中断处理程序

BIOS提供的int 9中断例程已经对这些硬件细节进行了处理,只需要在自己编写的中断例程中调用BIOS的int 9中断例程即可(使用别的指令对int指令进行一些模拟)

源代码

必须在DOS实模式下运行