zoukankan      html  css  js  c++  java
  • [汇编学习笔记][第十二章内中断]

    第十二章 内中断

    任何一个通用CPU,在执行完当前执行的指令,检测到从CPU外部发送过来,或内部发送过来的一种特殊信息,并且可以立即对所接收到的消息进行处理。这个消息,我们称为中断消息

    中断消息可以来自CPU的内部和外部,这一章中,我们主要讨论来自于CPU**内部**的中断消息

    12.1 内中断的产生

    8086CPU中发生以下事件,会产生相应的中断消息。

    • 除法错误
      • 中断类型码:0
    • 单步执行
      • 中断类型码:1
    • 执行into指令
      • 中断类型码:4
    • 执行int指令
      • 中断类型码:该指令格式为int n,指令中n为字节型立即数,提供给CPU的中断类型码。

    8086CPU用称为中断类型码的数据来标示来源

    • 中断类型码是一个字节,可以表示256种中断信息的来源。
    • 将产生中断事件的来源,称位中断源

    12.2 中断处理程序

    CPU收到中断信息后,需要对中断信息进行处理。而如何处理,可由我们编程确定。这样的程序称为,中断处理程序

    如果将8位中断类型码得到相应的中断处理程序的CS:IP呢?

    这就是下一章的学习内容

    12.3 中断向量表

    • 中断向量表在内存中保存,其中存放着256个中断源所对应的中断处理程序的入口。
    • 中断向量表的入口对于8086CPU就在0000:0000~0000:03FF的1024个单元中存放.
    • 一个中段向量表的单元占4个字节,高地址放段地址, 低地址放偏移地址

    12.4 中断过程

    • 用中断类型码,在中断向量表中找到中断处理程序的入口
    • 根据入口,使CPU执行中断处理程序

    这个过程由CPU的硬件自动完成, CPU硬件完成这个过程叫中断过程

    具体是这样的

    • 取得中断码
    • 标志寄存器入栈(因为中断过程要改变寄存器的值)
    • 设置标志寄存器的第8位TF和第9位IF的值为0
    • CS的内容入栈
    • IP的内容入栈
    • 读取中断处理程序

    代码是这样的

    • 取得中断类型码N;
    • pushf
    • TF=0,IF=0
    • push CS
    • push IP
    • (IP)=(N*4),(CS)=(N*4+2)

    12.5 中断处理程序和iret指令

    中断程序的过程

    • 保存用到的寄存器 (注意不是寄存标志器)
    • 处理中断
    • 恢复用到的寄存器
    • iret指令返回

    iret指令详细

    • pop IP
    • pop CS
    • popf

    12.11 单步中断

    如果检测到标志寄存器TF位为1,则产生单步中断

    • 所以为了防止在进行中断处理程序的时候,因为 TF=1,又去执行中断处理程序,所以在进入中断程序前要使TF=0

    12.12 响应中断的特殊情况

    在某些情况,CPU执行完当前命令后,即便是发生中断,CPU也不会响应。

    举例:

    在执行完向ss寄存器传送数据的指令后,即便是发生中断,CPU也不会响应,ss:sp联合指向栈顶,如果单纯的修改了ss,触发中断,但是中断的时候也需要利用到栈,那么因为只修改了ss,很有可能指向的不是正确的栈顶。所以要ss:sp设置完后才能响应中断。

  • 相关阅读:
    Spring Data JPA条件查询
    Cannot add foreign key constraint
    项目运行慢的原因剖析
    文本摘要的一些研究概念
    datatables表格设置序号自增
    记录一次没有报错的错误
    final、static、this、super关键字总结
    datatables条件搜索后表格内出现重复字符串
    linux上重装redis,设置密码
    datatables render出现重复的字符
  • 原文地址:https://www.cnblogs.com/zy691357966/p/5480515.html
Copyright © 2011-2022 走看看