第7章 系统接口函数库:dos.h dos.h提供对底层硬件操作的功能。在高级语言中,这部分功能大多数已由更高级的函数实现了。如果读者是汇编的高手,熟练掌握各种DOS调用和BIOS调用,C语言编程水平将会大大提高。 7.1 allocmem()——DOS分配存储段函数 allocmem()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\01

allocmem()函数用于为DOS模块分配内存,以节为单位,每节16字节。

语法

int allocmem(unsigned size, unsigned *seg);

allocmem()函数的语法参数说明如下:

参数size为分配内存块的大小,以节为单位,每节16字节。

参数seg为保存分配的地址。

allocmem()函数的返回值:成功返回-1,不成功则返回其他值。

示例

本示例演示用allocmem()函数为DOS分配1024字节。其具体代码如下:

img173

运行结果如图7.1所示。

img174

图7.1 allocmem()函数的执行结果 7.2 bdos()——DOS系统调用函数 bdos()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\02

bdos()函数用于DOS系统调用,即21H功能调用,它有丰富的功能,其具体功能请参阅汇编语言方面的书籍。

语法

int bdos(int fnum, unsigned dx, unsigned al);

bdos()函数的语法参数说明如下:

参数fnum为系统调用号。

参数dx为传给寄存器DX的值。

参数al为传给寄存器AL的值。

bdos()函数的返回值:AX中的值。

示例

本示例演示使用bdos ()函数调用DOS功能19H子功能获取当前驱动器号。其具体代码如下:

img175

运行结果如图7.2所示。

img176

图7.2 用bdos()函数获取当前驱动器号 7.3 country()——返回国家相关信息函数 country()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\03

country()函数用于获取国家信息,即Windows中的区域设置信息。

语法

struct country country(int countrycode, struct country country);

country()函数的语法参数说明如下:

参数countrycode为国家代码。

参数country为返回国家信息的地址。

country()函数的返回值:返回国家信息的地址。

示例

本示例演示使用country()函数获取中国的相关区域设置信息。其具体代码如下:

img177

运行结果如图7.3所示。

img178

图7.3 用country()函数获取国家信息 7.4 ctrlbrk()——设置Ctrl-Break处理程序函数 ctrlbrk()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\04

ctrlbrk()函数用于修改中断向量0x23,自己编程控制Ctrl-Break响应功能。

语法

void ctrlbrk(int(*handle)(void));

ctrlbrk()函数的语法参数说明如下:

参数handle为新设置的Ctrl-Break响应函数。

ctrlbrk()函数没有返回值。

示例

本示例演示正常执行时,循环显示1~100之间的数,当按Ctrl+Break键后执行fun()函数,显示new function,按任意键后继续正常执行。实际应用中可完善fun()函数功能。其具体代码如下:

img179

运行结果如图7.4所示。

img180

图7.4 用ctrlbrk()函数重新定义Ctrl-Break功能 7.5 delay()——以毫秒为单位的延时函数 delay()函数

实用程度:★★★★☆

实例位置:配套资源\SL\07\05

delay()函数用于将程序的执行延时一段时间(毫秒)。

语法

void delay(unsigned millisecond);

delay()函数的语法参数说明如下:

参数millisecond为延时的毫秒数,在TC中声明的是以毫秒表示的时间,但实际与机器主频相关。其最大值为65535,要想获得更大延时,可以用循环语句或sleep()函数,它以秒为单位延时。

delay()函数没有返回值。

示例

本示例演示用delay()函数实现每显示一个字母延时一段时间(在作者电脑上大约一秒左右)。其具体代码如下:

img181

运行结果如图7.5所示。

img182

图7.5 delay()函数的执行结果 7.6 dosexterr()——获取扩展DOS错误信息函数 dosexterr()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\06

程序执行出错时,系统会搜集错误信息,C语言中可以通过dosexterr()函数获取这些信息。

语法

int dosexterr(struct DOSERR*eblkp);

dosexterr()函数的语法参数说明如下:

参数eblkp为返回出错信息的结构体变量地址。

dosexterr()函数的返回值:错误代码,即eblkp中exterror的值。

示例

本示例演示用fopen()函数打开文件,但文件不存在,此时DOS出错,用dosexterr()函数获取错误信息。其具体代码如下:

img183

运行结果如图7.6所示。

