DOS程序员参考手册[15A]

来源:互联网 发布:建站 智尚云cms 编辑:程序博客网 时间:2024/05/20 03:40

371页
       第15章BIOS参考手册
   BIOS(基本输入/输出系统)功能是任何PC机或兼容计算机的基础。BIOS功能包括
一些基本的操作,通过这些操作就能成功地使用计算机的硬件资源。在PC机或兼容机上
的绝大多数编程操作是在BIOS层之上进行的。在需要某些特殊功能却又无计可施的情
况下,程序员们可直接调用BIOS功能。有时候,BIOS甚至没有提供必须的服务,此时,程
序员就必须深入到BIOS之下,并进入硬件层。
PC机或兼容计算机的BIOS通常被保存在ROM中(因而产生了一种术语为“ROM
BIOS”),并把它作为硬件系统的一部分。通常情况下,系统的制造厂家都按照Microsoft
的MS-DOS规范提供BIOS,可以很容易地把用于EGA监视器或其他设备的ROM BIOS
扩展部分加进系统。这些扩展部分构成了PC环境可扩展属性的基础。在系统引导时,
BIOS的某些部分(一个隐藏的文件,通常称之为IO.SYS或IBMBIO.COM)可以从磁盘
中进行装载。如何引导DOS的详细介绍可参见第3章“动态的DOS"。
ROM发表日期被定位在以F000:FFF5h为开头的8字节中。表15.1中列出了重要
的BIOS发表日期。
                       表15.1 BIOS发表日期
    日期                              机器类型
    04/24/81                                   PC
    10/19/81                          修正PC机中常见的故障
    08/16/82                                PC XT
    10/27/82                                   PC至XT升级
    11/08/82                                  便携式PC机
    06/01/83                                   PCjr
    01/10/84                                  个人计算机AT
    09/13/85                                   Convertible PC
    04/21/86                                PCxT286
    09/02/86                                   PS/2系列
上述这些日期都只是IBM的ROM BIOS的发表日期,仅仅在使用IBM PC时,这些
期才有意义。那些没有真正的IBM ROM的系统很可能拥有不同的日期,上表中没有涉
之所有的ROM BIOS。尽管一些杂志和公告板(大多数报告故障)上常提醒用户注意ROM
其他日期,但可以肯定地讲,不存在很复杂的日期列表。
可用型号标识字节(定位于F000:FFFEh处)来区分不同的型号(见表15.2)。ps/2
                                                                                       
372页
系列继续支持这种型号标识字节。但是,对于非IBM机器,不能依赖于这种字节;因为它
们没有建立标准的值集。
                                表15.2标识字节
    字节                                  系    统
          9Ah                                           COMPAQ Plus
          FFh                                           IBM PC
          FEh                                           PC XT便携式PC
          FDh                                           PCjr
          FCh                                           个人计算机AT,PS/1,PS/2,Model 50和60
          FBh                                           PCXT(1/10/86以后)
          FAh                                           PS/2Model30
          F9h                                           Convertible C
          F8h                                           PS/2MOdel 80
      关于BIOS发表日期和型号标识的其他信息,可参见本节后面的Int 15,功能C0h。
      在PS/2上,OS/2和硬件之间没有BIOS。所有的硬件接口连接是通过设备驱动程序:
来实现的(关于设备驱动程序的介绍,可参见第12章“设备驱动程序”)。让BIOS留在PS/
2系统中出于下列三种原因:引导操作系统;支持DOS(若使用DOS的话)以及为运行
DOS程序支持兼容性框(Compatiblity Box)。
     可直接通过接口把设备驱动程序链接到操作系统中,以控制对硬件的访问。在多任务
操作系统如OS/2、Windows或UNIX中,这些驱动程序能够处理进程(程序)的请求,并
能井井有条地管理好每一件事情。在多任务环境中,必须通过驱动程序进行硬件的访问,
因为任何直接访问硬件或访问全围绕BIOS的程序都会破坏其它程序正在做的事情。
      最初编写用于支持DOS的BIOS,能够顺利地在OS/2下运行,因为这种BIOS不在
保护模式中运行。在保护模式中禁止某些处理器指令,并阻止程序访问已指派给其它程序
的内存部分。保护模式使得多任务操作成为可能,因为在保护模式下,可以编写程序但却
不必担心它会影响其它的程序。IBM OS/2包含有一种高级BIOS(ABIOS),它能在实模
式和保护模式下启动设备驱动程序,支持多任务执行并寻址多达16M的内存。
      在PS/2上,为了使程序能在Compatibility Box中运行而支持BIOS调用。甚至于
