zoukankan      html  css  js  c++  java
  • 外中断01 零基础入门学习汇编语言69

    第十五章:外中断01

     

    让编程改变世界

    Change the world by program


     

    引言

    以前我们讨论的都是CPU对指令的执行。我们知道,CPU 在计算机系统中,除了能够执行指令,进行运算以外,还应该能够对外部设备进行控制,接收它们的输入,向它们进行输出。 也就是说,CPU 除了有运算能力外,还要有 I/O( Input/Output ,输入/输出)能力。  

    接口芯片和端口

      第 14 章我们讲过,在PC 系统的接口卡和主板上,装有各种接口芯片。这些外设接口芯片的内部有若干寄存器,CPU 将这些寄存器当作端口来访问。   外设的输入不直接送入内存和CPU ,而是送入相关的接口芯片的端口中; CPU 向外设的输出也不是直接送入外设,而是先送入端口中,再由相关的芯片送到外设。 CPU 还可以向外设输出控制命令,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制。   可见,CPU 通过端口和外部设备进行联系。 CPU 在执行完当前指令后,可以检测到发送过来的中断信息,引发中断过程,处理外设的输入。  

    外中断信息

     

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

    1、可屏蔽中断 2、不可屏蔽中断 可屏蔽中断是CPU 可以不响应的外中断。CPU 是否响应可屏蔽中断,要看标志寄存器的IF 位的设置。  

    当CPU 检测到可屏蔽中断信息时:

    如果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置为0的原因了。将IF置0的原因就是,在进入中断处理程序后,禁止其他的可屏蔽中断。 当然,如果在中断处理程序中需要处理可屏蔽中断,可以用指令将IF置1 。  

    8086CPU 提供的设置IF的指令如下:

    sti,用于设置IF=1; cli,用于设置IF=0。   不可屏蔽中断是CPU 必须响应的外中断。当CPU 检测到不可屏蔽中断信息时,则在执行完当前指令后,立即响应,引发中断过程。 对于8086CPU 不可屏蔽中断的中断类型码固定为2。所以中断过程中,不需要取中断类型码。  

    不可屏蔽中断的中断过程:

    1、标志寄存器入栈,IF=0,TF=0; 2、CS、IP入栈; 3、(IP)=(8),(CS)=(0AH)。   几乎所有由外设引发的外中断,都是可屏蔽中断。当外设有需要处理的事件(比如说键盘输入)发生时,相关芯片向CPU 发出可屏蔽中断信息。 不可屏蔽中断是在系统中有必须处理的紧急情况发生时用来通知CPU 的中断信息。在我们的课程中,主要讨论可屏蔽中断。

    PC机键盘的处理过程

      下面我们看一下键盘输入的处理过程,并以此来体会一下PC 机处理外设输入的基本方法。 1、键盘输入 2、引发9号中断 3、执行int 9中断例程   键盘上的每一个键相当于一个开关,键盘中有一个芯片对键盘上的每一个键的开关状态进行扫描。 按下一个键时,开关接通,该芯片就产生一个扫描码,扫描码说明了按下的键在键盘上的位置。扫描码被送入主板上的相关接口芯片的寄存器中,该寄存器的端口地址为60H 。   松开按下的键时,也产生一个扫描码,扫描码说明了松开的键在键盘上的位置。松开按键时产生的扫描码也被送入60H 端口中。 一般将按下一个键时产生的扫描码称为通码,松开一个键产生的扫描码称为断码。   扫描码长度为一个字节,通码的第7位为0,断码的第7位为1 即:断码 = 通码+80H 比如:g键的通码为22H,断码为a2H。   [caption id="attachment_413" align="aligncenter" width="300"] PC机键盘的处理过程[/caption]  

    BIOS 提供了int 9中断例程,用来进行基木的键盘输入处理,主要的工作如下:

    (1)读出60H 端口中的扫描码; (2)如果是字符键的扫描码,将该扫描码和它所对应的字符码( 即 ASCII码)送入内存中的 BIOS 键盘缓冲区; 键盘的输入到达60H 端口时,相关的芯片就会向CPU 发出中断类型码为 9 的可屏蔽中断信息。 CPU检测到该中断信息后,如果IF=1,则响应中断,引发中断过程,转去执行int 9中断例程。 如果是控制键(比如 Ctrl )和切换键(比如 CapsLock)的扫描码,则将其转变为状态字节( 用二进制位记录控制键和切换键状态的字节 )写入内存中存储状态字节的单元。   (3)对键盘系统进行相关的控制,比如说,向相关芯片发出应答信息。  

    PC机键盘的处理过程演示(详细讲解视频中解析)

      BIOS键盘缓冲区是系统启动后,BIOS用于存放int 9 中断例程所接收的键盘输入的内存区。 [kml_flashembed publishmethod="static" fversion="8.0.0" movie="http://blog.fishc.com/wp-content/uploads/2012/07/15_键盘输入处理过程.swf" width="400" height="300" targetclass="flashmovie" wmode="transparent"] Get Adobe Flash player [/kml_flashembed]   该内存区可以存储 15 个键盘输入,因为 int 9 中断例程除了接收扫描码外,还要产生和扫描码对应的字符码,所以在BIOS键盘缓冲区中,一个键盘输入用一个字单元存放,高位字节存放扫描码,低位字节存放字符码。 0040:17 单元存储键盘状态字节,该字节记录了控制键和切换键的状态。   键盘状态字节各位记录的信息如下: [caption id="attachment_415" align="aligncenter" width="300"] 键盘状态字节各位记录的信息[/caption] [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LUPWEVTIGIRB']视频下载[/Downlink]
  • 相关阅读:
    Entity SQL 初入
    ObjectQuery查询及方法
    Entity Framework 的事务 DbTransaction
    Construct Binary Tree from Preorder and Inorder Traversal
    Reverse Linked List
    Best Time to Buy and Sell Stock
    Remove Duplicates from Sorted Array II
    Reverse Integer
    Implement Stack using Queues
    C++中const限定符的应用
  • 原文地址:https://www.cnblogs.com/LoveFishC/p/3846089.html
Copyright © 2011-2022 走看看