img184

图7.6 用dosexterr()函数获取的错误信息 7.7 dostounix()——把DOS时间转换为UNIX时间 dostounix()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\07

DOS时间是一个以年月日时分秒表示的时间,用结构体表示,UNIX时间是用一个长整数表示的时间,以秒计时,DOS时间用于显示数据比较方便,UNIX时间用于计算较方便。dostounix()函数提供把DOS时间转换为UNIX时间的功能。

语法

long dostounix(struct date d, struct time t);

dostounix()函数的语法参数说明如下:

参数d为DOS日期指针。

参数t为DOS时间指针。

struct date 结构见 7.12节。

struct time 结构见 7.14节。

dostounix()函数的返回值:UNIX 时间。

示例

本示例演示先获取DOS时间,再用dostounix()函数将其转换成UNIX时间,对UNIX时间加5*60s,即5分钟,然后将其转换成DOS时间显示。其具体代码如下:

img185

img186

运行结果如图7.7所示。

img187

图7.7 用dostounix()函数转换时间格式 7.8 FP_OFF()——获取远指针的偏移量 FP_OFF()宏

实用程度:★★★☆☆

实例位置:配套资源\SL\07\08

FP_OFF()是一个宏,不是函数。其功能是获取32位远指针的低16位偏移量。

语法

define FP_OFF(fp) ((unsigned)(fp));

该宏的语法参数说明如下:

参数fp为32位远指针。

FP_OFF()宏的返回值:一个32位地址的低16位偏移量。

示例

本示例演示调用DOS中断建立文件夹,文件夹用字符串表示,字符串偏移地址通过FP_OFF()获取。其具体代码如下:

img188

img189

运行后,D:盘生成一个文件夹abc,如图7.8所示。

img190

图7.8 建立文件夹 7.9 FP_SEG()——获取远指针的段地址 FP_SEG()宏

实用程度:★★★☆☆

实例位置:配套资源\SL\07\09

FP_SEG()是一个宏,不是函数。其功能是获取32位远指针的高16位段地址。

语法

define FP_SEG(fp) ((unsigned)((unsigned long)(fp) >> 16));

该宏的语法参数说明如下:

参数fp为32位远指针。

FP_SEG()宏的返回值:一个32位地址的高16位段地址。

示例

本示例演示调用DOS中断删除文件夹,文件夹用字符串表示,字符串段地址通过FP_SEG()获取。注意,只有空文件夹才能成功删除。其具体代码如下:

img191

img192

运行后,D:\abc被删除,如图7.9所示。

img193

图7.9 删除文件夹(abc已经被删除) 7.10 freemem()——释放已分配DOS内存块函数 freemem()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\10

freemem()函数用于释放由allocmem()函数分配的DOS内存块。

语法

int freemem(unsigned segp);

freemem()函数的语法参数说明如下:

参数segp为先前分配的DOS内存块地址。

freemem()函数的返回值:成功返回0,不成功则返回-1。

示例

本示例演示用freemem()函数释放DOS内存块。其具体代码如下:

img194

img195

运行结果如图7.10所示。

img196

图7.10 用freemem()函数释放DOS内存块 7.11 getcbrk()——获取Ctrl-Break设置函数 getcbrk()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\11

程序执行过程中按Ctrl+Break键可以中断程序执行,转而执行更紧急的任务,可以通过设置使程序不响应Ctrl-Break。setcbrk()函数用于设置程序是否响应Ctrl-Break,getcbrk()函数用于检查是否设置了该功能。

语法

int getcbrk();

getcbrk()函数没有参数。

getcbrk()函数的返回值:当Ctrl-Break已设置时为1,未设置时则为0。

示例

本示例演示先用setcbrk()函数设置Ctrl-Break状态,再用getcbrk()函数获取Ctrl-Break状态。其具体代码如下:

img197

img198

运行结果如图7.11所示。

img199

图7.11 用getcbrk()函数获取Ctrl-Break状态 7.12 getdate()——获取DOS日期函数 getdate()函数

实用程度:★★★★☆

实例位置:配套资源\SL\07\12

getdate()函数用于获取系统当前的DOS日期,并将获取的日期存储于日期结构体中。

语法

void getdate(struct date *datep);

getdate()函数的语法参数说明如下:

参数datep为指向结果的日期型指针。

