汇编10号中断外中断

;除法中断在中断向量表中的位置昰00:0003 add bx,ax ;计算字符串的第一个字符在显存中相对于0b800h的位移
}

内中断: 是CPU内部发生情况后而产生嘚中断信息于是CPU便放下手中的活来处理中断例程

8086CPU会产生主要这么几种内中断:

1.除法溢出(0号中断)

2.单步中断(1号中断)

3.执行into指令产生的中断(不清楚)

4.執行int指令产生的中断(常见的int 21就是属于这种)

首先,理解清楚什么是中断例程, 中断向量中断向量表,中断信息中断类型码等概念

1.中断类型碼是一个8位的数,也就是0-255的范围一共256个中断类型码,每一个号码对应一个中断向量

2.中断向量里面包含中断例程的入口地址(CS:IP)其中cs是16位段寄存器,ip也是16位的所以一共4字节

3.中断向量表是一张表存储着256个中断向量而每一个向量存储着一个中断例程的地址,也就是说总共最多会囿256个中断例程

4.中断信息包含很多信息最重要的就是中断类型码该码号指出了中断例程的在内存中的置位

5.中断例程又称为中断处理程序,昰CPU在接收到中断信息后所执行的程序该程序的入口位于中断向量表中的中断向量里

首先中断例程就可以看做程序,这种程序最多只能有256個这些程序在发生中断后会被CPU调用,每个程序都有一个相对于的入口地址

这些地址被存放在一张表里叫做中断向量表因为中断例程最哆有256个,所以中断向量表最多也就是256项而中断向量的地址是如何确定的呢?因为我们只有通过中断向量表才能找到中断例程来处理中断信息

中断向量表在8086CPU中的位置是固定的位于00:03ff这1024字节中,然而我们知道一条中断向量是4字节大小那中断向量表就有1024 / 4 = 256条中断向量

当发生中断時,CPU就会就收到中断信息中断信息里有很多东西, 其中就包括了中断类型码这是一种8位的码,正好也一共有256个完全覆盖中断向量表假设我们收到的中断类型码是8的话, 那么我们通过[8 * 4]和[8 *4 + 2]来确定一条中断向量即其cs:ip 为何是这样? 首先第八号中断类型码,由于中断类型码是从0開始到255所以第八号实际处于第九个的置位,而每一条中断向量是4个字节所以要4 * 8这个地址才是第九个位置的开头即cs的置位,因为cs是16位即2芓节所以ip就处在4 * 8 + 2这个地方

由于中断例程不可能到达256个那么多,所以中断向量表中还有很多是空的 比如00:02FF这256个字节所以便把中断例程放置茬这个位置 ;将中断例程的入口地址放置到中断向量表中 do0: ;为了防止字符串被覆盖所以将其放在中断例程里

以上是0号中断即除法溢出

下面说说1號中断即单步中断,单步中断与TF标志位密切相关如果TF = 1代表开启单步中断,单步中断是什么?

举个例子用debug.exe程序用t指令观察指令执行时寄存器數值变化时程序停了下来,原因就是单步中断

那么如果是这样有一个问题就是TF= 1那进入中断处理程序时不也会一直中断吗即中断里面中斷的循环,实际上这是不会的因为:

当单步中断产生时候即得到中断类型码1,把标志寄存器入栈后随即将TF置零前面直到TF = 1时候单步中断才開启,这样进入单步中断处理程序后就不会再有中断产生了

最后为何在设置ss:sp即栈段的时候中间不能够夹杂其他代码? 

;所以改变了栈顶指针嘚位置使其指向错误位置
}

——王爽 《汇编10号中断语言(第3蝂)》实验12 清华大学出版社

改变0号中断程序的功能重新编写一个0号中断程序,它的功能是在屏幕中间显示“overflow!”

一、什么叫中断,什麼叫0号中断

任何一个通用CPU,可以在执行完当前正在执行的指令之后检测到CPU外部发送过来的(外中断)或者内部产生的(内中断)一种特殊信息,并且可以对所接收的信息进行处理这种特殊的信息,叫做中断信息

什么情况的发生会产生中断信息?
(1)除法溢出比如,执行div指令产生的除法溢出
(3)执行into指令。
(4)执行int指令

下面引入中断类型码的概念:
CPU要对这4种情况可以产生需要及时处理的中断信息进行不同的处理,就要知道这四种中断信息的来源中断类型码用来标识中断信息的来源。
上面4种中断源对应的中断类型码:
(4)int指令 int指令后面跟的n就是中断类型码

0号中断就是中断类型码为0的中断,就是除法溢出中断

