INT中断服务程序
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
17 / 21
问题分析
int 7ch 引发中断过程后,进入 7ch 中断例程,在中断过程中,当前 的标志寄存器、CS 和 IP 都要压栈。 此时压入的 CS 和 IP 中的内容,分别是调用程序的段地址(可以认 为是标号 s 的段地址)和 int 7ch 后一条指令的偏移地址(即标号 se 的偏移地址) 。 可见,在中断例程中,可以从栈里取得标号 s 的段地址和标号 se 的 偏移地址,而用标号 se 的偏移地址加上 bx 中存放的转移位移就可 以得到标号 s 的偏移地址。 可以利用 iret 指令,我们将栈中的 se 的偏移地址加上 bx 中的转移 位移,则栈中的 se 的偏移地址就变为了 s 的偏移地址。 我们再使用 iret 指令,用栈中的内容设置 CS、IP,从而实现转移到 标号 s 处。
李晓锋 INT 中断服务程序
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
2014-05-12
18 / 21
7ch 中断例程
. 7ch 中断例程 . lp : push bp mov bp , s p dec cx jcxz lpret add [ bp +2] , bx l p r e t : pop bp iret .
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
7 / 21
示例一
assume c s : code code segment start : mov ax , 3 4 5 6 ; ( ax )=3456 i n t 7 ch 据的平方 ax add ax , ax adc dx , dx i n t 21 h code e n d s end s t a r t
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
李晓锋
INT 中断服务程序
2014-05-12
5 / 21
编写供应用程序调用的中断例程
前面,我们已经编写过中断 0 的中断例程了,现在我们讨论可以供应用 程序调用的中断例程的编写方法。 我们通过两个实例来讨论: 实例一编写、安装中断 7ch 的中断例程,实现求一 word 型数据的 平方。 实例二编写、安装中断 7ch 的中断例程,实现将一个全是字母,以 0 结尾的字符串,转化为大写。
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
13 / 21
实例二进一步说明
最后,在中断例程 capital 中用到了寄存器 si 和 cx,编写中断例程和编 写子程序的时候具有同样的问题,就是要避免寄存器的冲突。 应该注意例程中用到的寄存器的值的保存和恢复。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
10 / 21
实例二
实例二编写、安装中断 7ch 的中断例程:
功能:将一个全是字母,以 0 结尾的字符串,转化为大写。 参数:ds:si 指向字符串的首地址。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..Fra Baidu bibliotek
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
14 / 21
对 INT、IRET 和栈的深入理解
问题:用 7CH 中断例程完成 LOOP 指令的功能。
. 1
INT 中断服务程序的编写
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
2 / 21
INT 指令过程
CPU 执行 int n 指令,相当于引发一个 n 号中断的中断过程,执行过程 如下:
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
15 / 21
问题分析
在上面的程序中,用 int 7ch 调用 7ch 中断例程进行转移,用 bx 传 递转移的位移。 分析,为了模拟 loop 指令,7ch 中断例程应具备下面的功能:
. dec cx . 如果 (cx)0,转到标号 s 处执行,否则向下执行。 2
1
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
16 / 21
问题分析
下面我们分析 7ch 中断例程如何实现到目的地址的转移:
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
6 / 21
示例一
示例一编写、安装中断 7ch 的中断例程: 功能:求一 word 型数据的平方。 参数:(ax)= 要计算的数据。 返回值:dx、ax 中存放结果的高 16 位和低 16 位。 应用举例:求 2*34562
李晓锋 INT 中断服务程序
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
2014-05-12
12 / 21
安装程序
阅读 test2.asm
..
. ..
1 2 3 4
. 取中断类型码 n; . 标志寄存器入栈,IF = 0,TF = 0; . CS、IP 入栈; . (IP) = (n*4),(CS) = (n*4+2)。
从此处转去执行 n 号中断的中断处理程序。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
3 / 21
INT 指令的调用
可以在程序中使用 INT 指令调用任何一个中断的中断处理程序。 . test1.asm 示例 . assume c s : code code segment start : mov ax , 0 b800h mov es , ax mov b y t e p t r e s : [ 1 2 * 1 6 0 + 4 0 * 2 ] , ’ ! ’ int 0 code e n d s end s t a r t .
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
9 / 21
程序解读
注意,在中断例程 sqr 的最后,要使用 iret 指令。 iret 指令的功能 CPU 执行 int 7ch 指令进入中断例程之前,标志寄存器、当前的 CS 和 IP 被压入栈中,在执行完中断例程后,应该用 iret 指令恢复 int 7ch 执行前的标志寄存器和 CS、IP 的值,从而接着执行应用程序。 int 指令和 iret 指令的配合使用与 call 指令和 ret 指令的配合使用具 有相似的思路。
loop s 的执行需要两个信息,循环次数和到 s 的位移,所以,7ch 中 断例程要完成 loop 指令的功能,也需要这两个信息作为参数。 我们用 cx 存放循环次数,用 bx 存放位移。 应用举例:在屏幕中间显示 80 个‘ ! ’ 。 认识框架代码。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
李晓锋 INT 中断服务程序
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
2014-05-12
4 / 21
Test1.asm 解读
程序是没有做除法,但是在结尾使用了 int 0 指令。 CPU 执行 int 0 指令时,将引发中断过程,执行 0 号中断处理程序, 而系统设置的 0 号中断处理程序的功能是显示“Divide overflow” , 然后返回到系统。 可见,int 指令的最终功能和 call 指令相似,都是调用一段程序。 因此,一般情况下,系统将一些具有一定功能的子程序,以中断处 理程序的方式提供给应用程序调用。 我们在编程的时候,可以用 int 指令调用这些子程序。当然,也可 以自己编写一些中断处理程序供别人使用。 以后,我们可以将中断处理程序简称为中断例程。
李晓锋 INT 中断服务程序
.. . .. . .. . . . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. .. . .. . .. . .. . .. .
; 调用中断 7 的中断例程 ch , \\ 计算中的数
; 存放结果,讲结果乘以 2
mov ax , 4 c00h
2014-05-12
8 / 21
安装程序
我们要做三部分工作:
1 2 3
. 编程实现求平方功能的程序; . 安装程序,我们将其安装在 0:200 处; . 设置中断向量表,将程序的入口地址保存在 7ch 表项中,使其成为 中断 7ch 的中断例程。
..
. ..
. ..
.
1
. 转到标号 s 显然应设 (CS)= 标号 s 的段地址,(IP)= 标号 s 的偏移
地址; . 那么,中断例程如何得到标号 s 的段地址和偏移地址呢? . 现在知道,可以从栈中直接和间接地得到标号 s 的段地址和偏移地 3
2
址,那么如何用它们设置 CS:IP 呢?
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
应用举例: 将 data 段中的字符转化为大写。
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
11 / 21
调用程序
assume c s : code d a t a segment db ’ c o n v e r s a t i o n ’ , 0 data ends code segment start : mov ax , d a t a mov ds , ax mov s i , 0 i n t 7 ch mov ax , 4 c00h i n t 21 h code e n d s
. .
INT 中断服务程序
李晓锋
2014-05-12
..
. ..
. ..
.
. . . . . . . . . . . . .. .. .. .. .. .. .. .. .. .. .. .. ..
. ..
. ..
. ..
. ..
.
李晓锋
INT 中断服务程序
2014-05-12
1 / 21
Outline