struct date 结构(在dos.h中)如下:

struct date {

int da_year;  // char da_day; // char da_mon; //

}

getdate()函数没有返回值。

示例

本示例演示用getdate()函数获取系统当前日期。其具体代码如下:

img200

img201

运行结果如图7.12所示。

img202

图7.12 用getdate ()函数获取当前日期 7.13 getdta()——获取磁盘传输地址函数 getdta()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\13

getdta()函数用于获取磁盘传输地址。

语法

char far*getdta(void);

getdta()函数没有参数。

getdta()函数的返回值:磁盘传输地址的指针。

示例

本示例演示创建磁盘文件并用getdta()函数获取磁盘传输地址。其具体代码如下:

img203

img204

运行结果如图7.13所示。

img205

图7.13 用getdta()函数获取磁盘传输地址 7.14 gettime()——获取系统时间函数 gettime()函数

实用程度:★★★★☆

实例位置:配套资源\SL\07\14

gettime()函数用于获取系统时间。

语法

void gettime(struct time *timep);

gettime()函数的语法参数说明如下:

参数timep为保存系统时间的指针变量。

struct time 结构(在dos.h中)如下:

struct time {

   unsigned char ti_min;  /分钟/

   unsigned char ti_hour;  /小时/

   unsigned char ti_hund;  /百分之一秒/

   unsigned char ti_sec;  //

}

gettime()函数没有返回值。

示例

本示例演示用gettime()函数获取系统时间。其具体代码如下:

img206

img207

运行结果如图7.14所示。

img208

图7.14 用gettime()函数获取系统时间 7.15 inport()——从硬件端口中输入一个字函数 inport()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\15

inport()函数用于从硬件端口中输入一个字。

语法

int inport(int portid);

inport()函数的语法参数说明如下:

参数portid为端口号。

inport()函数的返回值:输入的数据。

示例

本示例演示用inport()函数从串口输入一个字。其具体代码如下:

img209

运行结果如图7.15所示。

img210

图7.15 用inport()函数从硬件端口输入一个字 7.16 inportb()——从硬件端口中输入一个字节函数 inportb()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\16

inportb()函数用于从硬件端口中输入一个字节。

语法

unsigned char inportb(int portid);

inportb()函数的语法参数说明如下:

参数portid为端口号。

inportb()函数的返回值:输入的数据。

示例

本示例演示用inportb()函数从串口输入一个字节。其具体代码如下:

img211

运行结果如图7.16所示。

img212

图7.16 用inportb()函数从硬件端口输入一个字节 7.17 int86()——通用8086软中断接口函数 int86()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\17

函数int86()用来执行指定的8086软中断。首先把输入指针所指的共用体中的内容复制到CPU的寄存器中,随即产生对应的中断,返回后将CPU寄存器(AX)的内容复制到输出指针指向的共用体中。在使用int86() 函数进行BIOS接口的系统调用时,有的中断调用设有若干选项,这些选项可以根据调用时AH寄存器中的值来进行访问。BIOS中断具有丰富的功能,详细功能请参阅汇编语言方面的书籍。

语法

int int86(int intno, union REGS inregs, union REGS outregs);

int86()函数的语法参数说明如下:

参数intno为中断号。

参数inregs为执行前寄存器的输入值。

参数outregs为执行后寄存器的输出值。

union REGS的定义(在dos.h中)如下:

struct WORDREGS{unsigned int ax, bx, cx, dx, si, di, cflag, flags;}

struct BYTEREGS{unsigned char al, ah, bl, bh, cl, ch, dl, dh;}

union REGS{struct WORDREGS x;struct BYTEREGS h;}

int86()函数的返回值:中断处理结束时的AX寄存器的值,错误时outregs->x.cflag!=0。

示例

本示例演示用int86()函数调用10H功能的06H子功能清除屏幕中的一个小块,清除块左上角坐标存入(cl, ch),右下角坐标存入(dl, dh)。其具体代码如下:

img213

img214

运行结果如图7.17所示。

img215

图7.17 清除部分屏幕功能 7.18 int86x()——增强型通用8086软中断接口函数 int86x()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\18

函数int86x() 用来执行指定的8086软中断,与int86()函数的执行过程相同。二者功能的不同之处在于int86x()中可以使用段寄存器DS和ES,而int86()无此功能。

语法

