您当前的位置:首页 > 计算机 > 编程开发 > C语言

怎样在C语言程序中调用DOS函数?

时间:12-30来源:作者:点击数:

其实,当调用printf(),fopen(),fclose(),名字以一dos开始的函数以及很多其它函数时,都将调用DOS函数。Microsoft和Borland还提供了一对名为int86()和int86x()的函数,使你不仅可以调用DOS函数,还可以调用其它低级函数。用这些函数可以跳过标准的C函数而直接调用DOS函数,这常常可以节省你的时间。下面的例子说明了如何通过调用DOS函数,而不是getch()和printf()函数,从键盘上得到一个字符并将其打印出来(该程序需要在大存储模式下编译)。

# include <stdlib.h>
# include <dos.h>
char GetAKey(void);
void OutputString(char  * );
main(int argc, char  * *  argv)
{
    char str[l28];
    union REGS regs;
    int ch;
    /* copy argument string; if none, use "Hello World"  */
    strcpy(str,  (argv[1]== NULL ? "Hello World": argv[1])),
    while ((ch = GetAKey()) !  =27){
          OutputString(str);
    }
 }
char GetAKey()
{
     union  REGS regs;
     regs.h. ah = 1;     /* function 1 is "get keyboard character"  */
     int86(0x21, &regs, &regs);
     return( (char)regs. h. al) ;
}
void OutputString(char  * string)
{
     union  REGS regs;
     struct SREGS segregs;
     /*  terminate  string for DOS function  */
      * (string + strlen(string))  = '$';
     regs.h. ah = 9;     /*  function 9 is "print a string" */
     regs.x. dx = FP_OFF(string) ;
     segregs. ds=  FP_SEG(string) ;
     int86x(0x21, &regs, &regs,  &segregs);
}

上例创建了两个函数来代替getch()和printf(),它们是GetAKey()和OutputString()。实际上,函数GetAKey()与标准c函数getche()更为相似,因为它与getche()一样,都把键入的字符打印在屏幕上。这两个函数中分别通过int86()(在GetAKey()中)和int86x()(在OutputString()中)调用DOS函数来完成所要求的任务。

可供函数int86()和int86x()调用的DOS函数实在太多了。尽管你会发现其中许多函数的功能已经被标准的C函数覆盖了,但你也会发现还有许多函数没有被覆盖。DOS也包含一些未公开的函数,它们既有趣又有用。DOS忙标志(DOS Busy Flag)就是一个很好的例子,它也被称作InDos标志。DOS函数34H返回指向一个系统内存位置的指针,该位置包含了DOS忙标志。当DOS正忙于做某些重要的事情并且不希望被调用(甚至不希望被它自己调用)时,该标志就被置为1;当DOS不忙时,该标志将被清除(被置为O)。该标志的作用是当DOS正在执行重要的代码时,把这一情况通知DOS。然而,该标志对程序员也是很有用的,因为他们能由此知道什么时候DOS处于忙状态。尽管从DOS 2.0版开始就有这个函数了,但因为Microsoft最近已经公开了这个函数,所以从技术角度上讲它已不再是一个未公开的函数。有几本很不错的书介绍了已公开和未公开的DOS函数,对这个问题有兴趣的读者可以去阅读这些书。

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门