大榕树 \ Pascal语言 \ 算法与技巧

设置中断子程序

原文链接:http://www.mydrs.org/program/list.asp?id=202

·设置中断子程序

  设置自己的中断子程序,可以利用中断实现拦截Ctrl+Break、自动计时、实时响应键盘操作等诸多功能,在编写好的游戏和软件时必不可少。

  一般在检查或设置任何中断向量时,总是避免直接使用中断向量的绝对地址,而是使用DOS功能调用(21H)存取中断向量。

  DOS单元有两个过程分别执行设置中断向量和获取中断向量:SetIntVec和GetIntVec。其定义如下:
  procedure SetIntVec(IntNo:Byte;Vector:Pointer);
  procedure GetIntVec(IntNo:Byte;var Vector:Pointer);
  这两个过程都是使用DOS功能调用(21H)存取中断向量。

  如果新的中断功能只供自己使用,或用自己编写的中断处理程序代替系统中的中断处理功能时,要注意保存原中断向量,在设置自己的中断向量时,应先保存原中断向量再设置新的中断向量,再程序结束之前恢复原中断向量。

·编写自己的中断子程序

  编写自己的中断子程序是系统级程序设计员常用的技术之一。编写这类程序,常常需要很复杂的技术,并且要很细心,一般都用汇编语言或C语言来实现。然而,Turbo Pascal提供了实现这种技术的简便方法。

  中断过程可用Interrupt指令来声明:

procedure IntHandler(Flags,Cs,Ip,Ax,Bx,Cx,Dx,Si,Di,Ds,Es,Bp:word);interrupt;
begin
 ...
end;

  Turbo Pascal在中断过程的入口处自动保存所有寄存器并初始化DS寄存器。所有寄存器都作为参数传递,因而在过程中可以使用并修改其值。不一定要列出上面所有寄存器参数,但对参数表有几个规定:
  1.不能声明其它的参数;
  2.可以不声明任何参数;
  3.若前一个参数没有省略,则不能省略后一个参数。

  例如:
  procedure IntHandler;           {正确}
  procedure IntHandler(Si,Di,Ds,Es,Bp:Word);{正确}
  procedure IntHandler(Si,Es,Bp:Word);   {错误}

  最后一例的错误在于省略了Di和Ds,而没有省略Si。虽然编译程序不会报告此类错误,但你自己应负责参数顺序的正确性,否则会发生意外的错误。

  注意,Turbo Pascal并没有自动插入开中断指令----STI,因而不会产生进一步的中断。需要时可以用inline语句插入一条STI指令。

  中断过程的出口码将恢复寄存器并执行中断返回指令。中断过程可以修改寄存器参数,中断返回时,会导致相应寄存器的修改。

  值得注意的是,若是编写硬件中断处理程序,则不能使用Turbo Pascal的输入输出或动态内存分配子程序,因为它们是不可重入的。另外,由于DOS也是不可重入的,因而也不能使用DOS功能调用。

作者:陈世熹
来源:陈世熹的Pascal
时间:2001-09-02

上一篇:获取DOS版本号
下一篇:简单的Ctrl-Break控制子程序

大榕树 版权所有 ©1999-2006