int int86x(int intno, union REGS inregs, union REGS outregs, struct SREGS *segregs);

int86x()函数的语法参数说明如表7.1所示。

表7.1 参数说明

img216

结构REGS定义见7.17节。

结构SREGS定义如下:

struct SREGS {unsigned int es, cs, ss, ds}

函数只用了该结构中的段寄存器DS和ES。调用时根据它们的值设置DS和ES,同时把DS和ES原来的值保存在该结构中,返回时再恢复DS和ES为原来的值。

int86x()函数的返回值:AX中的值。

示例

本示例演示用int86x()函数调用21H功能的3AH子功能删除文件夹,要删除文件夹地址先存入ds:dx,执行后CF=0表示删除成功。其具体代码如下:

img217

运行结果如图7.18所示。

img218

图7.18 删除文件夹 7.19 intdos()——通用DOS中断接口函数 intdos()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\19

intdos()函数用来执行指定的8086 DOS软中断,即21H中断功能。在7.17节中,如果把intno设置成21H(C语言写法为0x21),则两个函数的功能完全相同。

语法

int intdos(union REGS inregs, union REGS outregs);

intdos()函数的语法参数说明如下:

参数inregs为执行前寄存器的输入值。

参数outregs为执行后寄存器的输出值。

结构REGS的定义见7.17节。

如果需要功能号,则装入AH,如果需要子功能号,则装入AL。

intdos()函数的返回值:AX寄存器中的值。

示例

本示例演示用intdos()函数调用DOS功能的2AH子功能获取当前日期,执行后,cx保存年,dh保存月,dl保存日。其具体代码如下:

img219

运行结果如图7.19所示。

img220

图7.19 获取系统日期 7.20 intdosx()——增强型通用DOS中断接口函数 intdosx()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\20

intdosx()函数用来执行指定的8086 DOS软中断,即21H中断功能,与intdos()函数功能相近。不同之处在于intdosx()中可以使用段寄存器DS和ES,而intdos()无此功能。

语法

int intdosx(union REGS inregs, union REGS outregs, struct SREGS *segregs);

intdosx()函数的语法参数说明如下:

参数inregs为执行前寄存器的输入值。

参数outregs为执行后寄存器的输出值。

参数segregs为执行后DS、ES段寄存器的输出值。

结构REGS定义见7.17节。

结构SREGS定义见7.18节。

intdosx()函数返回值:AX寄存器中的值。

示例

本示例演示用intdosx()函数调用DOS功能的39H子功能创建文件夹,要创建文件夹地址先存入ds:dx,执行后CF=0表示创建成功。其具体代码如下:

img221

img222

运行结果如图7.20所示。

img223

图7.20 用intdosx()函数调用系统中断实现创建文件夹功能 7.21 intr()——改变软中断接口函数 intr()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\21

intr()函数与int86x()函数实现的功能相同但接口参数不同,所有传入参数、传出参数均由一个参数完成。

语法

void intr(int intno, struct REGPAXK *preg);

intr()函数的语法参数说明如下:

参数intno为中断号。

参数preg为寄存器。

REGPACK定义如下:

struct REGPACK

{

   unsigned r_ax, r_bx, r_cx, r_dx;

   unsigned r_bp, r_si, r_di, r_ds, r_es, r_flag;

}

intr()函数本身没有返回值。

示例

本示例演示用intr()函数调用21H功能的3AH子功能删除文件夹,要删除文件夹地址先存入ds:dx,执行后CF=0表示删除成功。其具体代码如下:

img224

img225

运行结果如图7.21所示。

img226

图7.21 删除文件夹 7.22 keep()——退出并继续驻留函数 keep()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\22

现在流行的Windows操作系统是一个多任务系统,CPU中可以有多个程序同时执行。DOS是一个单任务系统,CPU内只能运行一个程序,keep()函数可以让DOS程序退出后,一部分程序驻留内存,从而使新任务执行时,旧任务继续执行。

语法

void keep(unsigned char status, unsigned size);

keep()函数的语法参数说明如下:

参数status为返回DOS的错误识别码。

参数size为驻留程序使用内存的大小。

keep()函数没有返回值。

示例