Borland的SideKic(使用了未公开的系统调用)也能运行在PS/2上,尽管Microsoft和
IBM的正式声明只支持已公开的DOS调用。但是在OS/2下,那些必须在后台中运行的
DOS程序却被悬挂起来。 OS/2的开发者们考虑到了最坏的情况,即DOS程序与多任务
不兼容,因为它们直接访问内存(例如,直接写屏幕)。
      进入OS/2环境的读者将会发现,本节指明了(在一切可能的地方)BIOS内中断处理
的PS/2特征。记住IBM并没有发表用于PS/2的BIOS的程序清单,但却发表了用于初
始化PC机的BIOS程序清单。不过,它已公布了几乎与旧的PC BIOS完全兼容的入口
点。在BIOS基础上建成的程序能在PS/2上继续运行。在PS/2系列上,那些依靠BIOS的
速度来定时的程序可以比在PC机上运行得更快。
      表15.3列出了PS/2中的主要变化。
     
373页
                 表15.3 PS/2的不同点      (PS/2)
      中断号                                    含    义
      0Bh                                       保留,不再通信
      0Ch                                       保留,不再通信
      0Dh                                       保留
      0Fh                                       保留
      15h                                       系统服务(磁带I/O)
      40h                                       软盘BIOS向量
      41h                                       硬盘参数
      46h                                       硬盘参数
      4Ah                                       用户警告
      71h-74h                                   保留
      76h-77h                                  保留
      F1h-FFh                                   用户程序中断
除了常常控制中断0Bh和0Ch的通信程序外,这些改变对绝大多数程序没有影响。
若对本章的功能是如何展现的有疑问,可参照本书的“参考手册概述”部分。
系统  Int       00h   
                                      被零除中断(硬件出错)
        当出现被零除的倾向时,该中断由CPU调用。
    调用寄存器:无
    返回寄存器:无
    注释:当处理器试图执行非法的被零除操作时,自动地调用被零除中断。因为
    若除数为零,计算机的除法过程永远都不会终止,在任何计算机上,都把这种
    操作当作出错处理。中断处理程序自动地处理这种出错。
        在启动时,BIOS把该中断设置为指向IRET指令。但是,DOS把此中断重
    新设置成指向产生Divide by zero信息的处理程序,并接着终止这道导致出错
    的程序。这一进程是在DOS层上进行处理的,因为在BIOS层上不存在相应
    的处理程序。被零除出错会使得操作系统不稳定,并导致其它错误。当被零除
    错误出现时,最好的办法是人为地重新启动操作系统或创建一道更好的处理
    程序(诸如用于DOS Int 24h的程序)。
        如果正在编写一道使用户输入出现这类错误的程序,则必须捕获被零除
    中断,并在某个例程中处理该中断。这是一种很好的编程练习,所编写的程序
    不仅能保证它们的屏幕用户输入,而且绝不允许这种错误俘获。但是,有时候
    程序会以一种意想不到的方式产生被零除中断。
        在程序操作期间会意外地出现被零除中断,此时,一种堆栈问题就可能导
374页
致处理器去执行Int 00h。在调试问题的过程中出现特别复杂的堆栈处理时
也会偶尔产生被零除中断。
      除了上述原因外,有些DOS版本在遇到访问不存在的文件的尝试时也会
产生被零除中断;若DOS在执行某个计算来把簇号转换成所有磁盘控制程序
所要求的磁道/磁头/扇区的地址格式时,则常常会出现这种错误。被零除错误
是位神秘的不速之客,因为在用户的操作行为和这种错误信息之间没有明显
的关系。
系统 Int      01h
                          单步中断
若设置俘获标志就由CPU调用。
调用寄存器:无                                              
返回寄存器:无
注释:无论什么时候设置俘获标志,在执行完所有的指令后都会调用Int
01h。调试程序使用这类中断处理程序单步执行(其它类型的程序则不能调用
这类中断)。
      在编写调试程序的过程中,尤其要注意用STF(Set Interrupt Flag:设置中
断标志)指令来阻止俘获你自己的中断处理程序。一旦进入了处理程序,中断
就被关闭,并且设置了俘获标志。若在关掉俘获标志之前重新启用中断,就会
单步执行中断处理程序,这样就不得不再次引导计算机以重新获得控制权。
系统 Int    02h
                       不可屏蔽中断(NMI)
