汇编语言笔记12-内中断

转载必须注明出处,违者必究。http://www.cnblogs.com/dennisOne

中断概述

  1. 中断时CPU处理外部突发事件的一个重要技术。它能使CPU在运行过程中对外部事件发出的中断请求及时地进行处理,处理完成后又逻辑返回断点,继续进行CPU原来的工作。
  2. 引起中断的原因或者说发出中断请求的来源叫做中断源。根据中断源的不同,可以把中断分为硬件中断和软件中断两大类,而硬件中断又可以分为内部中断和外部中断

    中断类型

    中断源

    常见

    可否屏蔽

    外部中断

    一般是指由计算机外设发出的中断请求。

    键盘中断、打印机中断、定时器中断等

    外部中断可以屏蔽,即利用中断控制器可以屏蔽这些外设的中断请求。

    内部中断

    硬件出错或者运算出错所引起的中断。

    1.硬件出错: 如突然断电、奇偶校验错等

    2.运算出错:除数为零、运算溢出、单步中断等

    内部中断是不可屏蔽的中断。(内部中断是CPU提供的一种功能,汇编程序员是无法控制这种机制(即中断过程是由CPU硬件完成的),只能利用)

    软件中断

    其实不是真正的中断。

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

      

  3. CPU为了处理并发的中断请求,规定了中断的优先级,中断优先权由高到低的顺序是:

    (1). 除法错、溢出中断、软件中断 ; (2).不可屏蔽中断 ; (3).可屏蔽中断; (4).单步中断

   

中断的几个术语和概念

  1. 术语表

    术语

    含义

    备注

    中断信息

    检测从CPU外部发送过来或内部产生的一种特殊信息。中断信息要求CPU马上进行处理,并向所要进行的该种处理提供了必备的参数的通知信息。

    使用中断类型码来标识中断信息(8086256)中断类型码相当于中断信息的id

    中断源

    中断信息的来源。

      

    中断类型码

    标志中断信息的标志,中断类型码为1个字节型数据(256种中断信息的来源)

    例如:除法错误的中断类型码是0,单步执行的中断类型码是1

    中断处理程序

    处理中断信息的程序。

    根据中断类型码找到对应的中断处理程序。

    中断处理程序也应该常驻内存。

    中断向量

    中断处理程序的入口地址。

    (IP-低地址+CS-高地址)8086中断向量占4个字节,共256个中断向量。

    中断向量表

    中断向量的列表,中断向量表保存在内存中

    8086PC机存放在0000:0000-0000:03FF

    中断过程

    8086CPU在受到中断信息后,由CPU硬件自动完成的一系列工作,称为中断过程[后面详细讲解]

    这是CPU硬件提供的一种机制。

  2. 重点讲解中断向量表

    下图显示了中断向量表。8086PC机存放在0000:0000-0000:03FF,其中每一个中断向量占有4个字节,高地址存放段地址,低地址存放偏移地址。中断类型码为N的中断处理程序的地址在(N*4+2):(N*4)中。

  3. 重点讲解中断过程

    中断过程是在受到中断信息后,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. 中断处理程序的编写方法和子程序比较相似,常规的步骤:

    (1). 保存用到的寄存器;

    (2). 处理中断;

    (3). 恢复用到的寄存器;

    (4). iret指令返回。

    其中iret指令的汇编语法描述:

    pop ip

    pop cs

    popf

  2. 中断处理程序应该常驻内存。

    由于0000:0000-0000:03FF1kb的空间的中断向量表许多单元是空的。一般情况下,0000:0200-0000:02FF256个字节所对应的向量表项是空的,操作系统和其他应用程序都不占用,所以是一段安全的内存。我们可以将中断处理程序和其所需要的数据安装到该空间中。

   

编写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号中断-单步中断

  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)

  2. whyCPU为什么要提供这样的功能?

    设想如果CPU不提供单步中断,那么只要CPU一加点,那么就会从预设的地址开始一直执行下去,不可能有任何程序能够控制它在执行完一条指令后停止,去做别的事

  3. debug如何利用CPU提供的单步中断?

    debug提供了单步中断的中断处理程序,功能为显示所有寄存器中的内容并且等待输入命令

    在使用t命令执行指令时,DebugTF设置为1,使得CPU工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,显示所有寄存器中的内容并且等待输入命令。

  4. 注意查看FRTFIF标志位(见笔记11)
posted @ 2012-10-24 16:01  dennis_fan  阅读(2273)  评论(0编辑  收藏  举报