资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第十三章 文 件,*,2026/6/9 周二,1,第九章,BIOS,和,DOS,调用,BIOS,和,DOS,概述,中断及中断向量表,BIOS,调用,DOS,调用,BIOS,和,DOS,系统调用函数,2026/6/9 周二,2,第一节,BIOS,和,DOS,概述,BIOS,(,Basic Input Output System,),:,BIOS,是固化在,ROM,中的若干程序,内容:,系统启动自举程序,开机自检程序,系统信息设置,基本输入输出程序,(程序集),作用:是进行,系统测试、初始化引导程序、对,I/O,设备进行控制,的,程序集,2026/6/9 周二,3,第一节,BIOS,和,DOS,概述,DOS,(,Disk Operating System,),:,内容,(,主要模块,),:,IO.SYS,(通过,BIOS,控制、管理硬件),MSDOS.SYS,(管理磁盘和文件),COMMAND.COM,(处理内外部命令),作用:,DOS,是,控制和管理计算机的硬件资源、方便用户使用,的,程序集,2026/6/9 周二,4,用程序控制,PC,硬件的方法:,应用高级语言中的语句进行控制,(,语句少,速度慢,),汇编语言编程进行控制,(要求了解硬件),。,应用,BIOS,提供的功能程序来控制硬件,,即,BIOS,调用,,要求编程者对硬件有相当深入的了解。,优点:,BIOS,调用速度快,另外,,BIOS,固化在,ROM,中,不依赖于,DOS,操作系统,。缺点:,使用,BIOS,调用的汇编语言或,C,语言程序可移植性比较差。,应用,DOS,提供的一些功能服务程序来控制,,即,DOS,调用,,可对显示器、键盘、打印机、串行通信等字符设备提供输入输出服务。,DOS,提供了近百种,I/O,功能服务程序可供调用,编程者无需对硬件有太深的了解。使用,DOS,调用,编程简单,调试方便,可移植性好,,但速度较慢。,2026/6/9 周二,5,第二节 中断和中断向量表,概念:,中断、中断返回、中断源、中断的优先级、中断挂起、中断屏蔽,中断的分类:,硬中断:外部设备引起的,软中断:中断指令引起的,中断号:每个中断都有一个编号,称作中断号,2026/6/9 周二,6,第二节 中断和中断向量表,中断向量:,每个中断都对应着一段程序,该程序的入口地址称为中断向量,中断向量,包括段基址和,偏移量,,占据,4,字节空间,低位的两个字节存储偏移地址,高位的两个字节存储段基址,2026/6/9 周二,7,第二节 中断和中断向量表,中断向量表:,中断向量表是指中断服务程序的入口地址表,占据系统内存中最低端,1K,(,00000H003FFH,)字节的空间,它的作用是按中断类型号从小到大的顺序存储对应的中断向量,总共存储,256,(,00HFFH,)个中断向量。,在中断响应过程中,,CPU,通过从接口电路获取的中断类型号(中断向量号)计算对应的中断向量在表中的位置,并从中断向量表中获取中断向量(中断服务程序的入口地址),然后将程序流程转向中断服务程序。,2026/6/9 周二,8,第二节 中断和中断向量表,常用的中断号及功能(表,9-1,),系统硬件中断号:,00H0FH,、,70H77H,视频,BIOS,的中断号:,10H,其他,BIOS,的中断号:,11H1FH,DOS,中断号:,20H2FH,(,其中,21H,为,DOS,系统服务功能调用),2026/6/9 周二,9,第三节,BIOS,调用,BIOS,调用是通过软件中断来实现的。在中断调用前需要把功能号装入,AH,寄存器,把子功能号装入,AL,寄存器,,另,外,通常还需在,CPU,寄存器中提供专门的调用参数。步骤,如下,:,(,1,)把调用参数装入指定的寄存器中;,(,2,)如需功能号,把它装入,AH,;,(,3,)如需子功能号,把它装入,AL,或,BL,;,(,4,)按中断号调用,BIOS,中断;,(,5,)检查返回参数是否正确。,2026/6/9 周二,10,第三节,BIOS,调用,例如:将显示方式置为,640,*,480,分辨率,16,色。,相应的汇编语言代码应是:,MOV AH,0,;设置视频方式的功能号,是,0,,,送入,AH,MOV AL,12H,;,12H,对应的显示方式是,640*480,,,16,色,INT 10H,;,进行视频,BIOS,调用,对应的,C,语言代码是:,_AH=0;,_AL=0 x12;,geninterrupt(0 x10);,geninterrupt(),是,dos.h,中定义的一个函数,用来产生一个软中断,原型是:,void geninterrupt(int intr_num);,2026/6/9 周二,11,第三节,BIOS,调用,有些,BIOS,调用有出口参数,例如:,读取当前光标处字符,(,示例:,9_1.c,),char c;,_AH=8;,/,视频,8,号,功能是读取字符,_BH=0;,/,显示页号,geninterrupt(0 x10);,c=_AL;,/,中断后,,AL,中存,储所读,字符,printf(“%cn”,c);,2026/6/9 周二,12,第三节,BIOS,调用,例,9.1,:从键盘读入一个字符(无回显),键盘,I/O,中断调用号是,16H,,该调用有三个常用功能,功能号分别是,0,1,2,。使用时必须将功能号放在,AH,中。,入口参数:,AH,存储,功能号,:,0,:从键盘读取字符,1,:读键盘状态,2,:读键盘标志,出口参数,:,AH=,扫描码,,AL=ASCII,码,。,2026/6/9 周二,13,第三节,BIOS,调用,C,程序代码是:,#include,#include,int main(),char c;,_AH=0;,geninterrupt(0 x16);,c=_AL;,/,AL,存储字符的,ASCII,码,printf(“%cn”,c);,return 0;,2026/6/9 周二,14,第四节,DOS,调用,DOS,调用和,BIOS,调用的异同点:,P117,表,9-2,:部分,DOS,软中断的功能,附录,B,:,INT 21H,中断的功能、功能号,及,参数,DOS,系统功能调用的方法:,(,1,)入口参数送指定的寄存器或内存,(,2,)功能号送,AH,中,(,3,)执行,INT 21H,软中断指令,(,4,)检查或存储出口参数,2026/6/9 周二,15,第四节,DOS,调用,例,9.2 1,号功能调用(键盘输入字符,有回显),功能:对按下的任何键,都将其对应字符的,ASCII,码送入,AL,中,并在屏幕上显示该字符。如果按下的是,Ctrl,Break,组合键,则终止程序执行。,入口参数,:无,出口参数,:输入的字符,在,AL,中。,说明:还有个,8,号功能调用,功能与,1,号调用类似,区别是输入的字符,无回显,,可用于输入密码。,2026/6/9 周二,16,第四节,DOS,调用,C,程序代码:,#include,#include,int main(),char c;,_AH=1;,/1,号功能调用,geninterrupt(0 x21);,c=_AL;,/AL,中存储的是字符的,ASCII,码,printf(“%cn”,c);,return 0;,2026/6/9 周二,17,第四节,DOS,调用,练习:键盘读入一个密码存入数组(,8,号调用),#include,#include,int main(),char i=0,c,pw20=0;,do,_AH=8;,geninterrupt(0 x21);,pwi=_AL;/AL,中存储的是字符的,ASCII,码,while(pwi+!=r);/,回车符,不是换行,printf(“%sn”,pw);,return 0;,2026/6/9 周二,18,第四节,DOS,调用,例,9.3,:,2,号功能调用(屏幕显示一个字符),入口参数:,将,待显示,字符置入,DL,出口参数:无,#include,#include,int main(),_DL=A;,_AH=2;,geninterrupt(0 x21);,return 0;,2026/6/9 周二,19,第四节,DOS,调用,例,9.4,:,9,号功能调用,(,屏幕显示字符串,),入口参数:,待显示字符串须先放内存一数据区(,DS,段)中,且以,$,符号作为结束标志。,字符串首地址的段基址和偏移地址分别,置,入,DS,和,DX,。,出口参数:无,2026/6/9 周二,20,第四节,DOS,调用,程序代码:,#include,#include,int main(),char*p=”hello$”;,/,设小模式编译,,near,指针,_DX=(unsigned)p;,_AH=9;,geninterrupt(0 x21);,return 0,;,2026/6/9 周二,21,第四节,DOS,调用,练习:,9,号功能调用,(,屏幕显示字符串,,设在紧凑模式下编译,),char far*p=”hello$”;,int oldds=_DS;,_DS=FP_SEG(p);,_DX=FP_OFF(p);,_AH=9;,geninterrupt(0 x21);,_DS=oldds;,2026/6/9 周二,22,第四节,DOS,调用,例,9.5,:,例,9.6,:,例,9.7,:,以上三例请参阅教材并运行程序,2026/6/9 周二,23,第五节,BIOS,和,DOS,系统调用函数,除了,geninterrupt(),函数外,下面几个函数可用于,BIOS,或,DOS,调用:,int86(),BIOS,、,DOS,调用均可,int86x(),BIOS,、,DOS,调用均可,intdos(),DOS,调用,intdosx,DOS,调用,intr(),BIOS,、,DOS,调用均可,2026/6/9 周二,24,一、,int86(),原型,:,int int86(int intr_num,union,REGS,*inregs,union,REGS,*outregs);,第一个参数表示中断调用的类型号,相当于,INT n,中的,n,第二和第三个参数都是指针,指向共用体变量,前者用于指明“功能号和入口参数所存放的位置”,后者指明“出口参数所存放的位置”,函数返回值在,AX,中,int86(),进行,BIOS,或,DOS,功能调用时,段地址必须是固定的,(不能跨段使用),。,2026/6/9 周二,25,共用体类型,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(),用来存储标志寄存器,_FLAGS,中的进位标志位,以验证成功或失败(,0,:成功,,1,:失败),2026/6/9 周二,26,一、,int86(),可以想象,函数的定义大体是:,int int86(int n,union,REGS,*in,union,REGS,*out);,_AX=in-x.ax,;,_BX=in-x.bx;,_CX=in-x.cx;,_FLAGS=in-x.flags;,geninterrupt(n);,out-x.ax=_AX;,out-x.bx=_BX;,return _AX;,未必都执行,(,由,n,决定执行哪些),未必都执行,2026/6/9 周二,27,例,9.8,从键盘读入一个字符(同例,9.1,),键盘,I/O,中断调用号是,16H,,调用,0,号功能可读入字符。使用时必须将功能号放在,AH,中,出口参数是:,AH=,扫描码,,AL=ASCII,码。,主要代码:,char c;,union REGS inregs,outregs;,inregs.h.ah=0;,/,使用,0,号功能,c=int86(0 x16,/,返回,AX,的值,printf(“%cn”,c);,此行也可以写成如下两行:,int86(0 x16,c=outregs.h.al;,一、,int86(),2026/6/9 周二,28,例,9.9,写,一个函数,可将光标定位到,(x,y),处,分析:这是视频,BIOS,调用中的,2,号功能调用,入口参数:功能号送,AH,,光标行、列号分别送,DH,和,DL,。,BH,为显示页号,,选,0,。,出口参数:无,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(0 x10,int main(),clrscr();,putchar(A);,movetoxy(10,10);,putchar(B);,movetoxy(5,5);,putchar(C);,return 0;,一、,int86(),2026/6/9 周二,29,二、,int86x(),原型,:,int int86x()(,int intr_num,union,REGS,*inregs,union,REGS,*outregs,struct,SREGS,*segregs,);,前三个参数同,int86(),,第四个参数,是一个,SREGS,类型指针,用来指明段地址,SREGS,类型定义如下:,struct SREGS,unsigned int es;,unsigned int cs;,unsigned int ss;,unsigned int ds;,;,2026/6/9 周二,30,二、,int86x(),int86x(),函数实际上只用到,ds,和,es,两个成员,执行前只需要将这两个新段值存入,ds,和,es,即可。,函数执行时,会自动保存寄存器,DS,和,ES,的原值,然后换为,ds,和,es,的值。待函数执行结束时,再自动恢复原值。,2026/6/9 周二,31,二、,int86x(),可以想象,函数的定义大体是:,int int86(int n,union,REGS,*in,union,REGS,*out,struct SREGS,*s,);,/,备份段地址,_AX=in-x.ax,;,_DS=s-ds;,_ES=s-es;,geninterrupt(n);,out-x.ax=_AX;,out-x.bx=_BX;,/,恢复段地址,return _AX;,未必都执行,未必都执行,2026/6/9 周二,32,二、,int86x(),例,9.10,键盘输入一个文件名(含路径),查看其属性(设需要改变段值),分析:,本例使用的是,DOS,功能调用,功能号,43H,入口参数是:,AL=0,出口参数:,若成功,文件属性保存在,CL,中,说明:,文件属性是一个字节,每位的含义如下:,位,0,:是否只读,位,1,:是否隐含,位,2,:是否系统文件,位,3,:卷标,位,4,:子目录,位,5,:更改标志,位,6,:,0,位,7,:,0,当所有位都是,0,时,表示可读可写。,2026/6/9 周二,33,二、,int86x(),#include,int main(),char filename80;,union REGS inregs,outregs;,struct SREGS segregs;,printf(Enter filename:);,gets(filename);,/,可含盘符、路径,不要打两条,(,键盘输入,),inregs.h.ah=0 x43;,inregs.h.al=0;,inregs.x.dx=FP_OFF(filename);,segregs.ds=FP_SEG(filename);,int86x(0 x21,printf(File attribute:%Xn,outregs.h.cl);,return 0;,2026/6/9 周二,34,三、,intdos(),原型,:,int intdos(union,REGS,*inregs,union,REGS,*outregs);,该函数用于,DOS,系统功能调用(,INT 21H,),第一个,是,入口参数,,,表示相应的功能号,第二个参数是出口参数。,函数调用后若,cflag,为,0,表示调用成功,返回值在,outregs,的,ax,中,若,cflag,为,1,表示调用出错,,ax,中为错误代码。,2026/6/9 周二,35,三、,intdos(),例,9.11,键盘输入一个文件名(含路径),删除该文件。(设不需要改变段值),分析:,DOS,调用的,41H,功能为删除文件。,该功能要求调用前将文件名的段地址和偏移地址分别送,入,DS,和,DX,。,本例中,DS,不改变段值,,故,只需送偏移地址。,int delete_file(char near*filename),union REGS regs;,int ret;,regs.h.ah=0 x41;,/,功能号,41H,,删除文件,regs.x.dx=(unsigned)filename;,/dx,置偏移地址,ret=intdos(,return(regs.x.cflag?ret:0);,2026/6/9 周二,36,四、,intdosx(),原型,:,int intdosx(union,REGS,*inregs,union,REGS,*outregs,struct,SREGS,*segregs);,说明:,该函数,与,intdos,的区别等同于,int86(),与,int86x(),的区别,只能用于,DOS,调用(跨段时),2026/6/9 周二,37,四、,intdosx(),例,9.12,键盘输入一个文件名(含路径),删除该文件。(设需要改变段值),int delete_file(char far*filename),union REGS regs;,struct SREGS sregs;,int ret;,regs.h.ah=0 x41;,regs.x.dx=FP_OFF(filename);,sregs.ds=FP_SEG(filename);,ret=intdosx(,return(regs.x.cflag?ret:0);,2026/6/9 周二,38,五、,intr(),原型,:,void intr(int int_num,struct,REGPACK,*preg);,struct,REGPACK,/dos.h,中定义,unsigned r_ax,r_bx,r_cx,r_dx;,unsigned r_bp,r_si,r_di,r_ds,r_es,r_flags;,;,说明:,该函数可用于,BIOS,或,DOS,调用,,,第一个参数是中断调用号,入口参数:,调用前入口参数应存到,preg,所指的结构体变量中,出口参数:存储在,preg,所指的变量,中,2026/6/9 周二,39,五、,intr(),例,9.13,从,键盘读入一个字符,(,例,9.8),改,用,intr(),实现,#include,int main(),char c;,struct,REGPACK,p;,p.r_ds=_DS;,p.r_es=_ES;,p.r_ax=0;,/AH,置,0,调用,0,号功能,intr(0 x16,c=p.r_ax;,/,出口参数在,p.r_ax,中,printf(“%cn”,c);,return 0;,2026/6/9 周二,40,编程实训,课后习题:,18,第,20,章:实例,1,实例,12,
展开阅读全文