Reverse-1.1X86汇编----中断

一、中断介绍

        中断,是指在程序执行过程中,出现了某种紧急事件,CPU暂停执行现行程序,转去执行处理该事件的程序(中断服务程序),执行完再返回到被暂停的程序继续执行,这一过程被称为中断。

        中断源

        引起中断的设备或事件称为中断源。计算机的中断源可能是某个硬件,也可能是某个软件,常见的中断源有:

  1. 一般I/O设备发出的中断请求,如键盘、打印机等。
  2. 数据通道发出的中断请求,如磁盘、光盘等。
  3. 实时时钟发出的中断请求,如定时器芯片8253的定时输出。
  4. 硬件故障发出的中断请求,如电源掉电,RAM奇偶校验出错等。
  5. 软件故障发出的中断请求,如除数为0的除法运算、地址越界、使用非法指令等。
  6. 软件设置的中断源。如在程序中调用中断指令而产生的的中断。

1.1中断源分类

内中断和外中断。

        cpu内部产生的中断、由控制器产生的中断、由程序员安排的中断,称为内部中断

        外部中断,由外部设备产生的中断。可分为可屏蔽中断和不可屏蔽中断,可屏蔽中断是指可以延时处理的事件,例如打印机输入输出的中断。如果此时CPU有更重要的事件,打印机的中断请求将会被屏蔽并保存到中断寄存器里边,当屏蔽解除后。仍然能够得到相应和处理。不可屏蔽中断是指事件异常紧急,必须马上处理,例如:掉电。内存奇偶校验错误引起的中断。

       CPU提供统一的接口作为中断信号的公共线路,所有来自外设的中断信号都共享公共线路连接到CPU,外部硬件的中断通过两根信号线通知CPU的 两根信号线分别是INTR(INTeRrupt)和NMI(Non Maskable Interrupt),示意图如下 在CPU上运行的程序都是串行的,串行的意思就是所有任务都是一个接一个在CPU上运行的 从INTR引脚收到的中断都是不影响系统运行的,可以随时处理 从NMI引脚收到的中断,那基本上全是硬伤,CPU都没有运行下去的必要了 可屏蔽中断是通过INTR引脚进入CPU的,外部设备如硬盘、网卡等发出的中断都是可屏蔽中断,可屏蔽的意思是此外部设备发出的中断,CPU可以不必理会,因为它不会让系统宕机,所以可以通过eflags寄存器的IF位将所有这些外部设备的中断屏蔽 中断处理程序分为上半部和下半部两部分,把中断处理程序中需要立即执行的部分(分分钟不能耽误的部分)划分到上半部,这部分是要限时执行的,所以通常情况下只完成中断应答或硬件复位等重要紧迫的工作。而中断处理程序中那些不紧急的部分则被推迟到下半部中去完成。由于中断处理程序的上半部是刻不容缓要执行的,所以上半部是在关中断不被打扰的情况下执行的。当上半部执行完成后就把中断打开了,下半部也属于中断处理程序,所以中断处理程序下半部则是在开中断的情况下执行的,如果有新的中断发生,原来这个旧中断的下半部就会被换下 CPU,先执行新的中断处理程序的上半部,等待线程调度机制为旧中断处理程序择一日期(就是指调度算法认为的某个恰当时机)后,再调度其上 CPU 完成其下半部的执行 不可屏蔽中断是通过 NMI 引脚进入 CPU 的,它表示系统中发生了致命的错误,它等同于宣布:计算机的运行到此结束了 CPU收到中断后通过中断向量表或中断描述符表(中断向量表是实模式下的中断处理程序数组,在保护模式下已经被中断描述符表代替)来寻找解决方法 中断发起时,相应的中断向量号通过 NMI 或 INTR引脚被传入 CPU,中断向量号是中断向量表或中断描述符表里中断项的下标,CPU 根据此中断向量号在中断向量表或中断描述符表中检索对应的中断处理程序并去执行。

        屏蔽中断与eflags的IF位有关。