在内存奇偶出错时由CPU调用
调用寄存器:无
返回寄存器:无
注释:从程序员的角度讲,不可屏蔽中断(NMI)是用途最小的中断,因为它表
示在操作过程中主系统失败。若出现NMI错,很可能没有恢复机会。对于
NMI,既不能封锁它也不能关掉它,唯一能做的就是接受它。
      在计算机的PC系列中(包括PS/2 30型),这类中断会报告奇偶出错。当
系统板上出现奇偶错误时,ROM BIOS就会显示出PARITY CHECK 1,并随
时锁定机器。PARITY CHECK2表示I/O通道奇偶出错。显示出PARITY
CHECK信息,则表示内存中出现间歇读(intermittent-read)问题。
      虽然可以来用循规蹈矩的方式来俘获中断以关闭系统,但中断处理程序
375页
      可能不处在好的内存中,因为这类中断正是出自于内存奇偶错误。更为严重的
      是,任清空缓冲区或更新文件的尝试都会破坏其它情况下还是好的文件。但
      是,有几种公共域和共享件程序可帮助你俘获该中断,并允许你选择除强迫重
      引导外的其它操作。
          在PS/2系列中(除Model 30外),可用此中断进行奇偶检测,但是错误信
      息以数字化的代码方式出现,它们的含义如下表所示:
          代码                              含    义
          110                               系统板内存失效
          111                               I/O通道检查被激活
          112                               监视程序超时
          113                               直接内存访问(DMA)总线超时
          I/O通道内存中的错误会导致给出错误号111。监视程序超时可用来检测
      是否有已遗漏的IRQ0(系统计时器)中断。当允许监视器超时时出现这种中
      断,此时就会产生NMI错误112。当直接内存访问(DMA)驱动程序时,若授
      予DMA设备以超过7.8微秒的总线控制权时,就会产生错误113。
      Int      03h
系统                          断点中断
      调试程序用该中断来俘获程序断点
      调用寄存器:无
      返回寄存器:无
      注释:正在调试的程序把此中断看作一个指向断点处理例程的向量。调试程
      序把Int 03h(使用特殊的单字节同义词操作码0CCh)置于所期望的断点处,
      并允许调试的程序运行。当该程序到达此断点时,中断处理程序把控制权归还
      给调试程序。
          对一些程序员来说,这种特殊的单步操作码可能显得有些陌生,但是In-
     tel公司提供的这一种0CDh 03h(用于Int 03h的普通编码)的代用品使得在
      可执行代码中能轻而易举地实现断点的布局。
          对于调试汇编语言程序来说,中断03h和01h是可以使用的原始硬件工
      具。
     Int      04h
系统                          算术溢出中断
      当算术操作溢出时由CPU调用
                                                                                     
376页
调用寄存器:无
返回寄存器:无
注释:当算术操作产生的结果大于所允许的数据类型时,可通过执行INTO
(溢出中断)指令来调用该中断。要启用INTO指令,必须在执行运算指令(如:
MUL或IMUL)前设置标志寄存器中的溢出位(位11)。
      对于大多数程序来说,由于运算溢出算不上是什么问题,因而通常就没有
采取相应的补救措施。此中断的缺省值指向IRET指令,并立即从此中断里返
回。没有使用任何特殊的处理程序来处理溢出,因为Intel微处理器指令集中
包含有JO和JNO(溢出跳转和未溢出跳转)指令,通常就用这两处指令来处
    理溢出。
系统 Int     05h
                          打印屏幕
把文本屏幕内容在打印机上打印出来
调用寄存器:无
返回寄存器:无
注释:按下PrtSc键(通常为Shift-PrtSc),即可触发把当前屏幕显示的内容
打印在打印机上的这种功能。功能05h传送到一种例程,该例程把视频屏幕缓
冲区的ASCII内容发送给打印机。请读者注意这里的“ASCII内容”一词,若在
处理图形屏幕时该中断引发打印行为,但所打印的内容却不可预测。
    大多数DOS版本包含GRAPHICS.COM实用程序,它安装一种代用的
打印屏幕中断处理程序,能处理图形。4.0版本之前的版本只能用于IBM(与
EPSON兼容)图形打印机;4.0版问世以后,它扩展到支持当前所有的IBM
打印机型号。
    还有几种备用Int 05h例程也广为使用。例如,Intel提供了一种作为软件
部分的替换处理程序,适用于Above Board Plus EMS内存板,后者突出其软
件打印缓冲设备的控制权并保持打印屏幕的功能。
    若要寻找一种打印屏幕显示的方法,可从你自己的程序中调用Int 05h。
在数据库程序中,打印屏幕显示特别有用,例如,可以打印屏幕的内容而不必
打印记录。
    有些情况下,可能需要用特殊的处理程序——即能处理特殊的情况或执
