第十二章 内中断

1、中断是CPU处理外部突发事件的一个重要技术。引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为外部中断和内部中断。外部中断是指由计算机外设发出的中断请求,如:键盘中断、打印机中断、定时器中断等。外部中断是可以屏蔽的中断,也就是说利用中断控制器可以屏蔽这些外部设备中断请求。内部中断是指因硬件出错(如突然掉电、奇偶校验错等)或运算出错(除数为零、运算溢出、单步中断等)所引起的中断。内部中断是不可屏蔽的中断。软件中断其实并不是真正的中断,他们只是可被调用执行的一般程序以及DOS的系统调用功能(int 21h)等都是软件中断。CPU为了处理并发的中断请求,规定了中断的优先权,中断优先权由高到低的顺序是:1.除法错、溢出中断、软件中断;2.不可屏蔽中断;3.可屏蔽中断;4.单步中断。

2、中断为windows多任务奠定基础,任务之间不断切换

3、中断信息中包含有标识中断源的类型码,它是用来定位中断处理程序的。

4、如何根据8位的中断类型码(8086中断类型码为一个字节)得到中断处理程序的段地址和偏移地址呢?这就要引入“中断向量表”了。中断向量表就是中断向量的列表,CPU用8位的中断类型码通过中断向量表找到相应的中断程序的入口地址

5、对于8086PC机,中断向量表指定放在内存地址0处,从内存0000:0000到0000:03ff的1024个单元中存放着中断向量表(一个中断数据4个字节)。这包含0:200——0:2FF的安全地址,是因为不是所有的中断都用的到

6、存储n号中断源对应的中断处理程序入口的偏移地址的内存单元的地址为:n*4,存储段地址的内存单元地址为n*4+2。

7、中断过程:1.(从中断信息中)取得中断类型码;2.标志内存器的值入栈(保护标志位);3.设置标志寄存器的第8位TF和第9位IF的值为0;4.CS内容入栈;5.IP内容入栈(跟call很像,保存返回地址);6.从内存地址的中断类型码中读取入口地址设置CS和IP。

8、中断处理程序:由于CPU随时都可能检测到中断信息,也就是说,CPU随时都可能执行中断处理程序,所以中断处理程序必须一直存储在内存中

9、iret指令返回中断。Iret通常和硬件自动完成的中断过程配合使用的。描述为pop ip,pop cs,popf。

10、除法错误的中断的处理(0号中断):可以修改中断处理程序(要返回DOS),用rep movsb将代码送入0:200处。

11、编译器可以处理表达式,例如mov ax (5+3)*3/10

12、单步中断:debug的t命令实现效果跟这个有关的。CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断,引发中断过程。提供单步中断的原因:为单步跟踪提供了实现机制。

13、响应中断的特殊情况:例如:在执行完向ss寄存器传送数据指令后,即便检测到中断信号,CPU也不会响应,这样做的主要原意是,SS:sp联合指向栈顶,而对它们的设置应该连续完成。因此我们应该ss和sp设置紧挨着

 

View Code
 1 assume cs:code
2
3 data segment
4 db "Welcome to Fish.com!" ;字符串也该放在一个安全的内存空间
5 ;因为程序执行完内存会被释放
6 data ends

7
8 code segment
9
10 start:mov ax,cs
11 mov ds,ax
12 mov si,offset do0 ;源数据地址ds:si
13 mov es,ax

14 mov di,200h ;目标数据地址es:di
15

16 mov cx,offset doend - offset do0 ;do0代码长度
17 cld ;设置传输方向为正
18 rep movsb

19
20 mov ax,0 ;设置中断向量表
21 mov es,ax

22 mov word ptr es:[0*4],200h
23 mov word ptr es:[0*4+2],0
24
25 mov ax,4c00h
26 int 21h
27
28 do0: jmp short do0start ;改进后
29 db "Welcome to Fishc.com!" ;在代码段存储数据
30

31 do0start: ;显示字符串
32 mov ax,data

33 mov ds,ax
34 mov si,202h ;jmp short do0start占两个字节,所以数据从202开始
35

36 mov ax,0b800h
37 mov es,ax
38 mov di,12*160+36*2 ;设置es:di指向显存空间的中间位置
39

40 mov cx,21 ;设置字符串长度
41 s:mov al,[si]

42 mov es:[di],al
43 inc si
44 add di,2
45
46 mov al,02h ;设置颜色
47 mov es:[di],al

48 add di,1
49 loop s
50
51 mov ax,4c00h
52 int 21h
53 do0end:nop
54
55 code ends
56 end start

 

posted @ 2012-03-18 08:27  飞向梦  阅读(407)  评论(0编辑  收藏  举报