已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一 概述BIOS是Basic Input Output System的缩写,是固化在只读存储器ROM中的基本输入输出程序。BIOS保存着微机系统最重要的基本输入输出程序、系统信息设置、开机自检程序和系统启动自举程序等,用来进行系统测试、初始化引导程序、对I/O设备进行控制。DOS是Disk Operation System(磁盘操作系统)的缩写,是用来控制和管理计算机的硬件资源、方便用户使用的程序集合。由于这些软件程序存放在磁盘上,而且主要功能是进行文件管理和输入输出设备管理,故称为磁盘操作系统。磁盘操作系统是人和机器交互的界面,用户通过操作系统使用和操作计算机。DOS和BIOS提供了大量的可供用户直接使用的系统服务程序。DOS系统中的IO.SYS(基本输入输出模块)通过BIOS控制、管理外部设备。一般来说,用户可以通过用4种方式控制PC的硬件。(1) 应用高级语言中的语句进行控制。但高级语言中的I/O语句比较少,执行速度慢。(2) 应用DOS提供的一些功能服务程序来控制,可对显示器、键盘、打印机、串行通信等字符设备提供输入输出服务。DOS提供了近百种I/O功能服务程序可供调用,这是一种高层次的调用,编程者无须对硬件有太深的了解。使用DOS调用,编程简单,调试方便,可移植性好。(3) 应用BIOS提供的功能程序来控制硬件,这是低层次的控制,要求编程者对硬件有相当深入的了解。BIOS调用速度快,适用于高速运行的场合,但使用BIOS调用的汇编语言或c语言程序可移植性比较差另外,BIOIS固化在ROM中,不依赖于DOS操作系统。(4) 直接使用汇编语言编程进行控制。要求编程者对I/O设备的地址、功能比较熟悉。二 中断和中断向量表1. 中断(Interrupt)a 中断的概念 中断是指在计算机运行期间,由于程序的事先安排或者系统内发生的非寻常的或非预期的急需处理事件,使CPU暂时中止当前正在执行的程序而转去执行相应的事件处理程序的过程。事件处理程序执行完毕后又返回到被中止处继续执行,称为中断返回。转去执行的程序称为中断服务程序,产生中断请求(IRQ即interrupt request)的设备或事件称为中断源。中端有优先级。CPU接收到两个以上中断请求时,首先响应级别高的中断,对级别低的中那段暂不响应,称为“挂起”。有些中断源产生的中断,可以用编程的方法使CPU不予理睬,称为“中断屏蔽”。b 中断的分类根据中断源的不同,中断一般可分为两类:(1) 由外部设备接口向CPU的中断请求引脚发中断请求信号而产生的中断,称为硬中断。(2) 由执行中断指令而引起的中断,称为软中断。不管是硬中断还是软中断,每一种中断都有一个中断号与其对应。2. 中断向量表 中断向量是指中断服务程序的入口地址(包括段基址和偏移量),一个中断向量占据4字节空间,低位的两个字节存储偏移地址,高位的两个字节存储段基址。中断向量表是指中断服务程序的入口地址表,占据系统内存中最低端1K(00000H003FFH)字节的空间,它的作用是按中断类型号从小到大的顺序存储对应的中断向量,总共存储256(00HFFH)个中断向量。 在中断响应过程中,CPU通过接口电路获取的中断类型号(中断向量号)计算对应的中断向量在表中的位置,并从中断向量表中获取中断向量(中断服务程序入口地址),然后将程序转向中断服务程序。在全部256个中断中,前32个(031)为硬件系统所预留。后224个可由用户设定。下表给出了一些中断向量的序号及简单说明:中断号功能中断号功能0除法错误19重启动(Reboot)1单步(调试)1A时钟服务2非屏蔽中断NMI1B断开控制(Ctrl+Break)处理程序3断点1C用户时钟服务4溢出1D视频显示参数表指针5打印屏幕键和BOUND指令1E磁盘驱动器参数表指针6非法指令错误1F图形符号模式表指针7协处理器仿真20终止程序(DOS 1.0)8时钟定时信号(18.2Hz)21DOS服务9键盘22程序终止处理程序AIRQ2(AT系统中的级联)23Ctrl+C处理程序BFIRQ3IRQ724严重错误处理程序10视频BIOS25读盘11设备环境26写盘12常规内存变量27中止并驻留13直接磁盘服务28DOS保留14串行COM口服务2F多功能处理程序15其他服务31Windows提供的DPMI16键盘服务33鼠标驱动程序17并行口(LPT)服务67HIMEM.SYS提供的VCPI18ROM BASIC7077IRQ8IRQ15三 BIOS调用1. BIOS调用简介BIOS是由若干个子程序组成的,只不过这些子程序固化在系统板上的ROM中。这些子程序可以管理各种输入输出设备,如键盘、打印机、异步通信、时钟等。还有一些用来管理磁盘、网络、图形显示器的基本输入输出系统,即磁盘BIOS、网络BIOS和显示BIOS则一般固化在相应设备的硬件控制卡上。例如,驱动VGA显示器的服务程序固化在显示卡上的ROM中,所以把它叫做视频BIOS。这些卡上的ROM所占的地址空间,仍属于系统存储器。BIOS是为了控制外部设备而编写的一系列子程序,用户若要控制这些设备,不必重新编写子程序,在自己的程序中调用BIOS提供的子程序就可以了,这便是BIOS中断调用。2. BIOS调用的方法和例子BIOS中每个为I/O设备服务的程序都有一个中断服务号与之对应。例如:视频BIOS的中断号是10H,磁盘服务的中断号是13H等。BIOS调用是通过软件中断来实现的。在中断调用前需要把功能号装入AH寄存器,把子功能号装入AL寄存器,除此之外,通常还需在CPU寄存器中提供专门的调用参数。一般来说,调用BIOS功能时,有以下5个基本步骤:(1) 把调用参数装入指定的寄存器中;(2) 如需功能号,把它装入AH;(3) 如需子功能号,把它装入AL或BL;(4) 按中断号调用BIOS中断;(5) 检查返回参数是否正确。例如:下面的程序段是用汇编语言设置显示器显示方式的视频BIOS调用。说明:视频BIOS的调用号是10H,设置视频方式的功能号是00H。MOV AH,0;设置视频方式的功能号送入AHMOV AL,12H;所需参数送AL,12H对应的显示方式是640*480,16色INT 10H;进行视频BIOS调用上面的程序段在C语言中利用伪变量也能实现:_AH=0;_AL=0X12;geninterrupt(0x10);其中geninterrupt()是dos.h中定义的一个函数,用来产生一个软中断,需要一个中断号作参数。其原型是:void geninterrupt(int intr_num);有些BIOS调用会产生一些返回信息,比如调用的结果、调用是否成功或错误代码信息,这些均称为出口参数存储在指定的寄存器中。例如:读取当前光标处字符(视频8号功能)的调用,出口参数在AL中。C程序段是:char c;_AH=8;/功能号_BH=0;/显示页号geninterrupt(0x10);c=_AL;/中断后,寄存器AL中存有字符的ASCII码 下面是BIOS调用的一个完整例子:从键盘读入一个字符。键盘I/O中断调用号是16H,该调用有三个常用功能,功能号分别是0,1,2.使用时必须将功能号放在AH中。功能号:0:从键盘读取字符 1:读键盘状态 2:读键盘标志本例需要调用0号功能,出口参数是AH=扫描码,AL=ASCII码。c程序代码是:#include#includeint main() char c;_AH=0;geninterrupt(0x16);c=_AL;/AL中存储的是字符的ASCII码printf(“%cn”,c);return 0; 四 DOS调用MS DOS操作系统为程序设计者提供了若干个可以直接调用的软中断处理程序,每一个中断处理程序完成一个特定的功能操作,程序员可根据需要调用它们。DOS的中断处理程序的主要功能如下:(1) 磁盘的读写控制。(2) 内存管理、文件操作和目录管理。(3) 基本输入输出(对键盘、打印机和显示器等)控制,日期、时间管理等。1. DOS调用简介DOS调用和BIOS调用的方法基本相同,但功能却不完全相同。BIOS只提供了一些最基本的输入输出服务,没有提供对文件、目录和内存的管理,而DOS调用的主要内容是文件管理,它提供的是一些以文件形式进行输入输出的高层管理功能。注意:有些DOS中断服务和BIOS具有看似相同实则不同的功能,例如:BIOS和DOS都可以读写磁盘,但操作方式却不相同:BIOS是直接对磁盘扇区进行读写;而DOS却用文件形式对磁盘读写,用户不需要知道系统内部对山区是怎样操作的。再例如:BIOS的INT 10H的0AH功能调用和DOS的INT 21H的02和09H功能调用都是在屏幕上显示字符,但BIOS仅限于文本方式下,而DOS在图形方式下也同样可用。又例如:DOS也提供了标准输入输出设备。但这些设备可以重定向,而BIOS却不能。实际上,有些DOS调用本身就是通过调用BIOS的功能来实现自己的功能的,因此DOS调用速度低于BIOS 调用。但DOS调用比BIOS调用更灵活,可移植性更好。BIOS功能调用不受任何操作系统的约束,而DOS的中断功能仅在DOS环境下适用。另外,对有些功能(如对显示器的操作),BIOS调用提供的功能比DOS调用更丰富。如果某些工作适用DOS调用无法实现,就需要适用BIOS调用。下表是部分DOS软中断的功能,其中INT 22H、INT 23H、INT 24H不允许用户直接调用。INT 20H的作用是终止正在运行的程序、返回DOS或父进程,该终止程序仅适用于扩展名为COM的命令文件,而不能用于扩展名为EXE的可执行文件。软中断功能软中断功能INT 20H终止当前程序返回INT 24H出错处理(不允许直接调用)INT 21HDOS系统服务INT 25H读磁盘INT 22H终止地址(不允许直接调用)INT 26H写磁盘INT 23HCtrl+Break处理程序(不允许直接调用)表中的INT 21H软中断是一个具有几十种功能(子程序)的大型中断服务程序,这些功能(子程序)所对应的编号,称为功能号。每个功能子程序完成一种特定的操作和处理。2. DOS调用的方法和例子对INT 21H软中断指令对应的功能子程序的调用称为DOS系统功能调用。调用系统功能子程序时。程序员不必了解所使用设备的物理特性、接口方式及内存分配等,也不必编写繁琐的控制程序,直接按下面的方法调用即可。(1) DOS系统功能的调用方法INT 21H系统功能调用的步骤如下:1) 入口参数送指定的寄存器或内存。2) 功能号送入AH中。3) 执行INT 21H软中断指令有少数子功能调用程序不需要入口参数,但大部分需要把参数送入指定位置。(2) DOS系统功能调用的例子下面介绍的是常用的几个DOS系统功能调用。例子1:1号功能调用(键盘输入字符,有回显)。功能:该调用的功能是,对按下的任何键,都将其对应的字符的ASCII码送入AL中,并在屏幕上显示该字符。如果按Ctrl + Break组合键,则终止程序执行。1号功能调用无须入口参数,出口参数在AL中。#include#includeint main() char c; _AH=1; geninterrupt(0x21); c=_AL;/AL中存储的是字符的ASCII码 printf(%cn,c); getch(); return 0;说明:还有8号功能调用,功能与1号调用类似,区别是输入的字符不在屏幕上显示,可用于输入密码。例子2: 2号功能调用(屏幕显示一个字符)。功能:将置入DL寄存器中的字符在屏幕上显示输出。#include#includeint main() _DL=A; _AH=2; geninterrupt(0x21); getch(); return 0;例子3:9号功能调用(屏幕显示字符串)(注:小模式下)功能:在屏幕上显示字符串。要求:(1) 待显示的字符串必须先放在内存一个数据区(DS段)中,且以“$”符号作为结束标志。(2) 将字符串首地址的段基址和偏移地址分别存入DS和DX寄存器中。程序代码如下:char *p=“hello$”;_DX=(unsigned)p;_AH=9;geninterrupt(0x21);例子4:0AH号功能调用(字符串输入功能调用)(注:小模式下)。功能:从键盘接收字符,并存放到内存缓冲区。要求:(1) 执行前先定义一个输入缓冲区,缓冲区的第一个字节存入一个整数,该证书决定着输入字符的最多个数,字符个数应包括键盘输入时最后的回车符0DH在内,不能为0.第二个字节保留,程序执行完后会自动存入实际输入字符个数(不含回车)。从第三个字节开始存储从键盘接收的字符。若实际输入的字符个数大于定义的字符个数,多余的字符丢弃不用,且响铃示警,一直到输入Enter键为止。整个缓冲区的长度等于最大字符个数再加2.(2) 将缓冲区首地址的段基址和偏移地址分别存入DS和DX寄存器中。程序代码如下:char s20;s0=18;_DX=(unsigned)s;_AH=10;geninterrupt(0x21);若键盘输入ABCD并回车,则是s0s6的值分别是18,4,65,66,67,68,13.例子5:0BH号功能调用(检查键盘输入)。功能:检查是否有键盘输入,若有键按下,则AL=0FFH,若无键按下,则AL=00H。对于利用键盘操作退出循环或使程序结束之类的操作来说,这种调用是很方便实用的。程序代码如下:printf(“Press anykey to exit”);_AL=0;while(!_AL)_AH=0xB;geninterrupt(0x21);例子6:2BH号功能调用(设置系统日期)。功能:设置有效的年、月、日。当AL=0时,设置成功;当AL=0FFH时,设置失败。要求:调用前要将年号放于CX,月份放于DH,日期放于DL。程序代码如下:_CX=2012;_DH=1;_DL=24;_AH=0X2b;geninterrupt(0x21);if(_AL=0)printf(“设置成功!n”);elseprintf(“设置失败!n”);DOS的2DH号功能调用可用来设置系统时间,调用方法与此类似。五 BIOS和DOS系统调用函数对于BIIOS和DOS调用,除了前面介绍的方法之外,还可以使用下面几个标准函数:int86()、int86x()、intdos()、intdosx()、intr(),大多数c编译器都支持这些函数。1. int86()该函数可用于BIOS调用也可用于DOS调用,适用于80x86系列的CPU,故称int86()函数。其原型是:int int86(int intr_num,union REGS * inregs,union REGS* outregs);其中第一个参数表示中断调用的类型号,相当于INT n中的n。第二个参数和第三个参数都是指针,指向共用体变量,前者用于指明“功能号和入口参数所存放的位置”,后者用于指明“出口参数所存放的位置”。函数返回值在AX中。共用体类型REGS是在dos.h中定义的,定义如下:struct WORDREGSunsigned int ax,bx,cx,dx,si,di,cflag,fkags;struct BYTEREGSunsigned char al,ah,bl,bh,cl,ch.dl.dh;union REGSstruct WORDREGS x;struct BYTEREGS h;其中结构体WORDREGS和BYTEREGS中的成员都是变量,不是寄存器,只不过在调用int86()的过程中会将变量的值赋予同名的寄存器中,例如:成员ax的值将赋予寄存器AX。cflag代表标志寄存器的进位标志位,调用后通过测试该标志位的值(0或1)可以知道调用成功或失败。例子1:从键盘读入一个字符。键盘I/O中断调用号是16H,调用0号功能可读入字符。使用时必须将功能号放在AH中,出口参数是AH=扫描码,AL=ASCII码原来的c程序段是:char c;_AH=0;geninterrupt(0x16);c=_AL;使用int86()函数可将主要代码改为:char c;union REGS inregs,outregs;inregs.h.ah=0;/使用0号功能c=int86(0x16,&inregs,&outregs);/返回AX的值printf(“%cn”,c);其中“c=int86(0x16,&inregs,&outregs);”一行也可以写成如下两行:int86(0x16,&inregs,&outregs);c=outregs.h.al;例子2:设计一个函数,可以将光标定位到(x,y)坐标处。 光标定位是INT 10H中功能号为2的显示中断调用。使用时DH存放的应是行号,DL存放的是列号,BH为显示光标的页号,选0.出口参数无。程序代码如下:void movetoxy(int x,int y) union REEGS regs;regs.h.ah=2;regs.h.dh=y;regs.h.dl=x;regs.h.bh=0;int86(0x10,®s,®s);int main()clrscr();putchar(A);movetoxy(10,10);putchar(B);movetoxy(5,5);putchar(C);return 0;注意:通过int86()进行BIOS或DOS功能调用时,段地址必须是固定的。若使用远指针进行跨段调用,则应该使用下面的int86x()函数。2. int86x()函数原型是:int int86x(int intr_num,union REGS* inregs,union REGS* outregs,struct SREGS* segregs);与int86()函数相比,intx86()多了一个参数segregs,它是一个SREGS类型指针,用来指明段地址。SREGS在dos.h中的定义如下:struct SREGSunsigned int es;unsigned int cs;unsigned int ss;unsigned int ds;在int86x()函数中,实际上只用到ds和es。调用前,应先把要设置的新段值赋给ds和es这两个成员。在int86x()执行过程中,int86x()会先把DS和ES的原值保存,然后换成新设置的新值。调用后,再自动恢复成原来的值。例子3:从键盘输入一个文件名(含路径,不要打两条),查看其属性(设需要改变段值)。本例使用的是DOS功能调用,功能号位43H,读取文件属性的入口参数是AL=0;若成功,文件属性保存在CL中。文件属性是一个字节,每位的含义如下:位0:是否只读;位1:是否隐含;位2:是否系统文件;位3:卷标;位4:子目录;位5:更改标志;位6: 0;位7: 0;当所有位都是0时,表示可读可写。程序代码如下:#include#includeint main() char filename80; union REGS inregs,outregs; struct SREGS segregs; clrscr(); printf(Enter filename:); gets(filename);/可含盘符、路径,不要打两条 inregs.h.ah=0x43; inregs.h.al=0; inregs.x.dx=FP_OFF(filename); segregs.ds=FP_SEG(filename); int86x(0x21,&inregs,&outregs,&segregs); printf(File attribute:%Xn,outregs.h.cl); getch(); return 0;3. intdos()intdos()函数的原型是:int intdos(union REGS* inregs,union REGS* outregs);该函数用于DOS系统功能调用(INT 21H)。第一个参数表示相应功能号的入口参数,第二个参数是出口参数。函数调用后若cflag为0,表示调用成功,返回值在outregs的ax中,若cflag为1表示调用出错,ax中为错误代码。例子4:从键盘输入一个 文件名(含路径),删除该文件(设不需要改变段值)。该功能要求调用前将文件名的段地址和偏移地址分别送DS和DX。若不改变段值,则只需送偏移地址。#include#includeint delete_file(char near* filename) u
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中枢原始性神经外胚瘤的护理个案
- 专题07 阅读理解30篇【考题猜想】原卷版
- 秋冬防流感健康伴成长
- 2026年度市场策略报告:风生水起乘势而上
- 2026浙江嘉兴市第二医院招聘高层次人才44人历年真题汇编及答案解析(夺冠)
- 2025北京振远护卫有限公司招聘备考公基题库附答案解析
- 2025北京丰台教委第二批人才引进(含博士后出站人员)招聘工作人员23人历年真题库附答案解析
- 2025广东佛山市农业科学研究所招聘1人笔试备考试卷带答案解析
- 2026年度陕西省招聘社区工作者答题题库带答案解析
- 2026年设备监理师之设备监理合同考试题库完整参考答案
- 自救器管理制度
- 中央环保督察迎战培训课件
- MOOC 3D工程图学-华中科技大学 中国大学慕课答案
- 提高低年级学生数学审题能力的
- CCP点的确认和验证记录
- 《国家电网公司输变电工程工艺标准库》《国家电网公司输变电工程工艺标准库》(架空线路)
- PEP英语六年级上册各单元知识点归纳及练习3
- 武汉城市介绍旅游攻略PPT模板
- 科技创新城生态与园林绿化系统规划说明书
- 液压电梯监督检验自检报告书资料
- 《机械制图》课程教案-三视图
评论
0/150
提交评论