几个中断函数
在我们了解了什么是中断后,我们通过实例来介绍几个DOS中断函数。
int86()函数
函数说明如下:
int int86(int intr_num, union REGS *inregs, union REGS *ourregs);
这个函数的三个参数如上述的BIOS功能调用一样,其中第一个参数mtr_num表示BIOS调用类型号,即中断类型号,第二个参数表示是指向联合类型REGS 的指针,它用于接收调用的功能号及其他一些指定的入口参数,以便传给相应的寄存器,第三个参数也是一个指向联合类型REGS的指针,它用于接收功能调用后的返回值,即出口参数,如调用的结果,状态信息,这些值从相关寄存器中得到。
联合类型PEGS在dos.h头文件中定义,因而使用该函数时,应将dos.h文件包括在程序中,在dos.h中PEGS定义如下:
struct WORDREGS
{
unsigned int ax,bx,cx,dx,si,di,cfiag,flags;
};
struct BYTEREGS
{
unsigned char al,ah,bl,bh,cl,ch,dl,dh;
}
unionPEGS
{
struct WORDREGS x;
struct BYTEREGS h;
}
它表示REGS是一个联合类型名。该联合的成员由结构类型的x和h组成,其中x代表16位寄存器变量,它的成员用8088CPU的相关寄存器名表示(注意! 它们并不是真正的物理寄存器)。其中cilag代表标志寄存器的进位标志位,一般调用后,从该标志位是0还是1可知调用成功还是失败。结构类型h代表8位寄存器变量,即长度为字节的结构变量,它的成员与相关的8088的8位寄存器同名。union REGS表示两个成员x,h共用一个内存区域,即可以是16位长,也可以是8位长,我们可以用这个内存区向有关的寄存器赋值,或取得有关寄存器的返回值,这样就和BIOS调用格式一致起来了,如定义一个ax变量并赋值为2,可写作:
union REGS regs;
regs.x.ax=2;
它表示regs变量是一个REGS联合类型,取其16位的结构成员x中的ax井赋值2。
上述的定义与赋值过程,实际上就完成了对该变量代表的寄存器的赋值。
下面示例INT 10H,功能号为2的显示中断调用,它的功能是设置光标位置,其中DH为光标所在行号,DL为光标所在列号,BH为显示光标的页号,选0。出口参数无,下面的程序在屏幕35行10列出显示出Hello字样。
#include
#include
#include
#define VIDEO 0x10
void movetoxy(int x,int y)
{
union REGS regs;
regs.h.ah=2;
regs.h.dh=y;
regs.h.dl=x;
regs.h.bh=0;
int86(VIDEO,?s,?s); /*BIOS中断调用*/
}
int main(void)
{
clrscr(); /*清屏幕*/
movetoxy(35,10); /*调用movetoxy函数*/
printf("Hello\n");
return 0;
}
intdos()函数
它的说明格式是:
int intdos(union REGS *inregs, union REGS *outregs);
该函数的第一个参数足表示相应功能号的入口参数,第二个参数是出口参数,调用后,返回值在outregs的AX寄存器中,并将设置标志寄存器flags,若进位标志器cilag被置位,则表示调用出错,此时AX中为错误代码,若为零,则表示成功。
由于该函数的参数中没有涉及到有关段寄存器,因而当进行要改变段的一些调用时,该函数就不能用了。
下面的示例程序是利用该函数进行DOS系统调用,删除一个当前目录下的文件(不需要改变段值):
#include
#include
int delete_file(char near *filename)
{
union REGS regs;
int ret;
regs.h.ah=0x41;
搜索“diyifanwen.net”或“第一范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,第一范文网,提供最新小学教育C语言课程设计(图形编程 全)(4)全文阅读和word下载服务。
相关推荐: