转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne
☞中断概述
- 中断时CPU处理外部突发事件的一个重要技术。它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又逻辑返回断点,继续进行CPU原来的工作。
- 引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为内部中断和外部中断。
中断类型
中断源
常见
可否屏蔽
外部中断
一般是指由计算机外设发出的中断请求。
键盘中断、打印机中断、定时器中断等
外部中断可以屏蔽,即利用中断控制器可以屏蔽这些外设的中断请求。
内部中断
硬件出错或者运算出错所引起的中断。
1.硬件出错: 如突然断电、奇偶校验错等
2.运算出错:除数为零、运算溢出、单步中断等
内部中断是不可屏蔽的中断。(内部中断是CPU提供的一种功能,汇编程序员是无法控制这种机制(即中断过程是由CPU硬件完成的),只能利用)
软件中断
其实不是真正的中断。
它们只是可以被调用执行的一般程序以及DOS的系统功能调用(INT 21H)等都是软件中断。
-
CPU为了处理并发的中断请求,规定了中断的优先级,中断优先权由高到低的顺序是:
(1). 除法错、溢出中断、软件中断 ; (2).不可屏蔽中断 ; (3).可屏蔽中断; (4).单步中断
☞中断的几个术语和概念
- 术语表
术语
含义
备注
中断信息
检测从CPU外部发送过来或内部产生的一种特殊信息。中断信息要求CPU马上进行处理,并向所要进行的该种处理提供了必备的参数的通知信息。
使用中断类型码来标识中断信息(8086共256种),中断类型码相当于中断信息的id。
中断源
中断信息的来源。
中断类型码
标志中断信息的标志,中断类型码为1个字节型数据(共256种中断信息的来源)。
例如:除法错误的中断类型码是0,单步执行的中断类型码是1
中断处理程序
处理中断信息的程序。
根据中断类型码找到对应的中断处理程序。
中断处理程序也应该常驻内存。
中断向量
中断处理程序的入口地址。
(IP-低地址+CS-高地址)。8086中断向量占4个字节,共256个中断向量。
中断向量表
中断向量的列表,中断向量表保存在内存中
8086PC机存放在0000:0000-0000:03FF
中断过程
8086CPU在受到中断信息后,由CPU硬件自动完成的一系列工作,称为中断过程[后面详细讲解]。
这是CPU硬件提供的一种机制。
-
重点讲解中断向量表
下图显示了中断向量表。8086PC机存放在0000:0000-0000:03FF,其中每一个中断向量占有4个字节,高地址存放段地址,低地址存放偏移地址。中断类型码为N的中断处理程序的地址在(N*4+2):(N*4)中。
-
重点讲解中断过程
中断过程是在受到中断信息后,CPU硬件自动完成的一系列工作。具体的工作:
(1). 取得中断类型码N;
(2). pushf
(3). 设置TF=0, IF=0
(4). push CS
(5). push IP
(6). (IP)=(N*4), (CS)=(N*4+2)
--------以上这些工作程序员是无法控制的,CPU不断的在检测是否有中断发生。
--------我们所能做的就是编写中断处理程序和设置中断向量; 当然程序员可以诱导中断(如int21h)
--------上述工作完成后,CPU开始执行由程序员编写的中断处理程序。
☞内中断
8086CPU有如下4种情况的内中断。
情况 | 中断类型码 |
除法错误 | 0 |
单步执行 | 1 |
执行into指令 | 4 |
执行int n指令 | n |
☞编写中断处理程序的步骤
-
中断处理程序的编写方法和子程序比较相似,常规的步骤:
(1). 保存用到的寄存器;
(2). 处理中断;
(3). 恢复用到的寄存器;
(4). 用iret指令返回。
其中iret指令的汇编语法描述:
pop ip
pop cs
popf
-
中断处理程序应该常驻内存。
由于0000:0000-0000:03FF这1kb的空间的中断向量表许多单元是空的。一般情况下,0000:0200-0000:02FF的256个字节所对应的向量表项是空的,操作系统和其他应用程序都不占用,所以是一段安全的内存。我们可以将中断处理程序和其所需要的数据安装到该空间中。
☞编写0号中断
- 程序的框架:
1 assume cs:code 2 3 code segment 4 start: 5 do0安装程序 6 设置中断向量表 7 mov ax, 4c00h 8 int 21h 9 10 do0: 显示字符串"overflow!" 11 mov ax, 4c00h 12 int 21h 13 14 code ends 15 end start
-
分析:上面的程序分为两部分:
(1). 安装do0,设置中断向量的程序
(2). do0-0号中断处理的程序
- 代码
install.asm
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 9 mov ax, 0 10 mov es, ax 11 mov di, 200h ; 设置es:di指向目的地址 12 13 mov cx, offset do0end-offset do0 ; 设置cx为传输长度 14 15 cld ; 设置传输方向为正 16 rep movsb 17 18 ; 设置中断向量表 19 mov ax, 0 20 mov es, ax 21 mov word ptr es:[0*4], 200h 22 mov word ptr es:[0*4+2], 0 23 24 mov ax, 4c00h 25 int 21h 26 27 do0: jmp short do0start 28 db "overflow!" 29 30 do0start: 31 mov ax, cs 32 mov ds, ax 33 mov si, 202h ; 设置ds:si指向字符串 34 mov ax, 0b800h 35 mov es, ax 36 mov di, 12*160+36*2 ; 设置es:di指向显存空间的中间位置 37 38 mov cx, 9 39 s: 40 mov al, [si] 41 mov es:[di], al 42 inc si 43 add di,2 44 loop s 45 46 mov ax, 4c00h 47 int 21h 48 do0end: nop 49 50 code ends 51 end start
诱发程序
1 assume cs:code 2 3 code segment 4 start: 5 mov ax, 1000h 6 mov bh, 1 7 div bh 8 9 code ends 10 11 end start
☞1号中断-单步中断
-
中断过程
CPU在执行一条指令后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。如下:
(1). 取得中断类型码1;
(2). pushf
(3). 设置TF=0, IF=0
(4). push CS
(5). push IP
(6). (IP)=(1*4), (CS)=(1*4+2)
-
why?CPU为什么要提供这样的功能?
设想如果CPU不提供单步中断,那么只要CPU一加点,那么就会从预设的地址开始一直执行下去,不可能有任何程序能够控制它在执行完一条指令后停止,去做别的事。
-
debug如何利用CPU提供的单步中断?
debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容并且等待输入命令。
在使用t命令执行指令时,Debug将TF设置为1,使得CPU工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,显示所有寄存器中的内容并且等待输入命令。
- 注意查看FR的TF和IF标志位(见笔记11)。