(五)中断

2017-08-12  本文已影响0人  SwiftAlan

1、内中断的产生

CPU 的内部发生某些需要立即处理的的事情时,就会发出内部中断信息。

除法错误,比如执行 div 指令产生的除法溢出;
单步执行;
执行 info 指令;
执行 int 指令。

CPU 要进行不同的处理,首先要知道中断信息的来源,所以中断信息必须包含识别来源的编码,我们称为中断类型码,8086 CPU中断类型码为一个字节型数据,可以表示 256 种中断信息的来源,简称中断源。在 8086 CPU 中,上述的 4 种中断源表示如下:

除法错误:0
单步执行:1
执行 info 指令:4
执行 int 指令,该指令的格式为 int n ,指令中的 n 为字节型立即数,是提供给 CPU 的中断类型吗。

2、中断向量表

8086 CPU 接收到中断信息后,用 8 位的中断类型码通过中断向量表找到相应的中断处理程序入口地址;中断向量表在内存中存放着,对于 8086 PC 机,中断向量表指定放在内存地址 0 处,从内存 0000:00000000:03FF1024 个 单元中存放着中断向量表,中断向量表只能放在这里。
那么在中断向量表中,一个表项存放着一个中断向量,也就是一个中断处理程序的入口地址,这个入口地址包括段地址和偏移地址,所以一个表项占两个字,高地址字存放段地址,低地址存放偏移地址。
中断过程大致如下:

(1)取得中断类型码
(2)pushf 标志寄存器入栈
(3)tf = 0, if = 0 设置标志寄存器的第 8 位和第 9 位的值为 0
(4)push cs CS 入栈
(5)push ip IP 入栈
(6)(ip) = (n*4), (cs) = (n*4+2) 从内存地址为中断类型码 4 中和中断类型码 4+2 的两个字单元中读取中断处理程序的入口地址。
(7)执行中断程序

例:重新编写一个 0 号中断处理程序,它的功能是在屏幕中间显示 overfliw! 然后返回到操作系统

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 ;设置 CS 为传输长度
        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
            loop s
            mov ax,4c00h
            int 21h
do0end:nop
code ends
end start

3、int 指令

int 指令的指令格式为:int nn 为中断类型码,上面已有提及过,执行过程如下

(1)取中断类型码 n;
(2)标记寄存器入栈,if = 0,tf = 0;
(3)CS、IP 入栈;
(4)(IP)=(n*4),(CS)=(n*4+2)
(5)执行 n 号中断处理程序

上一篇下一篇

猜你喜欢

热点阅读