本示例演示调用时钟中断在屏幕0行1列显示0~9之间的数字,退出程序前用keep()函数使其驻留内存,以后不论运行任何程序,屏幕左上角都会显示数字。注意程序的运行方式:在TC中编译成功后,退出TC,找到22.exe,在DOS提示符下输入22。以后运行其他DOS程序时,屏幕左上角始终显示0~9之间的数字。其具体代码如下:

img227

运行结果如图7.22所示。

img228

图7.22 屏幕左上角显示数字 7.23 MK_FP()——远指针合成 MK_FP()宏

实用程度:★★★☆☆

实例位置:配套资源\SL\07\23

MK_FP()是宏,不是函数。其功能是把一个16位段地址和另一个16位偏移地址合成一个32位地址。与FP_OFF()和FP_SEG()的功能正好相对。

语法

define MK_FP(seg, off) ((void far *)(((unsigned long)(seg) << 16) | (unsigned)(off)));

该宏的语法参数说明如下:

参数seg为16位段地址。

参数off为16位偏移地址。

MK_FP()宏的返回值:32位地址。

示例

本示例演示用DOS中断获取当前目录,结果保存在ds:si中,用MK_FP()把ds:si中的地址合成一个远指针。其具体代码如下:

img229

运行结果如图7.23所示。

img230

图7.23 获取当前目录 7.24 nosound()——关闭PC扬声器函数 nosound()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\24

sound()函数可以驱动PC扬声器发出声音,该声音只有执行nosound()函数时才会停止。

语法

void nosound(void);

nosound()函数没有参数。

nosound()函数没有返回值。

示例

本示例演示程序执行时会发出声音,1秒后声音消失。如果没有听到声音,请检查电脑扬声器是否安装正常。注意,发声设备不是多媒体音箱,而是PC扬声器。其具体代码如下:

img231 7.25 outport()——从硬件端口中输出一个字函数 outport()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\25

outport()函数用于从硬件端口中输出一个字。

语法

void outport(int portid, int value);

outport()函数的语法参数说明如下:

参数portid为端口号。

参数value为输出数据。

outport()函数没有返回值。

示例

本示例演示用outport()函数向串行口输出一个数据。其具体代码如下:

img232

img233

运行结果如图7.24所示。

img234

图7.24 用outport()函数输出数据 7.26 outportb()——从硬件端口中输出一个字节函数 outportb()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\26

outportb()函数用于从硬件端口中输出一个字节。

语法

void outportb(int portid, unsigned char value);

outportb()函数的语法参数说明如下:

参数portid为端口号。

参数value为输出数据。

outportb()函数没有返回值。

示例

本示例演示用outportb()函数向串行口输出一个数据。其具体代码如下:

img235

运行结果如图7.25所示。

img236

图7.25 用outportb()函数输出数据 7.27 parsfnm()——分析文件名函数 parsfnm()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\27

系统以文件控制块(fcb)管理文件,parsfnm()函数可通过文件控制块获取文件信息。

语法

char parsfnm(const char cmdline, struct fcb *fcb, int option);

parsfnm()函数的语法参数说明如下:

参数cmdline为命令行。

参数fcb为文件控制块指针。

参数option为选项。

struct fcb 结构如下:

img237

parsfnm()函数的返回值:成功返回0,不成功则为非0值。

示例

本示例演示用parsfnm()函数获取文件信息。注意,只有打开后才能获取文件大小。其具体代码如下:

img238

img239

运行结果如图7.26所示。

img240

图7.26 parsfnm ()函数获取文件信息 7.28 peek()——从存储单元读一个字函数 peek()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\28

peek()函数用于从内存任意单元读取一个字,如果在程序数据区内,完全没必要使用此函数,当在统一编址的设备中读取数据时,更显示出peek()函数的强大功能。

语法

int peek(unsigned segment, unsigned offset);

peek()函数的语法参数说明如下:

参数segment为段地址。

参数offset为偏移量。

peek()函数的返回值:读取出的值。

示例

本示例演示用peek()函数读取内存段地址0xB800 、偏移量(row80+col)2处的数据,0XB800为屏幕显示内存起始地址,每个显示单元占两个字节。其具体代码如下:

img241

运行结果如图7.27所示。

img242

图7.27 用peek()函数读取显示器数据 7.29 peekb()——从存储单元读一个字节的函数 peekb()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\29

与7.28节peek()函数的功能相近,不同之处在于peek()函数从内存任意单元读取一个字(两个字节),而peekb()函数从内存任意单元读取一个字节。