该表来源:1.3.2 中断和异常(内中断和外中断、中断处理过程)_BitHachi-CSDN博客_内中断和外中断

Reverse-1.1X86汇编----中断_第1张图片

补充:内中断包括into中断溢出。对应中断类型04H; 是否可以引发04H中断还与eflags中的OF溢出标志位有关。

二、中断处理过程

        中断处理的基本过程包括:中断请求,中断判优,中断响应,中断服务和中断返回等五个阶段。

        2.1中断请求

        1.发生在CPU内部的中断,不需要提供中断请求,CPU内部的中断控制逻辑直接接受处理。

        2.外部中断请求由中断源提出。外部中断源利用CPU的中断引脚输入中断请求信号,一般CPU设有两条中断请求输入引脚,(可屏蔽中断请求输入引脚INTR、不可屏蔽中断请求输入引脚NMI)

        中断请求触发器:

        每个中断源发出中断请求信号的时间是不确定的,而CPU在何时响应中断也是不确定的,所以每一个中断源都有一个中断请求触发器,锁存自己的中断信号,并保持到CPU响应这个中断请求才会清除。

        中断允许触发器

        在CPU内部有一个中断允许触发器,当其值为1时,允许CPU响应中断,称为开中断,;若其为0时,不允许CPU响应中断,中断被屏蔽,称为关中断

        通常,当CPU复位时,中断允许触发器也复位为0,当CPU中断响应时,CPU自动关闭中断,禁止接收另一个新的中断。

        中断允许触发器可以通过开中断或者关中断指令来设置。

        2.2中断判优

        CPU一次只能接收一个中断源的请求,当多个中断源同时想CPU提出中断请求时,CPU必须找出中断优先级最高的中断源,这一过程被称为中断判优,中断判优可以采用硬件方式,也可以采用软件方式。

2.2.1软件判优

        CPU检测到中断请求后,首先读取中断请求寄存器的内容,逐位检测他们的状态,检测到某一位为1,就确定对应的中断源有中断请求,转去执行它的中断服务程序。先检测哪一个,哪一个优先级就高,后检测哪一个哪一个优先级就低,检测的顺序就是中断源判优的顺序。

软件判优eg:

Reverse-1.1X86汇编----中断_第2张图片

对应程序:

Reverse-1.1X86汇编----中断_第3张图片

         软件判优耗时较长,如果中断源很多,中断的实时性就很差,但是软件中断的特点就是顺序安排很灵活。

2.2.2硬件判优

        利用专门的硬件电路确定中断源的优先级,有两种常见方式:菊花链判优电路和中断控制器判优。

2.2.2.1、菊花链判优电路:

Reverse-1.1X86汇编----中断_第4张图片

判断过程:

        CPU收到中断请求,如果允许中断,CPU发出中断响应信号。中断请求先到达第一个中断输出,如果第一个有中断请求,就会通过第二个与门将后边的信号值为0,封锁他。使他不能向下一个中断源传送信号,无论下边中断源是否有中断信号,,都不会被响应。

2.2.2.2、中断控制器判优

图示:

Reverse-1.1X86汇编----中断_第5张图片

        中断控制器,如8259A。可以以多种方式设置中断源的中断优先级,中断控制器有一个中断有优先级判别器,它自动判别出目前提出中断请求的优先级最高的中断源,并将它的中断向量码,送到数据总线,CPU通过中断向量码找到对应的中断服务子程序。

2.3中断响应

        经过中断判优,中断处理就进入中断响应阶段,中断响应时,CPU向中断源发出中断响应信号,同时执行一下操作:①保护硬件现场、②关中断、③保护断点、④获得中断服务程序的入口地址

2.4中断服务

中断服务程序的一般结构为:

        ①保护现场,在中断服务程序的起始部分安排若干条入栈指令,将各寄存器的内容压入堆栈保存。

        ②开中断,在中断服务程序执行过程中允许更高级别的中断请求中断现行的中断服务程序。实现中断嵌套。

        ③中断服务,完成中断源的具体要求。

        ④恢复现场,中断服务程序结束前,必须恢复主程序的中断现场,通常是将保存在堆栈中的现场信息弹到原来的寄存器中。

        ⑤中断返回,返回到原程序的断点处,继续执行原程序。