行完全不同的功能的处理程序来代替中断向量。标准功能保存光标位置,并接
着在同一系统上把屏幕内容打印给打印机1。它运行已许可的中断,因而在任
何中断(其它打印屏幕除外)都能控制该系统。
    此功能不会修改任何寄存器,它只是在内存中的0050:0000处维护一个
状态字节。如果此状态字节为1,就表明打印正在进行;如果此字节值为0,则
377页
      表明已完成了一个成功的打印;如果为FFh,则表明最后一次打印操作未能成
      功地完成。
系统  Int   08h
                                   系统定时器
      由系统时钟每秒大约调用18.2次(每小时65536次)
      调用寄存器:无
      返回寄存器:无
      注释:Int 08h是一个每秒钟要调用18.2次的中断,用于完成高级的各种计
      数,该中断直接与系统时钟芯片的通道0相连。要编写实用程序中的TSR,如
      SideKick,就会发现Int 08h对于由定时来触发的任务来说是特别有用的。此
      中断要调用Int 1Ch(定时计数)。因此大多数TSR应该连接到Int 1Ch而不是
      连接到Int 08h上。
          由于每隔55毫秒此中断就被调用一次,因而,面向该中断的处理程序必
      须尽可能快地执行。中断处理只能是处理器系统常规使用的一小部分。并且,
      由于计时器被当作IRQ0(高优先级硬件中断),因而会优先于同一系统上的其
      它中断而服务于中断Int 08h。若对该中断处理得不好,就会导致服务于其它
      的重要中断(如磁盘服务)时出现问题。
          注意,由于在Int 08h处理程序完成其处理之前调用了Int 1Ch(计时器的
      用户拴接),因而,面向该中断的操作也领先于其它任何硬件中断请求而得以
      执行。富有经验的软件设计人员则常常利用这一事实。
          地址0040:006Ch是一个32位按天计算的时间(time-of-day)指示符,计
      数自启动以来的时间计数。每当时间计数满24小时,位置0040:0070h就被
      置为1,而当BIOS读它时,该位置被清除为零。如果经过了24小时而其间又
      没有出现读取操作时,计算机的时间系统中便消失了一整天的时间,并又从零
      开始计数。
          通过递减位置0040:0040h处的值,该中断就能提供用于磁盘的发动机
      自动关闭功能。当位置0040:0040h的值为零时,位于0040:003Fh处的发
      动机状态中的发动机运行标志被重置为关掉磁盘发动机。
          让计时器采用奇数频率来调用Int 08h(18.2次/秒)的原因在于设计者们
      希望通过设置出时间显示来简化这项工作,以便位于0400:006Ch处的32
      位值中的高位字正好能每小时增加一次,这样便允许把它与24(十进制)进行
      简单的比较,以检测午夜翻转。
          用3600(每小时的秒数)来除65536(低位字翻转的计数),其结果正好是
      18.20——目标频率。遗憾的是,计时器芯片的递减计数频率略为偏低了一点,
      并且实际上在BIOS中检测到的计数数字是11,大于可能显示的结果,实际操
                                                                                       
378页
作中,由于不同的系统之间频率是不相同的,因而必须时常重新设置时钟。每
当引导系统时,这一进程通常就会发生;但是在一些拥有单独的实时时钟的系
统上,这些时钟也会在每周超出几秒或丢失几秒钟。
键盘 Int       09h
                          键盘中断
    无论何时按F3键或松开此键,都会调用这一原始的键击中断
    调用寄存器:无
    返回寄存器:无
    注释:无论何时按下F3键或放开此键,键盘就会发送一种信号(IRQ1)来触
    发该中断。该中断的处理程序从键盘端口(端口60h)中读取键信息,并把此信
    息处理成字符码和扫描码信息,然后将处理后的信息放入32个字节的字符队
    列中(通常保存在0040:001Eh处)。这两种代码被放置在由0040:001Ch(键
    盘缓冲区尾指针)所指向的位置上,并相应地增加了两个指针。BIOS控制台输
    入例程不是直接访问键盘,而是访问这种输入队列,因而程序员在进行键盘处
    理时保留某些超前敲入(typeahead)的余地和很多键盘处理中的灵活性。
        由中断处理程序解释的特殊键击如下:
    键击                      处    理
    Ctrl                      更新0040:0017h和0040:0018h(键盘控制字节)并且
                              更新0040:0096h(键盘模式标志)
    Alt                       与Ctrl相同
    Shift                     与Ctrl相同
    Ctrl-Alt-Del    把0040:0072h(重置标志)设置为1234h,并把系统控
                              制传送给POST(Power-On Self Test:加电自检)例程;
                              一旦设置了重置标志,POST就可绕过通常的启动检测。
    Pause                     导致处理程序在获取有效字符之前不断地循环下去。
    PrintScreen               使用Int 05h来调用打印屏幕例程。
    Ctrl-Break                Int 1Bh来调用Control-Break处理程序
    System Request  PC XT BIOS系统(日期晚于1/1/86)、个人计算机AT
                              系统、PC AT 286系统、PC Convertible系统和PS/2系
                              统使用Int 15h功能85h(按下SysReq键)。
        若使用具有BIOS发行日期晚于1/10/86的PC XT,或在使用Personal
    Computer AT、PC XT 286、PC Convertible或PS/2系统,那么处理完该键击
    后,把AL置为02h,该中断就能使用Int 15h的功能91h(中断完成)。(更多的
    信息可参见Int 15h的功能91h)。
        对键击作出快速响应的TSR(终止并驻留实用程序)常截取并充当该中

