• 王爽《汇编语言》第三版 第十二章 内中断


    引言

      中断是CPU处理外部突发事件的一个重要技术。

      它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又立即返回断点,继续进行CPU原来的工作。

      引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断两类。

      外部中断一般是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏蔽的中断,也就是说,利用中断控制器可以屏蔽这些外部设备 的中断请求。

      内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算 溢出、单步中断等)所引起的中断。内部中断是不可屏蔽的中断。 

      软件中断其实并不是真正的中断,它们只是可被调用执行的一般程序以及DOS的系统功能调用(INT 21H)等都是软件中断。 

      CPU为了处理并发的中断请求,规定了中断的优先权,中断优先权由高到低的顺序是:(1)除法错、溢出中断、软件中断 (2)不可屏蔽中断 (3)可屏蔽中断 (4)单步中断。

     

    12.1 内中断的产生


    12.2 中断处理程序

      CPU的设计者必须在中断信息和其处理程序的入口地址之间建立某种联系,使得CPU根据中断信息可以找到要执行的处理程序。

      中断信息中包含有标识中断源的类型码。根据CPU的设计,中断类型码的作用就是用来定位中断处理程序。 


    12.3 中断向量表

      CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。

      中断向量表在内存中保存,其中存放着 256个中断源所对应的中断处理程序的入口,如下图所示:

      

      中断向量表在内存中存放,对于8086PC机,中断向量表指定放在内存地址0处。从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表。


    12.4 中断过程

      用中断类型码找到中断向量,并用它设置CS和IP,这个工作是由CPU的硬件自动完成的。CPU 硬件完成这个工作的过程被称为中断过程。

      8086CPU的中断过程:
      1.取得中断类型码;
      2.标志寄存器的值入栈(保护标志位);
      3.设置标志寄存器的第8位TF和第9位IF的值为0;
      4.CS的内容入栈;
      5.IP的内容入栈;
      6.从内存地址为中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS。


    12.5 中断处理程序

      常规的步骤:
      1.保存用到的寄存器。
      2.处理中断。
      3.恢复用到的寄存器。
      4.用iret指令返回。

      iret指令的功能用汇编语法描述为:
        pop IP
        pop CS
        popf


    12.6 除法错误中断的处理


    12.7 编程处理0号中断


    12.8 安装


    12.9 do0


    12.10 设置中断向量

     1 assume cs:code
     2 
     3 code segment
     4 start:    
     5          mov ax, cs
     6          mov ds, ax
     7          mov si, offset do0        ;设置ds:si指向源地址
     8          mov ax, 0
     9          mov es, ax
    10          mov di, 200h            ;设置es:di指向目的地址
    11          mov cx, offset do0end - offset do0        ;设置cx为传输长度
    12          cld                        ;设置传输方向为正
    13          rep movsb
    14         
    15          mov ax, 0               ;设置中断向量表
    16          mov es, ax
    17          mov word ptr es:[0*4], 200h
    18          mov word ptr es:[0*4+2], 0
    19 
    20          mov ax,4c00h
    21          int 21h
    22 
    23 do0:    jmp short do0start
    24          db "Welcome to Fishc.com!"
    25 
    26 do0start:
    27          mov ax, cs
    28          mov ds, ax
    29          mov si, 202h            ;设置ds:si指向字符串
    30 
    31          mov ax, 0b800h
    32          mov es, ax
    33          mov di, 12*160+36*2        ;设置es:di指向显存空间的中间位置
    34 
    35          mov cx, 21                ;设置cx为字符串长度
    36     s:  mov al, [si]
    37          mov es:[di], al
    38          inc si
    39          add di, 1
    40          mov al, 02h             ;设置颜色
    41          mov es:[di], al        
    42          add di, 1
    43        loop s
    44 
    45          mov ax, 4c00h
    46          int 21h
    47 do0end:nop
    48 
    49 code ends
    50 end start


    12.11 单步中断

      CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。

      单步中断的中断类型码为1。

      
    12.12 响应中断的特殊情况

      一般情况下,CPU在执行完当前指令后,如果检测到中断信息,就响应中断,引发中断过程。可是,在有些情况下,CPU 在执行完当前指令后,即便是发生中断,也不会响应。

      CPU在执行完设置ss的指令后,不响应中断。

    参考资料:《小甲鱼汇编零基础入门》

     

         《汇编语言》第三版

  • 相关阅读:
    简易发号SQL,可用于生成指定前缀自增序列--改进版
    关于【【故障公告】数据库服务器 CPU 近 100% 引发的故障(源于 .NET Core 3.0 的一个 bug)】IS NOT NULL测试
    简易发号SQL,可用于生成指定前缀自增序列,如订单号,生成优惠券码等
    [EntityFramework]记录Linq中如何比较数据库中Timestamp列的方法(如大于0x00000000000007D1的记录)
    [高并发]抢红包设计(使用redis)
    [.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路--验证码
    [.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路---部署
    【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接
    Unity光晕剑效果的Shader简单实现
    Unity3D 调用Android与IOS的剪贴板
  • 原文地址:https://www.cnblogs.com/mubu/p/6382768.html
Copyright © 2020-2023  润新知