2.5中断返回

        返回到原程序的断点处,恢复硬件现场,继续执行原程序,中断返回的操作就是中断响应的逆过程

三、中断向量与中断向量表

3.1 简介

        8086/8088CPU含有两个中断请求信号输入引脚,INTR和NMI,还有一个中断应答引脚INTA,与中断相关的指令有INT、INTO、INT3和IRET,还有两个与中断相关的标志位IF和TF。

        8086/8088CPU的中断系统可以处理256中不同类型的中断,每种类型的中断对应一个编号,称为中断类型码或中断向量码,编号范围为0~255.每种中断都有对应的中断服务程序,中断服务程序的入口地址称为中断向量,256种中断向量存储在内存中构成一张表,称为中断向量表。

        每个中断向量包含两部分,段地址和偏移地址,因此存放一个中断向量需要四个内存单元,256种中断向量共需要1K个内存单元。(00000H~003FFH)

        中断向量表位于内存起始位置00000H~003FFH的存储区间,从地址0000H开始,每四个单元存放一个中断向量,其低地址的两个单元存放中断向量的偏移地址,高地址的两个单元存放中断向量的段基址,256中中断向量码按照0-255的顺序依次写入中断向量表中。

Reverse-1.1X86汇编----中断_第6张图片Reverse-1.1X86汇编----中断_第7张图片

        中断向量在中断向量表中存放的首地址称为向量地址,其值为:中断类型码*4

        如DOS系统功能调用的中断信号为21H,向量地址为:n*4=84H。

        当CPU调用中断类型码为n的中断服务程序时。首先把n乘4,得到他的向量地址4n,然后把4n+1:4n两个单元的内容取出,装入IP寄存器;再把(4n+3:4n+2)两个单元格内容取出装入CS寄存器,CPU就获得了n的中断服务程序的入口地址,进而转向执行中断服务程序的内容。

案例:

Reverse-1.1X86汇编----中断_第8张图片

 3.2中断向量的分类

        8086/8088CPU的全部256种中断类型,其中0~31号是微处理器专用中断,从类型32开始直到255作为用户中断类型。

        Intel保留前32(0~31)个中断向量为Intel各种微处理器专用,其中,类型0~4的中断向量在8086~奔腾的所有处理器中都相同,其他中断向量存在于80286及以上微处理器组成的系统内,这些专用的向量中断对应的中断程序由系统设置。

         从类型32开始到255为用户中断类型,用户中断向量由用户填写到中断向量表中,中断服务程序也由用户编写。

 Reverse-1.1X86汇编----中断_第9张图片

 3.3 8086/8088专用中断(5个)

类型0:除法错中断,除法运算结果溢出或者除以0是发生,屏幕出现错误提示。

类型1:单步中断,也称为陷阱中断,如果TF标志位为1,CPU每执行一条指令,就会停下来等待。并提示CPU内部各寄存器的值和一些附带信息。

        单步中断使用户可以逐条执行程序,让程序员能够精确了解程序的执行情况,给用户调试程序提供方便。

注意:在8086中,没有专门设置TF清0或者置1的指令,要是TF清0或者置1\需要通过执行一段程序实现,

eg:①使TF标志位置1,设置单步中断

PUSHF;将eflags压栈

POP AX;将flag内容弹到ax寄存器中,

OR AX,0100H;将AX内容与0100H或运算,将对应TF位置置1

PUSH AX;将AX压入栈

POPF;将内容弹回eflags中

        ②使TF标志位清0,禁止单步中断

PUSHF;将eflags压栈

POP AX;将flag内容弹到ax寄存器中,

AND AX,0FEFFH;将AX内容与0FEFFH或运算,将对应TF位置置0

PUSH AX;将AX压入栈

POPF;将内容弹回eflags中