语法

char peekb(unsigned segment, unsigned offset);

peekb()函数的语法参数说明如下:

参数segment为段地址。

参数offset为偏移量。

peekb()函数的返回值:以上地址中的值。

示例

本示例演示用peekb()函数读取键盘功能键信息。其具体代码如下:

img243

运行结果如图7.28所示。

img244

图7.28 用peekb()函数获取键盘功能键状态 7.30 poke()——存一个字到给定存储单元函数 poke()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\30

poke()函数用于向内存任意单元存储一个字,如果在程序数据区内,完全没必要使用此函数,当在统一编址的设备中设取数据时,才显示出poke()函数的强大功能。

语法

void poke(unsigned segment, unsigned offset, int value);

poke()函数的语法参数说明如下:

参数segment为段地址。

参数offset为偏移量。

poke()函数没有返回值。

示例

本示例演示用poke()函数先输入一个屏幕位置,如果该处已有字符,则什么也不做,否则就在该处输出数据,并可以指定输出字符前景色、背景色。其具体代码如下:

img245

运行结果如图7.29所示。

img246

图7.29 用poke()函数设置屏幕显示 7.31 pokeb()——存一个字节到给定存储单元函数 pokeb()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\31

pokeb()函数的功能与poke()函数相近,不同之处在于poke()函数向内存任意单元存储一个字(两个字节),而pokeb()函数向内存任意单元存储一个字节。

语法

void pokeb(unsigned segment, unsigned offset, char value);

pokeb()函数的语法参数说明如下:

参数segment为段地址。

参数offset为偏移量。

pokeb()函数没有返回值。

示例

本示例演示用pokeb()函数先输入一个屏幕位置,如果该处没有任何输出,就在该处输出数据,否则什么也不做。与7.30节示例相比,该示例程序中不能指定输出字符前景色和背景色。其具体代码如下:

img247

运行结果如图7.30所示。

img248

图7.30 用pokeb()函数设置屏幕显示 7.32 randbrd()——随机块读函数 randbrd()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\32

randbrd()函数用于读取文件在磁盘中的任意数据块。

语法

int randbrd(struct fcb *fcb, int rcnt);

randbrd()函数的语法参数说明如下:

参数fcb为文件控制块。

参数rcnt为要读取的块数。

randbrd()函数的返回值:成功返回0,不成功则返回-1。

示例

本示例演示用randbrd()函数读文件的方法。其具体代码如下:

img249

img250

运行结果如图7.31所示。

img251

图7.31 用randbrd()函数读磁盘文件 7.33 randbwr()——随机块写函数 randbwr()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\33

randbwr()函数用于在磁盘文件的任意数据块中写入数据。

语法

int randbwr(struct fcb *fcb, int rcnt);

randbwr()函数的语法参数说明如下:

参数fcb为文件控制块。

参数rcnt为要写入的块数。

randbwr()函数的返回值:成功返回0,不成功则返回-1。

示例

本示例演示用randbwr()函数写文件的方法。其具体代码如下:

img252

img253

运行时输入D:A.C,运行结束后,A.C文件的内容如图7.32所示。

img254

图7.32 用randbwr ()函数写数据 7.34 segread()——读段寄存器值函数 segread()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\34

segread()函数用于读段寄存器值。

语法

void segread(struct SREGS *segp);

segread()函数的语法参数说明如下:

参数segp为段寄存器地址。

segread()函数没有返回值。

示例

本示例演示用segread()函数获取段寄存器地址。其具体代码如下:

img255

运行结果如图7.33所示。

img256

图7.33 获取段寄存器地址 7.35 setblock()——修改DOS分配地址函数 setblock()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\35

setblock()函数用于修改DOS分配地址。

语法

int setblock(unsigned segx, unsigned newsize);

setblock()函数的语法参数说明如下:

参数segx为DOS块地址。

参数newsize为新分配的DOS块大小。

setblock()函数的返回值:成功返回-1,不成功返回其他值。

示例

本示例演示用setbolck()函数重新分配DOS内存块。其具体代码如下:

img257

运行结果如图7.34所示。

img258

图7.34 修改DOS分配地址 7.36 setcbrk()——设置Ctrl-Break函数 setcbrk()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\36

