汇编第十二节-内中断

第十二节:内中断

中断信息:CPU在执行完当前正在执行的之后,检测到从CPU外部发送过来的或内部产生的一种特殊信息,并且可以立即对所接受到的信息进行处理。

1.内中断的产生:

当CPU内部有下面的情况发生的时候,将产生相应的中断信息
中断类型码:来标识中断信息的来源。
中断源:中断类型码

a.除法错误:0(比如,执行div指令产生的除法溢出)
b.单步执行:1
c.执行into指令:4
d.执行int指令:int n,指令中的n为字节型立即数,是提供给CPU中断类型码

2.中断处理程序:

中断处理程序:编写用来处理中断信息的程序
CPU在收到中断信息后,如何根据中断信息确定其处理程序的入口?中断类型码
如何根据8位的中断类型码得到中断处理程序的段地址和偏移地址呢?

3.中断向量表:

中断处理程序的入口地址的列表
CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。

a.内存中保存,其中存放着256个中断源所对应的中断处理程序入口
b.中断向量表指定放在内存地址0处,从内存0000:0000到0000:03FF的1024个单元中存放着中继向量表。
c.一个表项占2个字,高地址字存放段地址,低地址字存放偏移地址。

4.中断过程:

a.(从中断信息中)取得中断类型码;
b.标志寄存器的值入栈(因为在中断过程中要改变标志寄存器的值,所以先将其保存在栈中)
c.设置标志寄存器的第8位TF和第9位IF的值为0
d.CS的内容入栈
e.IP的内容入栈
f.从内存地址为中断类型码*4和中断类型码*4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS

最后一步完成后,CPU开始执行由程序员编写的中断处理程序。

5.中断处理程序和iret指令:

编写中断处理程序步骤:

a.保存用到的寄存器
b.处理中断
c.恢复用到的寄存器
d.用iret指令返回

iret完成后,CPU回到执行中断处理程序前的执行点继续执行程序
iret指令的功能:

pop IP
pop CS
popf

//中断过程中,寄存器入栈的顺序是标志寄存器,CS,IP
iret出栈顺序是IP,CS,标志寄存器

6.除法错误中断的处理:

eg:

mov ax,1000h
mov bh,1
div bh

当CPU执行div bh的时候,发生了除法溢出错误,产生0号中断错误,从而引发中断过程。
显示提醒 “Divi overflow”

7.编程处理0号中断:

当发生除法溢出时,在屏幕中间显示“overflow!”,返回dos

a.中断过程:
    1.取得中断类型码0
    2.标志寄存器入栈,TF,IF=0
    3.CS,IP入栈
    4.(IP)=(0*4),(CS)=(0&4+2)
b.中断0发生时,CPU将转去执行中断处理程序。
do0:1.相关处理;
    2.向显示缓冲区显示“overflow”
    3.返回dos
c.do0应存放在内存中

系统要处理的中断事件实际并没有达到256个。中断向量表中有空闲,一般0000:0020~0000:02ff的256个字节的空间所对应的中断向量表项都是空的。
一般do0不超过256字节
将do0传送到0000:0020处

e.将中断处理程序do0放到00000200后,do0的入口地址登记在中断向量表的对应表项中。
do0段地址0存放在0000:0002字单元,偏移地址200H存放在0000:0000字单元中。
assume cs:code
code segment
start: do0安装
       设置中断向量表
       mov ax,4c00h
       int 21h
do0:  显示“Overflow”
       mov ax,4c00h
       int 21h
code ends
end start

8.安装:

assume cs:code
code segment
start: mov ax,cs
       mov ds,ax
       mov si,offset do0                ;设置ds:si指向源地址
       mov ax,0
       mov es,ax
       mov di,200h                      ;设置es:di指向目的地址

       mov cx,offset do0end-offset do0  ;设置cx为传输长度

       cld                              ;设置传输方向为正
       rep movsb

       设置中断向量表

       mov ax,4c00h
       int 21h
 do0:  显示“Overflow”
       mov ax,4c00h
       int 21h

do0end:nop
code ends
end start

9.do0:

do0程序主要任务是显示字符串

assume cs:code
code segment
start: mov ax,cs
       mov ds,ax
       mov si,offset do0                ;设置ds:si指向源地址
       mov ax,0
       mov es,ax
       mov di,200h                      ;设置es:di指向目的地址

       mov cx,offset do0end-offset do0  ;设置cx为传输长度

       cld                              ;设置传输方向为正
       rep movsb
       设置中断向量表

       mov ax,4c00h
       int 21h
 do0:  jmp short do0start
       db "overflow!"

do0start: mov ax,cs
          mov ds,ax
          mov si,202h                   ;设置ds:si指向字符串

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

          mov cx,9                      ;设置cx为字符串长度
     s:   mov al,[si]
          mov es:[di],al
          inc si
          add di,2
          loop s

          mov ax,4c00h 
          int 21h
do0end:nop
code ends
end start

段地址,”overflow!”和do0的代码处于同一个段中,而除法溢出发生时,cs中必然存放do0的段地址,也就是”overflow!”的段地址;再看偏移地址,0:200处指令为jmp short do0start,这条指令占2个字节,所以overflow的偏移地址为202h

10.设置中段向量:

将do0的入口地址0:200,写入中断向量表0号表项,使do0成为0号中断的中断处理程序。
0号表项的地址为0:0,其中0:0字单元存放偏移地址,0:2字单元存放段地址

mov ax,0
mov es,ax
mov word ptr es:[0*4],200h
mov word ptr es:[0*4+2],0

11.单步中断:

CPU在执行完一条指令之后,如果检测到标志寄存器的TF位为1,则产生单步中断。
单步中断的中断类型码为1,中断过程如下:

a.取得中断类型码1
b.标志寄存器入栈,IF,IF=0
c.CS,IP入栈
d.(IP)=(1*4),(CS)=(1*4+2)

debug提供了单步中断的中断处理程序,功能为显示所有寄存器中内容后等待输入命名。
然后,t命令执行时,debug将TF设为1,使CPU工作于单步中断方式下,则在CPU执行完这条指令后就引发单步中断,执行单步中断的中断处理程序,所有寄存器中的内容被显示在显示屏幕上,并且等待输入命令。
在进入中断处理程序之前,设置TF=0,避免CPU在执行中断处理程序的时候发生单步中断。

12.响应中断的特殊情况:

在有些情况下,CPU在执行完当前指令后,即便时发生中断,也不会响应。
比如执行向SS寄存器传送数据的指令后,即便发生中断,CPU也不会响应。
如果在执行完设置SS的指令后,CPU响应中断,引发中断过程,要在栈中压入标志寄存器,CS和IP的值。而SS改变,SP并没改变,SS:SP指向的不是正确的栈顶,将错误。
利用这个特性,将设置ss和sp的指令连续存放,使得设置sp的指令紧接这设置ss的指令执行,在此之间,CPU不会引发中断过程。
eg:将栈顶设为1000:0

mov ax,1000
mov ss,ax
mov sp,0

而不是

mov ax,1000
mov ss,ax
mov ax,0
mov sp,0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值