379页
断的作用。由于键盘例程要进行大量的处理操作,因而对该中断来说,从普通
的BIOS键盘例程中截取键盘请求是一种更为可取的截取操作。若必须要求
快速响应,则使用Int 09h是最为理想的方法。
通信 Int     0Bh
                  COM1和COM3中断服务(PC、PCXT)
                  COM2和COM4中断服务(Personal Computer AT)
                  保留(PS/2)
当串行端口在IRQ3上发出中断时,调用此中断
调用寄存器:无
返回寄存器:无
注释:远程通信程序通常截取该中断向量。其它所有访问串行端口(BIOS或
DOS功能)的方法都不够快,不能处理超过1200 bps(位/秒)的速度(详细的
情况请参见第7章对“串行设备”和第11章对“中断处理程序”的介绍)。通过
连接此处定制的中断处理程序,再经过仔细的中断处理程序编程,程序员们就
能处理达到机器容量极限的速度(约38.4K bps)。
    Int 0Ch处理此中断所不处理的COM端口。
遗憾的是,在PS/2上,该中断被列于保留行列。在PS/2上,必须重新编写
PS/2 在速度上依赖于此中断的通信程序。
通信 Int  0Ch
                COM2和COM4中断服务(PC、PCXT)
                COM1和COM3中断服务(Personal Computer AT)
                保留(PS/2)
当串行端口硬件在IRQ4上发出中断时调用
调用寄存器:无
返回寄存器:无
注释:远程通信程序通常截取该中断向量。其它所有访问串行端口(BIOS或
DOS功能)的方法都不够快,不足以处理超过1200bps的速度(详细情况参见
第7章对“串行设备”和第11章对“中断处理程序”的介绍)。在这里,通过连接
定制的中断处理程序,并在经过仔细的中断处理程序编程后,程序员们就能处
理达到机器所能承受的极限速度(约38.4K字节/秒)。
Int 0Bh处理此中断处理程序所不能处理的COM端口。
                                                                                           
380页
    (PS/2)遗憾的是,在PS/2上,将此中断标记为保留对象,这样,在PS/2
    必须重编写那些在速度上依赖于该中断的通信程序。
磁盘 Int  0Dh
                                                 磁盘管理(磁盘控制卡)(PC XT)
                                                 LPT2控制(Personal Computer AT)
                                                 保留(Ps/2)
          指定使用硬件中断请求线IRQ5的硬件控制器时调用该中断
          调用寄存器:无
          返回寄存器:无
          注释:仅在较新的ROM BIOS版本中才加进了此中断处理程序。它给出了一
          种从PC XT开始的可用功能。
            在Personal Computer AT上,用Int 0Dh进行LPT2处理(有关打印机服
        务的讨论参见Int 0Fh)。
        <PS/2>在PS/2上,Int 0Dh成为保留;它的功能被重新分布到别的地方。由
        于很少有(如果有的话)程序直接使用该中断,因而对大多数程序员来说,这种
        改变并未影响他们的工作。
磁盘 Int 0Eh
                               软盘管理
    使用硬件请求线IRQ6的软盘控制器(硬件)时调用此中断。
    调用寄存器:无
    返回寄存器:无
    注释:软盘控制器用Int 0Eh来检测磁盘传送操作是否完成。典型地,由于通
    过该中断可实现的操作可以通过其它的BIOS功能来实现,因而可以忽略该
    中断。大多数程序员都不使用这种中断。
使用硬件请求线IRQ7的内部打印机控制中断
调用寄存器:无
返回寄存器:无

原创粉丝点击