程序执行过程中按Ctrl+Break键可以中断执行,转而执行更紧急的任务,可以通过设置使程序不响应Ctrl-Break。setcbrk()函数用于设置程序是否响应Ctrl-Break。

语法

int setcbrk(int cbrkvalue)

setcbrk()函数的语法参数说明如下:

参数cbrkvalue为1时,系统调用总是检查Ctrl-Break;为0时,只在控制台、打印、通信中检查Ctrl-Break。

setcbrk()函数的返回值:设置的cbrkvalue的值。

示例

本示例演示先用setcbrk()函数设置Ctrl-Break状态,再用getcbrk()函数获取Ctrl-Break状态。其具体代码如下:

img259

运行结果如图7.35所示。

img260

图7.35 设置Ctrl-Break状态 7.37 setdate()——设置DOS日期函数 setdate()函数

实用程度:★★★★☆

实例位置:配套资源\SL\07\37

setdate()函数用于设置DOS日期。

语法

void setdate(struct date *datep);

setdate()函数的语法参数说明如下:

参数datep为日期变量地址。

setdate()函数没有返回值。

示例

本示例演示用setdate()函数设置系统日期。其具体代码如下:

img261

运行结果如图7.36所示。

img262

图7.36 设置系统日期 7.38 settime()——设置DOS时间函数 settime()函数

实用程度:★★★★☆

实例位置:配套资源\SL\07\38

settime()函数用于设置DOS时间。

语法

void settime(struct time *timep)

settime()函数的语法参数说明如下:

参数timep为要设置的时间。

struct time 结构见7.14节。

settime()函数没有返回值。

示例

本示例演示用settime ()函数重新设置系统时间。其具体代码如下:

img263

img264

运行结果如图7.37所示。

img265

图7.37 设置系统时间 7.39 setdta()——设置磁盘传输地址函数 setdta()函数

实用程度:★★☆☆☆

实例位置:配套资源\SL\07\39

setdta()函数用于设置磁盘传输地址。

语法

void setdta(char far *dta);

setdta()函数的语法参数说明如下:

参数dta为磁盘传输地址。

setdta()函数没有返回值。

示例

本示例演示用setdta()函数设置传输地址。其具体代码如下:

img266

img267

运行结果如图7.38所示。

img268

图7.38 打开文件并设置传输地址 7.40 sleep()——以秒为单位的延时函数 sleep()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\40

sleep()函数用于产生以秒为单位的时间延迟。

语法

void sleep(unsigned secounds);

sleep()函数的语法参数说明如下:

参数secounds为用秒表示的延时时间。

sleep()函数没有返回值。

示例

本示例演示用sleep()函数来实现每隔一秒显示一个字母。其具体代码如下:

img269

运行结果如图7.39所示。

img270

图7.39 每隔1秒显示一个字符 7.41 sound()——打开PC扬声器函数 sound()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\41

sound()函数用于打开PC指示器,以指定音频发出声音。

语法

void sound(unsigned frequency);

sound()函数的语法参数说明如下:

参数frequency为音频。

sound()函数没有返回值。

示例

本示例演示用sound()函数设置不同音频,通过PC扬声器播放声音。如果没有听到声音,请检查电脑扬声器是否安装正常。注意,发声设备不是多媒体音箱,而是PC扬声器。其具体代码如下:

img271 7.42 unixtodos()——把UNIX时间转换为DOS时间函数 unixtodos()函数

实用程度:★★★☆☆

实例位置:配套资源\SL\07\42

DOS时间是一个以年月日时分秒表示的时间,用结构体表示。UNIX时间是用一个长整数表示的时间,以秒计时。DOS时间用于显示数据比较方便,UNIX时间用于计算较方便。unixtodos()函数提供把UNIX时间转换为DOS时间的功能。

语法

void unixtodos(long time, struct date d, struct time t);

unixtodos()函数的语法参数说明如下:

参数time为UNIX 时间。

参数d为转换后的DOS日期。

参数t为转换后的DOS时间。

unixtodos()函数没有返回值。

示例

本示例演示先获取DOS日期,再用dostounix()函数将其转换成UNIX时间,对UNIX时间减去352460*60,即35天,然后将其转换成DOS时间显示出来。其具体代码如下:

img272

img273

运行结果如图7.40所示。

img274

图7.40 通过UNIX时间进行时间计算