二、关于除法溢出的解释

div指令:除法指令。
什么叫除法溢出分为两种情况:
(1)除数为0,会发生溢出
     (2.1)如果除数是字(16位),则被除数(32位)存在dx和ax里(除后商存在ax里,余数存在dx裏)如果除后商大于一个字就会产生精度损失溢出。范围65535
    (2.2)如果除数是字节(8位),则被除数(16位)存在ax里(除后商存在al里,余數存在ah里)如果除后商大于一个字节就会产生精度损失溢出。范围255

三、中断过程及中断向量表

8086CPU在收到中断信息后,引发的中断过程:
(1)(从中断信息中)获得中断类型码
(2)标志寄存器的值入栈。因为在中断过程中要改变标志寄存器的值先保存。
(3)设置标志寄存器的第8位TF和第9位IF的值为0
(4)CS的内容入栈。
(6)从内存地址为中断类型码*4中断类型码*4+2的两个字单元中读取中断处理程序的入口地址设置IP和CS

中断向量表:用来处理程序入口地址的列表。
中断向量表在内存中保存其中存放着256个中断源所对应的中断处理程序的入口。8086支持256個中断但系统要处理的中断事件远没有256个。故在中断向量表中许多单元是空的。内存单元:0000:0000 ~ 0000:03FF1024个单元。每个表项占两个字高地址字存放段地址,低地址字存放偏移地址

改变0号中断程序的功能,重新编写一个0号中断程序它的功能是在屏幕中间显示“overflow!”。

0号中斷程序即除法溢出。编程实现:当发生除法溢出屏幕中央输出“overflow!”,返回DOS
(1)当发生除法溢出时,产生0号中断信息从而引发中斷过程。
(2)当中断0发生时CPU将转去执行中断处理程序
(3)现在的问题是,do0应存放在内存中因为除法溢出随时都可能发生,CPU随时都可能將CS:IP指向do0的入口执行程序。只需要找到一块别的不会用到的内存区把do0传送到其中,而中断向量表(0000::03FF)有许多空的单元【可以将do0传送到内存0000:0200处
为什么是这个空间?因为这个空间是中断向量表为空的部分一般来说,中断向量表的0000::02FF都是空的
(4)将中断处理程序do0放到0000:0200后,若要使除法溢出时CPU转去执行do0,就必须将do0的入口地址(0000:0200) 登记在中断向量表对应的表项中
中断向量表的对应表项:
也就昰要将do0的段地址0存放在0000:0002字单元中,偏移地址200H存放在0000:0000字单元中

1.编写可以显示“overflow!”的中断处理程序:do0;
3.把do0的入口地址0000:0200存在中断向量表0号表项中。

1.程序执行时被加载到内存中此时do0的代码在程序所在的内存空间中,它只是放在程序的代码段中的一段要被传送到其他单元嘚数据此时我们不能说它是0号中断的中断处理程序
2.程序中安装do0的代码执行完后do0的代码被从程序的代码段中复制到0:200处,此时它只不過是放在0:200处的一些数据我们也不能说它是0号中断的中断处理程序
3.程序中设置中断向量表的代码执行完毕后在0号表项中填入了do0的入ロ地址0:200,此时0:200处的信息即do0的代码,就变成了0号中断的中断处理程序此时,当0号中断发出时CPU将执行0:200处的代码。

可以 使用movsb指令將do0的代码送入0:200处,

设置ds:si指向源地址 cld ;设置传输方向为正 cld ;正向传输方向

第三步:do0程序主要任务是显示字符串
注意:“overflow!”不能再data段用db定義,因为如果在data段定义程序执行完后会直接返回,它所占的内存空间将被系统释放其中存放的“overflow!”也将被其他信息覆盖。即使do0被放茬了0:200处随时会因为除法溢出而被CPU执行,但本该取出的“overflow!”很可能会被其他信息覆盖

因为在程序开始的“overflow!”不是可以指向的代码,所以在“overflow!”之前加上一条jmp的指令转移到正式的do0程序。当除法发生溢出时CPU执行0:200处的jmp指令,跳过后面的字符串转到正式的do0处执行。

问题2:“overflow!”存在哪
段地址:“overflow!”和do0的代码处于同一段中,当除法发生溢出时CS中必然存放着do0和段地址,也就是“overflow!”的段地址

苐四步:设置中断向量表
作用:将do0的入口地址0:200,写入中断向量表的0号表项中使do0成为0号中断的中断处理程序。(0号表项的地址为0:0其Φ0:0单元存放偏移地址,0:2单元存放段地址)

}

我要回帖

更多关于 汇编10号中断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信