汇编语言 第十三章 int 指令

重要的内中断:由 int 指令引发的中断。

13.1 int 指令

int 指令的格式为:int n,n 为中断类型码,功能是引发中断过程。

CPU 执行 int n 命令,相当于引发一个 n 号中断过程,执行过程如下: - 取中断类型码 n; - 标志寄存器入栈,IF = 0,TF = 0; - CS、IP 入栈; - (IP) = (n * 4),(CS) = (n * 4 + 2)。

从此处转去执行 n 号中断的中断处理程序。可以在程序中使用 int 指令调用任何一个中断的中断处理程序:

1
2
3
4
5
6
7
8
assume cs:code
code segment
start:mov ax,0b800h
mov es,ax
mov byte ptr es:[12*160+40*2],'!'
int 0
code ends
end start

这个程序会在屏幕中间显示一个 “!”,然后显示 “Divide overflow”。“Divide overflow” 就是 0 号中断处理程序的功能。

可见 int 指令的最终功能和 call 指令相似,都是调用一段程序。

13.2 编写供应用程序调用的中断例程

  1. 编写需要调用得程序;
  2. 安装程序,将其安装在 0:200 处;
  3. 设置中断向量表,将程序的入口地址保存在 7ch 表项中,使其成为中断 7ch 的中断例程。

CPU 执行 int 7ch 指令进入中断例程之前,标志寄存器、当前的 CS 和 IP 被压入栈中,在执行完中断例程后,应该用 iret 指令恢复 int 7ch 执行前的标志寄存器和 CS、IP 的值,从而接着执行应用程序。

int 指令和 iret 指令的配合使用与 call 指令和 ret 指令的配合使用具有相似的思路。

13.3 对 int、iret 和栈的深入理解

为了模拟 loop 指令,7ch 中断例程应具备下面的功能:

  • dec cx;
  • 如果 (cx)≠0,转到标号 s 处执行,否则向下执行。

7ch 中断例程如何实现到目的地址的转移?

  • 转到标号 s 显然应该设 (CS) = 标号 s 的段地址,(IP) = 标号 s 的偏移地址。

  • 中断例程中,可以从栈里取得标号 s 的段地址和标号 se 的偏移地址,而用标号 se 的偏移地址加上 bx 中存放的转移位移就可以得到标号 s 的偏移地址。
  • 利用 iret 指令,设置 CS:IP。我们可以将栈中的 se 的偏移地址加上 bx 中的转移位移,则栈中的 se 得而偏移地址就变为了 s 的偏移地址。我们再使用 iret 指令,用栈中的内容设置 CS、IP,从而实现转移到标号 s 处。

13.4 BIOS 和 DOS 所提供的中断例程

在系统板的 ROM 中存放着一套程序,称为 BIOS(基本输入输出系统),BIOS 中主要包含以下几部分内容。

  1. 硬件系统的检测和初始化程序;
  2. 外部中断和内部终端的中断例程;
  3. 用于对硬件设备进行 I/O 操作的中断例程;
  4. 其他和硬件系统相关的中断例程。

操作系统 DOS 也提供了中断例程,从操作系统的角度来看,就是向程序员提供了编程资源。

13.5 BIOS 和 DOS 中断例程的安装过程

13.6 BIOS 中断例程应用

一般来说,一个中断例程中往往包含多个子程序,中断例程内部用传递进来的参数来决定执行哪一个子程序。BIOS 和 DOS 都用 ah 来传递内部子程序的编号。

13.7 DOS 中断例程应用

略。

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×