类型2:非屏蔽中断。该中断不能被软件禁止。非屏蔽中断由CPU之外的硬件产生。通过CPU的NMI引脚输入中断请求信号,上升沿触发。该信号用于处理紧急事件,如奇偶校验错,电源掉电等,

类型3:断点中断,由一个单字节指令INT3引起的中断,指令代码为0CCH,他的中断服务程序将该指令所处的位置,作为程序断点保存起来。在调试程序时用这条指令设置断点,

类型4:溢出中断,INTO指令的专用向量,如果溢出标志位OF为1,则INTO指令中断正在执行的程序,如果OF为0,则INTO指令不执行任何操作。就像不存在一样,程序继续执行下一条指令。

eg:①程序溢出的情况

MOV BL,126

MOV  AL,5

ADD AL,BL ;程序溢出OF位为1

INTO;执行溢出中断程序

②程序没有溢出的情况

MOV BL,6

MOV  AL,5

ADD AL,BL ;程序溢出OF位为0

INTO;不执行溢出中断程序

3.4 8086/8088专用中断

        除了类型2,类型0,1,3,4均为在微处理器内部产生,属于内部中断,中断类型5~31是Intel为微处理器后继发展而保留的微处理器专用中断类型,也属于内部中断。

        从类型32开始,到类型255作为用户中断类型,这其中既包括由中断指令INT n产生的内部中断,如INT20、INT21;也包括由INTR引脚电平引起的硬件中断,硬件中断属于外部中断。

        内部中断的中断向量码或者由指令给出,或者由CPU直接给出,

        外部中断的中断向量码,CPU通过中断响应总线周期性的从中断控制器获得,中断类型2属于外部中断,但是,他的中断向量码有微处理器直接给出。

3,5中断分类

        BIOS(实模式)的中断向量表如下:

Reverse-1.1X86汇编----中断_第10张图片

Reverse-1.1X86汇编----中断_第11张图片

Reverse-1.1X86汇编----中断_第12张图片

DOS中断:

Reverse-1.1X86汇编----中断_第13张图片

3.6中断子功能表

 常见的中断类型:

int 21H:系统功能调用

格式:

     MOV AH,01(子功能类型)

     INT 21H

通过这样两条指令,输入的字符就会被存储在AL中。

 INT 21H 指令说明及使用方法_积累点滴,保持自我-CSDN博客_int21h

 int 10H:系统功能调用

汇编语言(十二)颜色搭配显示+BIOS功能调用表+INT 10H功能详细列表_誓约胜利之舰-CSDN博客_bios功能调用表

3.7硬件中断

Reverse-1.1X86汇编----中断_第14张图片

3.7.1不可屏蔽中断

        非屏蔽中断/不可屏蔽中断不能被软件禁止,即不受IF标志位控制。NMI采用上升沿触发,中断类型为2,由CPU内部译码产生,优先级高于可屏蔽中断。

        CPU响应这类中断时,将所有的内部寄存器存于使用电池的备份存储器或EEROM中,非屏蔽中断用于处理紧急事件,如,存储器奇偶校验错,电池掉电等,

3.7.2可屏蔽中断

        采用电平触发方式,高电平有效。

        CPU收到中断请求信号后,检测中断允许标志位IF,若IF=1,CPU响应INTR请求,若IF=0,CPU屏蔽INTR请求,被屏蔽的中断请求,可一直保持高电平,直到CPU接收。

        可屏蔽中断的优先级低于不可屏蔽中断,

        中断允许标志位IF可以使用指令STI和CLI进行设置。

Reverse-1.1X86汇编----中断_第15张图片

四、中断处理流程

4.1 8086/8088中断处理流程

Reverse-1.1X86汇编----中断_第16张图片

 Reverse-1.1X86汇编----中断_第17张图片

 Reverse-1.1X86汇编----中断_第18张图片

4.2 过程中堆栈的变化

Reverse-1.1X86汇编----中断_第19张图片

你可能感兴趣的:(笔记,其他)