当今MS-Windows横扫大江南北让我们这就來研究一下它的祖宗——MS-DOS!
这本书很难得,希望读者好好学习!
DOS程序员干不了活手册(一)
(以下内容全部为原作者的阐述照样保留)
這个电子书只是很简单地把txt做成了chm,文本格式方面可能会让人看得有点恼火,呵不好意思了,将就一下因为我本身写网页是手工的,如果全部进行整理会花上几天时间希望您看的时候不会边看边骂
版社出版。未经出版科书面允许不得以任何方式复制或抄袭本书内容。
夲书封面贴有清华大学出版社激光防伪标签无标签者不得销售。
图书在版编目(CIP)数据
出版者:清华大学出版社(北京清华大学校内郵编100084)
印刷者:北京人民文学印刷厂
发行者:新华书店总店北京科技发行所
全面,覆盖了DOS的各个方面
本书的读者对象为对PC编程有兴趣的專业技术人员、大专院校学生及计算机爱好
译者序……………………………………………………………………………………………………… 1
引言………………………………………………………………………………………………… 2
第1章DOS简介………………………………………………………………………………………3
2.4内存………………………………………………………………………………………………24
2.6存储设備…………………………………………………………………………………………29
2.7软件………………………………………………………………………………………………31
2.8小 结………………………………………………………………………………………………34
第3章动态的DOS…………………………………………………………………………………35
3.2命令处理…………………………………………………………………………………………38
3.4一些高级语言的例子……………………………………………………………………………45
3.5中断………………………………………………………………………………………………48
3.6内存分配与管理…………………………………………………………………………………52
3.7小结………………………………………………………………………………………………55
第4章DOS和BIOS接口 ………………………………………………………………………56
4.2高级语言资源……………………………………………………………………………………59
4.3小结………………………………………………………………………………………………76
第5章输出设备………………………………………………………………………………………79
5.1基本的字符设备…………………………………………………………………………………79
5.3视频功能…………………………………………………………………………………………99
5.4打印机功能……………………………………………………………………………………106
5.5小结……………………………………………………………………………………………108
第6章输入设备……………………………………………………………………………………109
6.1键盘……………………………………………………………………………………………109
6.2鼠标……………………………………………………………………………………………125
6.3小 结……………………………………………………………………………………………130
第7章串行设备……………………………………………………………………………………131
7.1串行接ロ………………………………………………………………………………………132
7.2 串行转换:UART……………………-…………………………………………………… 134
7.3将通信端口初始化……………………………………………………………………………140
7.4调制解调器……………………………………………………………………………………142
7.5编写一个终端程序……………………………………………………………………………143
7.11小结……………………………………………………………………………………………155
第8章磁盘…………………………………………………………………………………………159
8.1磁盘的内部结构…………………………………………………………………………… 159
8.2利用磁盤功能…………………………………………………………………………………172
8.3小结……………………………………………………………………………………………183
第9章目录和文件…………………………………………………………………………………184
9.1磁盘目录……………………………………………………………………………………184
9.2什么是文件……………………………………………………………………………………191
9.3 DOS处理文件的方式…………………………………………………………………………191
9.4小结……………………………………………………………………………………………199
第10章程序和内存管理…………………………………………………………………………203
10.1内存的工莋方式………………………………………………………………………………204
10.2内存管理………………………………………………………………………………………207
10.3扩充内存………………………………………………………………………………………211
10.4扩展内存…………………………………………………………………………………… 217
10.5程序执行………………………………………………………………………………………245
10.6内存常驻软件的编程…………………………………………………………………………254
10.7小结……………………………………………………………………………………………256
第11章中断处理程序……………………………………………………………………………257
11.1什么是中断……………………………………………………………………………………257
11.2中断的工作方式………………………………………………………………………………259
第12章设备驱动程序………………………………………………………………………… 304
第13章其它杂项功能……………………………………………………………………………336
第14章参考手册概述……………………………………………………………………………353
苐15章BIOS参考手册……………………………………………………………………………371
第16章DOS参考手册……………………………………………………………………………470
第17章鼠标参考手册……………………………………………………………………………649
第18章EMS参考手册……………………………………………………………………………682
第19章XMS参考手册……………………………………………………………………………721
第20章DPMI参栲手册…………………………………………………………………………731
第21章任务切换参考手册………………………………………………………………………780
附录A ASCII字符集………………………………………………………………………………799
附录B 选中的内存位置……………………………………………………………………………806
附录C 一种标准的TSR标识技术………………………………………………………………811
附录D 保留嘚DOS功能…………………………………………………………………………816
附录E 支持资源清单………………………………………………………………………………856
目,内容完整解释清楚,在介绍DOS编程技术的书籍中本书是多年来最有影响、最受欢
DOS是整个PC机的技术基础,即使是箌今天在Windows 3.1广为流行,乃至Win-
Windows NT都离不开DOS的基础性、概念性支持。虽然DOS是一个单用户的操作系
统但所有上述的多任务操作系统都是从DOS上發展起来的,并且尽可能地与DOS保持
兼容才能被用户接受。用户使用计算机必须先从DOS学习起,具备了DOS的初步知识
人无论是学生或计算機爱好者,都得从DOS开始更不要说是开始学习C 、BASIC、Pas-
cal,特别是学习汇编语言编程的人们即使是PC编程高手,首先也必须具备完整而深入
正是茬这样的背景下我们在清华大学出版社的全力支持下,组织翻译了这本《DOS
程序员干不了活参考手册》原书已到第四版,但在国内却是艏次介绍与Microsoft公司为DOS
软件而准备的《程序员干不了活技术参考手册》相比,这本书内容更丰富、完整、更易于使用
全书共分五个部分及伍个附录。第一至四部分是以技术专题方式对DOS编程的各个
方面进行了论述并以大量的C/C++、Pascal、BASIC及汇编语言实例,使读者不仅可以
从理论仩学习DOS编程的知识而且可通过实例,立即构造出自己的实用程序其中,第
一部分可以说是一些预备性的知识介绍了DOS的历史、DOS的结构、DOS所运行的硬
件技术基础,以及提供给程序员干不了活的DOS和BIOS编程接口本部分通过实例说明,要用好
DOS使编出的程序效率更高,必须选择恏适当的编程及层次;在C/C++、Pascal、BA-
SIC中都可以充分地利用DOS和BIOS提供的资源。
第二部分介绍DOS的外部设备编程技术其中输入设备有键盘和鼠标;输出设备有
字符设备、显示器、打印机等。另外还重点介绍了串行设备作者在这一部分里所介绍的
知识很有特色,且不局限于DOS范围洏是从编程者的需要出发,从各个层次上对输入
输出设备进行编程且理论与实践并举。
第三部分介绍了DOS的磁盘、文件及目录管理和程序員干不了活对其编程时所应具备的技术
及知识这一部分是DOS的重点,也是DOS程序员干不了活最常使用的功能本书的这一部分,
内容详尽實例也很有针对性。
第四部分介绍了DOS编程技术的三个较难的专题:内存管理、中断处理程序及设备
处理程序 Microsoft技术手册在这几个技术专题嘚介绍上过于简单,而本书则尽可能地
将所涉及的知识(无论是已公开的还是未公开的)介绍给读者并给出了一些很有价值的
实例。但從译者角度看所讲内容仍不够全面,有关这几个专题的内容读者不妨参看清华
大学出版社出版的Addsion- Wesley的书籍《未公开的DOS核心技术》。
第五蔀分是本书最具特色的内容也是它区别于其它DOS程序员干不了活参考书籍的地方。
这一部分的篇幅较大比Microsoft的参考手册所提供的知识要丰富得多。在内容上它
每个功能调用的介绍内容中,尽可能地把所涉及的知识、禁止及注意事项介绍给了读者
它的注释部分确实是独一無二的。
本书的内容都是最新的本书的所有功能调用都已更新到了MS- DOS 6。不仅如此
本书对每一个功能调用,都作了版本上的说明及在各个蝂本下的使用注意事项因此,本
书完全可以作为任何一个DOS版本的技术参考手册而且由于有了第五部分的内容,读
者在进行PC编程时所涉及的技术,都可以在这里找到像这样把BIOS、DOS、EMS、
XMS及DPMI都融于一体的书籍,确实给读者提供了方便因为其中有些内容,一般程序
就像书名所表达的那样本书是为DOS程序员干不了活准备的。但是由于PC机的特点由于
DOS是PC机上各种软件的基础,因此本书为所有在PC上进行编程的计算機专业人员、
大专院校学生及计算机爱好者都能提供方便
这是一本在翻译上有较大难度的书籍,因为本书所涉及的知识非常丰富由于笁作量
关系,虽经我们做了巨大努力书中仍难免有误,欢迎读者指正
参加本书的翻译及审校工作的有熊桂喜、陆益民、黎军英、田子鈞、蒋华、陈石、陈清
等。此外还有其它同志为本书的翻译工作提供过宝贵的意见在此一并致谢。
1994年12月于北京航空航天大学计算机系
欢迎使用《DOS程序员干不了活参考手册》第四版编写本书的目的有两个。首先我们想向人
们解释清楚:在DOS级上的程序如何使用DOS、BIOS以及其它能帮助编程的相关功能。
其次我们也想鼓励使用高级语言的程序员干不了活使用DOS功能来扩展他们对PC系统的控
大多数谈及DOS和BIOS编程的书籍,嘟把重点放在汇编语言上虽然也有少量的
书籍讨论了从高级语言中使用DOS功能的内容,但大多数也只涉及皮毛实际上是很难
作为参考手冊来使用的。《DOS程序员干不了活参考手册》第四版一书通过大量的实例,希望能帮
助读者在程序中充分地发掘出使用DOS或BIOS功能的潜力我們的目的就是,当读者
进行编程工作时本书能实实在在地摆在计算机旁,助你一臂之力而不仅仅是放在书架
为了使本书能对读者发挥絀最大的作用,我们充分地考虑到了谈及内容的深度和广
度做到了读者能任意从某个具体的编程主题开始。本来整本那可由介绍众多編程主题
和技巧的内容组成,但是本书并没有对每个专题都穷追不舍,而是给出一个开始点然后
给出足够的参考信息,让读者自己一步步地深入下去书中的内容提供了各种所需的基础
知识,利用这些知识读者自己就能进一步地编写出功能强大而富有活力的程序。
本書讨论了BIOS和DOS功能可应用到的各个主要领域书中的讨论和实例,能有
助于初学者了解到如何使用这些功能;对于高级程序员干不了活则提供了更进一步的方法,让他
们去组织所了解的内容只要可能,任何时候我们都强调搞清楚为什么要这么用的道理
像本书这样题材的書籍,只有提供了尽可能详尽的参考资料才能对程序员干不了活真正有
用。本书的最后一大部分一个功能一个功能地详细列出了所有嘚DOS和BIOS功能(包
括许多未曾公开的功能)。对每个功能都对它提供了信息进行总结,并提供了对寄存器要
求的详细信息在本手册中这一蔀分所列出的信息,对任何DOS程序员干不了活都是很有用的无
论他工作时使用的是汇编语言,还是BASIC、C或Pascal
本书另一个有意义之处就是其中嘚内容都是最新的。书中所列功能的版本已覆盖了
MS-DOS6还包括了有关扩展内存驱动程序、扩充内存驱动程序以及鼠标驱动程序的内
容。其Φ还有一些与硬件有关的章节介绍了如何识别所使用的CPU芯片的类型,有什
么样的协处理器、系统当前使用的是何种显示卡等
本书在第㈣版中增加了一些以往版本所不具备的内容。除了对使用功能按照最新信
息进行了更新外整个参考手册部分中的内容更加充实和完善,能够让读者尽快地获得所
需的内容我们相信,仅仅通过这部分所增加的内容就会让读者受益匪浅。
有时有关未公开功能的内容是不唍整或不准确的,但我们在本书中仍介绍了这方面
的内容因为程序员干不了活在编程时需要全面地了解DOS和BIOS的知识,而仅靠已公开的内
容尚不能完全做到这一点但使用这些未公开的特性是有风险的,因为它们未公开因而
不能担保在所有的DOS版本下都能正常地工作。其中有些特性甚至有可能在某些版本中
编写本书的目的和指导思想就是向读者显示如何在相应的层次上对DOS系统进行
编程。我们讨论了各种可用嘚功能但并不是在任何地方都必须用汇编语言来使用这些功
能。而某些编程任务又必须用汇编语言才能有效地完成(事实上,有些任務甚至必须通
过直接进入硬件层才能完成即使DOS和BIOS服务有时也不能令人满意)。但是尽可
能地在最高层上工作,肯定是有好处的书中巳提供了决定使用何种层次来编程的知识。
书中给出的例子其方向是在高级语言中如何与DOS和BIOS例程打交道。尽管使
用汇编语言最简练但峩们不推荐这么做。通过强调在C/C++、Pascal、BASIC中也能有
效地使用这些例程我们希望能使这些技术获得广泛的应用。
如果你是一个对在DOS上工作感兴趣的程序员干不了活并且希望提高程序的效率,那么本
书一定适合于你本书涉及DOS编程的各个层次,从高级编程语言服务到BIOS中断
夲书的读者应该是熟悉C/C++、Pascal、BASIC的程序员干不了活,对汇编语言也应有一定
了解我们假定你至少熟悉一种编程语言,对其它语言也有兴趣并且熟悉MS-DOS以及
它的变种一DOS的IBM版本。
我们还假定你希望提高自己的程序的速度或想访问编程语言中不能提供的一些功
能,而通过DOS和BIOS功能便能得到这些功能本书给出了许多高级程序技巧,除了汇
编语言外在高级语言中也能随意地使用各类技巧。
尽管某些特定技术只能茬特定编程语言中才能说明但是,我们真正感兴趣的是技
术而不是语言。在掌握了如何使用某项技术后无论是在C/C++、Pascal、BASIC或汇
编语訁中,都能使用它事实上,任何编程语言都能访问DOS或BIOS中断
本书是为C/C++、Pascal、BASIC程序员干不了活编写的。书中也给出了一点使用汇编语訁
来编程的知识但没有作深入的解释。如果读者想深入地了解汇编语言可以参见Que出
书中的例子是用汇编语言、C/C++、Pascal和BASIC写成的,并嶊荐尽量使用C/
C++我们尽可能地把例子讲述清楚,而不要求读者具备很强的背景知识所给出的程
序清单有助于读者实际使用好DOS和BIOS功能。
本书分成五个部分对了解DOS的基础编程知识感兴趣的读者可从第一部分开始。
而对各个专门方面的编程知识感兴趣的读者则可以参看第二、三和四部分。而对许多高
级程序员干不了活来说只需要一个快速的参考手册,这部分内容位于第五部分
在第一部分“DOS简介”嘚四章内容中,对DOS的基本内容作了简要介绍第一部分
首先对DOS系统的历史和DOS的工作方式,无论是静态的还是动态的都简单地浏览了
一遍。接下来介绍了在DOS级编程的基本原则,并介绍了在工作时可以使用的编程语言
资源最后,本部分还探讨了在DOS级编程的“细节”知识
苐二部分,“字符设备和串行设备”中第5章和第6章讨论了输出设备(显示器和打印
机)及输入设备(键盘和鼠标)。第7章介绍了串行输叺和输出设备;同时还讨论了
第三部分“磁盘、目录和文件”含有两章内容第8章讨论了磁盘分区表、引导记录和
文件分配表(FAT),还讨論了DOS的磁盘功能第9章则讨论了根目录、目录项、子目录
和卷标等内容。第9章还解释了通过DOS来处理文件的方式在讨论中同时涉及了所使
鼡的文件控制块(FCB)和句柄功能。
第四部分“内存管理和杂项主题”讨论了程序内存管理(第10章)、中断处理程序(第
11章)和设备驱动程序(第12章)第13章“杂项功能”则介绍了设备信息和扩展的错误
第二、三、四部分的各章在阐述各个专题时,还给出了一些实际例子读鍺可以使用这
些例子来构成自己的库函数。
第五部分是一个完整的参考手册集在本部分里,我们在编排上作了精心安排以便
给读者在使用查阅时提供方便。 DOS及BIOS服务都按功能号的数字顺序给出每一功
能都以标准的参考手册格式列出,并在各个功能的注释中给出了注意事項和使用限制除
了BIOS和标准的DOS功能外,第五部分还包括有鼠标功能(DOS Int 33h)、扩充内存
在本书的最后给出了五个附录提供了一些其它信息。附录A包含有ASCII字符集;
附录B给出了一个选择的内存位置表;附录C给出了一个TSR接口的标准;附录D讨论
了各种未公开的DOS功能其中包括两个探讨性的实例程序;附录E是一个其它书籍的
如果你已做了很长时间的编程工作,就会明白:仅仅将程序代码敲入计算机并保证它
无错误也会消耗大量的时间。这样的经验同样适用于本书中的程序代码尽管读者可以
将书中所包含的程序全部敲入机器中,但完成此工作也得耗费幾天的时光而要改正敲入
的错误,则又会花费更长的时间如果读者时间富裕,那就没什么好说的;否则可考虑购
买本书所配的程序附盘,寄出所需费用或与Discovery Computing公司联系。其地址和
为本书作过贡献的人们心中只有一个目标:让本书成为一本最好的DOS程序员干不了活
参考掱册。在本书出版后书中错误仍在所难免。如果发现了任何错误和疏漏之处可用
各种方式告知我们,以便在下一个版本中更正过来使之更完善。既可以直接给Que公司
写信也可以与本书的作者直接联系,地址如下:
在进一步阅读本书之前首先要清楚什么是DOS。本章首先扼要地介绍DOS操作系
统再简短地介绍操作系统的历史,以说明DOS产生的历史渊源本章的内容还将涉及
DOS结构及接口。因为这是一个非常粗略嘚介绍所以不要关注一些尚不清楚的术语,因
为在本章之后的其它各章还会对其进行更详细的解释
DOS由四个基本模块组成:
·引导记录(The boot record)此记录起始于每个磁盘的0道、0扇区、第1面上,
是由DOS FORMAT命令格式化磁盘时放入的对于硬盘,引导记录位于DOS分
区的第一个扇区内这个需偠一个扇区空间的记录,标识了该磁盘并含有用于引
导该磁盘的初始化程序。
· BIOS 基本输入/输出系统(BIOS)是存放在ROM中的这个面向物理設备的
低层接口,使得各种软件可以透明地使用各种变幻莫测的硬件设备对于DOS它
也通过从磁盘中调入I/O来扩展其功能。
· DOS程序 DOS是通过两個程序来实现的一个是O/I系统,它是从磁盘中调
入的接口模块用来扩展ROM BIOS的功能,并包含有标准的设备驱动程序集
另一个文件是磁盘操作系统(DOS),它是一个所有运行在计算机上的程序的高层
接口而不管该程序是否使用磁盘。
处理程序是人们工作在该系统下运行DOS服务嘚标准界面它产生命令提示符
(C>),接收命令并执行用户向系统请求执行的各项任务。
各个模块将在第2章“DOS系统结构”和第3章“动態的DOS” 中详细介绍然而我们
在这里还是作些基本的介绍。
BIOS提供了一系列功能程序员干不了活可以利用这些功能来完成各种操作而不必關心底层
硬件的细节。在本书中我们将利用BIOS来执行各种实例程序里的必需操作。在本书第
五部分“参考手册”中按顺序详细介绍了BIOS中烸个功能的作用。
虽然BIOS功能非常强但它离完整性还差得很远。建立在BIOS基础上的DOS平
台为编程者提供了很多必要的服务。在通用的操作系統(如DOS)成为现实之前的早期
个人计算机上程序员干不了活所写的程序中,常常包含有与DOS功能等同的内容因此,跟踪应
用程序的过程也是非常复杂和可怕的。
由于DOS功能的编程已由Microsoft(和其它厂商)完成DOS已成为读者在程序开
发中的伙伴。虽然不能认为DOS中的一切都工作得非常正确而不会出错但可以假定
DOS是坚实的(除非有其它已证实的理由)。第五部分则包含了各种DOS功能的一项一
多少年以来DOS一直被当作微型计算机的最原始的操作系统。今天的DOS所拥有
的用户数比任何其它操作系统要多得多。它已变得非常复杂是一个带有各种工具和应鼡
程序来满足各种需要的操作环境。
DOS富有远见卓识之处就在于它能处理各种复杂的微处理器的复杂特性,如80386
和80486等将来的DOS版本,甚至可鉯处理多任务支持多用户,尽管Microsoft公司还
没有明确地提供这方面的信息一些人可能会对此心存疑问,特别是出现了新一代操作系
DOS的最原始程序是由Tim Paterson编写的它开始于1980年8月,第一个产品诞生于
该年的8月那时,Digited Research的CP/M操作系统在微机操作系统领域有着广泛的
应用86-DOS的一个特殊设计是CP/M的应用程序很容易转换过来,它保留了同样的文
件控制块结构和功能因此,可以自动地将CP/M的程序转换到86—DOS上
因为86-DOS只能工莋在1980年刚上市的 CPU芯片上,所以很少有人知
道它的存在但那些已经从8位的8088/Z80标准和CP/M系统升级到s-100系统的人
个多客户的市场基础,其中至少还包括一两个硬件制造广商与此同时,Microsoft公司也
在与SCP公司接触要他们为一个未知的公司研制一个新的版本。而在当时没有人(除
Microsoft公司外)知道,IBM也在寻找一种操作系统在1981年1月,Paterson知道了那
个客户的名字并且Microsoft公司已经将从86-DOS分离出的版本注册在他们自己的名
几个月,他按照IBM嘚需要进一步裁剪了该系统。
(少于10万美元)购买了86-DOS的全部版权以后,SCP公司对此交易提出过起诉最后
法院判决Microsoft支付了数百万美元嘚补偿。其结果是Microsoft公司毫无异议地永远
拥有了最流行的操作系统的版权
语,以后IBM版本也都简称为DOS)
Paterson在1982年结束了直接参与DOS工作的生涯,泹他仍活跃在PC舞台上最
在PC原始版本发布后,DOS在一些市场中还没有成为主流 IBM还选择了CP/M-
86和Softech的P-system作为PC的可选系统。然而卖主很少代理这些產品,也很少有
可以在这些操作系统上使用的开发语言此时,Microsoft已经在编程语言方面也获得了
良好声誉IBM用DOS发布自己的软件,开发者就迅速捡起这个从未停止过转动的球开
发出了新的功能。 CP/M-86和P-system也从来没有脱离PC市场它也一直在参与着市
DOS已经正式修改过很多次(并且┅直还有许多版本并非是为通用系统而设计的),
尽管每次发展总包含一些改进和错误纠正但实际上每次版本都对应着一些硬件的改变
—其中的一种就是磁盘格式和容量的改变。
表1.1列出了正式公布的主要DOS版本(按日期)和主要的改进本表中还未包含那
表1.1 DOS的各种版本
蝂本 日期 硬件或操作系统上的更新
1.1 1982.3 双面磁盘,日期时间印记
3.2 1985.12 扩充支持新的介质
4.0 1988.6 支持大于32M的硬盘驱动器。 EMS内存性能的集成支歭
6.0 1993.3 支持磁盘的压缩,碎片去除改进的CONFIG.SYS结构,
综合表1.1可以看出每个新DOS版本的性能提高和其所需的内存量总是相对应
的。DOSV1.0可存在於16K内存之下原始的IBMPC只允许使用64K内存。版本2至
少需要24K内存(如果安装设备驱动程序的话还需要更多的内存)。任何可用的程序至
少需要128K嘚最小内存作为版本3,DOS需要36K内存(如果安装设备驱动程序和文
件外壳的话所需更多),机器如果少于512K内存几乎不能使用了对于版本4, 512K變
成必需的内存,并且640K以上内存(扩展内存和扩充内存详见第2章)利用变成了现
实。因为内存紧张DOS5.0提供了将DOS调入高位内存的方法,這样它看上去便比
DOS 4少用了传统的常规内存,但它使用了更多的高内存区最后,DOS6是一个最强大
的DOS版本但它提供了一个改进的内存管理方法,使得已经安装的内存能发挥出最大
让我们了解一下每个DOS版本所包含的改变之处在这本书中,我们有一些约定如
V1,表示的是版本1但也包括V1的子版本;而v1.n表示v1版本的子版本n。
DOS V1.0是支持PC的最原始系统它支持基本的单面、8个扇区(8-sector磁盘格
式,并且提供了所有基本的磁盤服务主要的改变(相对cp/M而言)是,它包括了支持磁
盘目录结构、管理文件属性及文件大小的功能版本1.0还加入了比原始86-DOS改进的
磁盤分配和管理功能,更好的操作系统服务程序以及启动初始化时执行AUTOEXEC
.BAT批处理文件的功能IBM只是向生产厂家发放此版本。有趣的是这个DOS版夲没
有包括文件的日期和时间印记,这也是它和以后DOS版本的一个主要区别
在版本V1.1(最后一个只属于IBM的版本),加入了日期、时间印记并且加入了支
持双面磁盘的驱动程序,还有一些错误更正它发布于1982年3月。
· V1.25是第一个非IBM的而由原始设备制造厂商(OEM)发布的版本(版本号从
1.1跳到1.25对应了IBM版本号和Tim Paterson个人修订控制系统版本的不同,IBM
V1.1就是众所周知的版本V1.24)在这个版本中加入了VERIFY功能,即加入00h作为
目录結束标志字节(IBM的版本到2.0才出现了该功能)
V1离统一的标准还差得很远;Microsoft不直接向最终用户销售该产品,而是授权给
OEM厂商由它们任意修妀,甚至可以更名(例如Heath-Zenith公司在1982年3月将它
改为ZDOS,成为第一个非IBM使用的DOS)
在DOS V2.0中,增加了支持双面和单面9扇区格式的软盘、硬盘和在pcjr下使鼡
磁带的功能 DOS的服务程序也大大改善了。这个版本还加入了类似UNIX的分层式结
构的文件系统下面列出了DOS V2.0中的一些主要改进之处:
·筛选程序(或称为滤符程序)
·ANSI显示驱动程序
·支持用户自定义的命令处理程序
和V1一样,V2也授权给做了改变的OEM厂商在这个时候,大多数OEM厂商知
道为了市场因素要接近或全部和IBM的机器兼容,因此改变就很小。一些公司像
Tandy公司的2000型号(它是第一个使用MS-DOS V2.0的机器)是到目前为圵修改
DOS最多的厂家,在其BIOS中提供双重的向量来和IBM BIOS保持兼容
在版本2中,版本相同但来自不同的OEM厂商的不同版本还可以发现一些不同之
处。几乎所有V2版本都存在这种情况
在2.1版中,只增加了对时钟的改变以便更加适合于IBM的PC杠和便携式PC机
的需要。 MS-DOS的这一版本如已知的2.11蝂,现仅在少量机器上出现过如东芝的
便携式组合设备,就已经将V2.11固化于ROM中
这个版本增加了支持高密度(1.2M)软盘和附加的硬盘格式,增加了支持网络磁盘功能的
技术基础下面列出了主要的新特性:
.应用程序控制的假脱机打印
尽管IBM和Microsoft版本到今天还有些不同,但V3的公咘标志着OEM厂商自由
更改DOS结构的结束例如,对于IBM它提供的支持实用程序都作为COM文件,而Mi-
crosoft则是以EXE格式来支持而在众多的编码中,则很少囿明显的区别
然而,对网络操作支持就非常有必要在DOS结构上,特别是在内部数据格式上执行
严格的统一标准OEM合同也按照这个要求进荇了修改。从这个时候开始DOS的关键
部分基本上稳定了下来,这使得以前没有支持的开发者现在有了技术上的支持,开发就
DOS 3.1增加了网絡磁盘包括支持文件共享,并修正了一些错误这个版本在一段
时间内,已经成为销售商的标准
3.2版增加了支持3.5英寸软盘的功能。它還将格式化控制集成到外围设备驱动程
序中3.2版是Microsoft以其自己的名字出售给最终用户的第一个版本。
在DOS3.3中增加了两个新的用户命令(ULSFUNC和FASTOPEN)和两个新的
功能,升级了很多其它服务程序设备支持也覆盖到了IBM PS/2系列。该版本有影响的
地方是DOS的管理和开发工作,从Microsoft转到了IBM以解放Microsoft,使之专心致
致地开发iBM的OS/2源程序(作为交易的一部分IBM把自己的OS/2开发权转让给了
Microsoft)。两个公司都继续公布和支持其特有的产品版本
在DOS 4.0版本中,扩充了很多用户命令增加了许多功能,并且指出了图形用户外
壳程序然而,最主要的改变是增加了支持超过32M容量的硬盤驱动器并且将扩充内存
(expanded memory)驱动程序作为DOS的一个标准部分。(这些特性在那时已被作为附加
两个月以后IBM发布了升级的版本4.0—在磁盤卷标上标识为V4.01—该版
本更正了一些错误,而VER命令仍然标识该版本为4.0只有通过查看两个隐含文件和
SHARE.EXE文件的日期和时间区分这两个版夲。4.01版所标明的日期为08/03/88或
更晚而4.0版的日期06/17/88。 Microsoft延迟一段时间后也发布了它自己的4.0版,
其4.0版等效于IBM的4.01版过了不久,Microsoft又发布了进一步修正其错误的4.01
在DOS5.0版中增加了支持扩展内存(extended memory)的功能,改进了很多用户
命令增加了一些新的用户命令,主要的有UNDELETE、UNFORMAT、MIRROR以及鼠
标响應全屏幕文本编辑器等,增加了在外壳程序中支持的任务切换器API(应用程序接
口) DOS核心已重新构造,第一次使得DOS减少了空间另外,DOS現在可以运行在
ROM中只有使用SHARE命令才能安全地支持超过32M DOS分区的要求,也已不再是
DOS 6.0版在1993年3月发布主要改变在于为操作系统增加了很多实鼡程序。例
如新增加了如下几个很有用的实用程序:
下,保护系统免受已知病毒的侵犯 Anti-Virus也可增加新病毒的有关信息。
· Deleted file recovery(删除文件恢複)这个实用程序可以恢复被误删除的文
件与第三方产品不同的是,UNDELETE为用户提供了三个层次的安全服务
在使用压缩过的文件时,又对其解压缩
· File backup(文件备份) 该实用程序是经过改进的Backup,由菜单驱动该实
用程序可将硬盘数据拷到软盘做备份工作。在DOS和Windows下都可以运行
.BAT文件来优化使用内存的实用程序。
另外其它一些DOS实用程序也做了改进。CONFIG.SYS文件结构也被改成可以有
多个启动序列例如,可以有一个特殊的配置用于支持使用CD-ROM另一个配置用于支
持磁带驱动程序。 DOS在每次启动时便会询问用户选择哪一个启动序列
对程序员干不了活来说,DOS繼续发展将使新的服务和选项成为可能。像Microsoft Windows
和DESQview这样的窗口环境的出现已经为还在DOS层次编程的程序员干不了活提供了新的更
复杂的服务功能。每增加一个新的服务就可能使更多的机器硬件代码从程序中隐去,同
时又为用户创造了新的功能这种不断增加的新功能,会导致牺牲程序的运行速度和响应
速度而造成了太高的代价。但是随着处理器速度的加快,对低层次进行的编程需求在不
断地减少应用程序将主要使用DOS的服务和它的类似物。只有系统级的程序员干不了活才需要
工作在DOS内部Windows或DESQView将不必担心去直接访问机器和它的服务。这就
昰未来技术发展的趋势
因为本书的目的是深入地探讨DOS和PC系统,因此应注意到系统的分层功能。图
1.1将有助于你理解这种层次的结构
設计整个DOS/PC系统的基本思想是一种“系统套系统”的设计途径。在系统的底
层是从电子电路开始的。例如正是带有一定功能和特点的电蕗(称为计算机)实现了
BIOS又用严格定义的功能和特性与此电路层组合成一体,形成了一个新的“计算机
系统”。BIOS层是通过具备了标准属性的设备来描述其特性的不管使用的是何种显示
器,也不管购买了何种键盘BIOS都认为它们的响应是相同的。总之所有BIOS的这些
特性,使嘚它有能力支持一个编程环境在这个环境中,人们开发出了DOS为使DOS和
各种厂家标准的BIOS之间的接口标准化,DOS设计者引入了一个缓冲层使鼡者通过它
来调用I/O系统。它经常被认为是BIOS的一部分然而,由于此I/O系统层是从磁盘装
入的它是DOS系统的一部分(并且会在需要时进行修改,以满足DOS的要求)技术上,
应将它看作是DOS整体的组成部分因为它们之间的关系比它与BIOS之间的关系更密
DOS环境仍定义的是一个计算机系统,但它是在一个更高层次上可以管理文件和
文件系统的语言在这个层次上被引入,语言就像是基于此设备一样在这个层次,DOS在
标准化的环境中集成了用户所需要操作的特性例如,不管使用的是Toshiba的还是
Maxtor的磁盘系统都将同样地对待它们。对在DOS上工作的程序详细的低层情况就
在下个层次(命令处理器)上,是另一个以与设备无关但能与设备交互为标志的计算
机系统,在这个层次上可以将设备和攵件按相同的方式处理,尽管DOS是按顺序执行
的但在命令处理器层,可以将结果直接输出到文件(正常情况下是输出到屏幕)。在这里
鈈必考虑各设备速度的差异和各设备之间的不同之处
再上一层是由应用程序定义的计算机系统。因为这个系统是面向用户而不是面向程
序员的所以这个接口更加简单。现在的“计算机语言”是由菜单选择和窗口组成的这一
层,和其它层一样也是建立在下一层次之上嘚。
当阅读本书或按个人的爱好跳过这些层次工作时,要留意跳过部分系统层次的得和
失因为DOS是建立在BIOS程序之上的,因此程序越过DOS 环境而直接到BIOS能影
响到DOS工作的方式。例如你可以在BIOS层用磁盘读和写功能来写一个自己的文件
处理程序。但如果这样做也许得花整年的時间来做和DOS一样的工作。反之你也可以
只停留在顶层,但更低的层次却可以让你的程序提高运行速度这是一个复杂性与速度的
交替过程,如何选择全在于程序员干不了活自己。
1.4 DOS的程序员干不了活接口
在高级语言工作的程序员干不了活习惯于工作在预定义的功能上。在BASIC中所有功能
(PRINT和INPUT)都是在语言中定义的,Pascal同样也定义了可以使用的各种标准功
能函数C和c++编译器带来了一个标准的库函数集合。对大多数人来说这些功能便
代表了此语言的功能。事实上在BASIC、c/c++和Pascal中提供的功能是基于更低层
次的DOS和BIOS功能的。语言的功能以标准嘚方式被写成对该服务所需的处理过程
在一些情况下,语言的功能被定义成和国家或国际标准兼容的功能然而,要完成该功能
必须將其直接对应于DOS、BIOS或硬件设备。
通常在高级语言功能层之下的功能领域是受保护的。因为高级语言功能是为很多不
能让“编程方式脱离紙袋”的人们通常使用而设计的这些功能必须提供错误检测和综合
情况的控制。综合是一个缓慢的过程因此就不得不牺牲速度。如果婲时间学习的话DOS
和BIOS服务程序可以在任何语言中被直接调用。
软件中断是使用DOS和BIOS服务程序的一种手段(第11章“中断处理”将讨论中
断。)在前文中软件中断被作为高级语言的子程序来调用。要设置所有参数并可得到结
果但是如果没有纯熟的使用高级语言功能的方法,僦很可能陷入困境
如果进入上述的高级语言功能,则得到的不光是它的错误检测控制能力和标准库的
可靠性,还可以得到的另一个优樾之处是它的可移植性。用标准的Microsoft C或Turbo
C所编写的C程序经常只需要经过一些小改动就可直接用在UNIX系统中。 DOS和
BIOS功能就不行但是可以建立自巳所需的错误检测和控制,而不需要像Microsoft或
Borland公司程序员干不了活要考虑的那样要适合整个市场的要求。
走进DOS和BIOS层将得到控制的深度和程序的速度,代价(一些很小的额外的编
程量)是很小的要想达到可能的最高速度,就需要直接存取硬件设备这样的操作常用
在像屏幕顯示器和串行口这样的设备上,而很少或不用在象磁盘这样的设备上
通常,对一个运行可靠、但速度较慢的程序可以通过进行在低层佽重新编写关键模
块或通过改变程序算法来加快程序的运行。在这本书中将提供在各个编程层次的工作的
正反两方面的内容。由使用者來决定哪个更合适于自己的应用但是,按照一般规则总
是先工作在尽可能高的层次上。当运行程序时就很容易发现错误。如果进入低层很多
细微的错误就很难发现。
IBM兼容系列计算机已经构造好了强大的BIOS和DOS功能 BIOS向外部世界提
供了低层接口;DOS提供高层次的服务功能来增强计算机程序的能力。和世界上大多数
操作系统一样每一个成功的DOS版本都为计算机应用建立了一个稳固的基础。
怎样开发程序使用什么语言,使用BIOS或DOS服务程序等等之类的选择主要是
由编程的需要来决定的。对所做的编程方式的选择一定要综合地权衡各种方式的得與
失。根据所考虑的选择方式和采取的各种策略便能找出最适合于使用者的计算机系统工
作的方式(而不是让它碍手碍脚)。本书的写莋宗旨就是基于这样的想法:积累使用者的编
程经验使它能充分地发挥出计算机的威力。
在第2章里我们将讨论DOS的结构,更贴近地探究┅下这个DOS建立于其上的软
件基础并看看它与所开发程序之间的关系。我们还将讨论到作为一个程序员干不了活,如何在
DOS环境下利用各种工具、资源和构件,构造出灵活舒适的软件大厦
DOS结构涉及硬件之上的整个机器。它不只是操作系统并且包括整个计算机。如果
想偠对使用什么功能或怎样使用它们作出最好的决定就必须了解DOS的结构。
认识DOS的一个有用的方法是将它看成是分布在子系统中的一种体系结构。该体
系中每层都提供了一个完整地定义的服务程序集合以使更高一层可以使用它。因此每
个层次都成了一个虚拟的机器,它便构成下一个更高层次的计算机图2.1说明了这个关
图2.1虚拟机器的层次结构
物理的机器或硬件,是该体系的最底层系统之间的很多区別就在于这一层。
围绕着机器常见的主要组成包括以下几个部分:
·在系统中相似的物理设备映象(换句话说,相似的指定中断和地址)。
·一个有限数量的总线设计。
DOS的一个主要目的就是隐藏各机器之间的差异,以便在编程和用户层都以标准的
方法来使用计算机提供的各种性能DOS成功地在各种IBM兼容计算机所选择的操作系
机器之间最大的差异就在硬件层,在这个层次一般会发现其“兼容性”是否真的兼容
当有重大的硬件差异时,在这个层次操作的程序就不能工作了
物理的计算机系统(见图2.2)可以分为几个主要部分:
·中央处理器(CPU),完成计算机系统的操作
·ROM和RAM,保留程序和数据
·输入通道,为计算机输送信息。
·输出通道,将信息送给用户。
·存储设备(软盘和硬盘),临时地或永久地保留数据。
图2.2基本计算机的框图
理解计算机系统的所有这些部分,对成功地开发出高质量的软件是很有必偠的特别
是使用DOS和BIOS尤为重要。下面将讨论这些部分
在PC或兼容机上使用的中央处理器(CPU)是Intel公司8086系列处理器芯片的成
在Intel系列中的每个芯爿,不仅有区别于已有芯片的特有功能而且也和早期版本保持
了兼容性。例如80386(SX或DX)就可以完成80286或8088可以完成的所有工作,并加
上了它洎己特有的功能
本书不详细研究芯片之间的特殊差异,但要知道DOS的主要版本是基于8086和
8088芯片的能力而设计的在讨论DOS、BIOS和编程时,所有例孓都是运行在8086或
8088上的(没有包括新芯片扩充的特有性能)在本书中,所有的引用都是针对8086的
但都适用于整个intel处理器系列。对DOS的一些新嘚附加和扩充需要不同CPU芯片
知识,我们在例子中将清楚地注明所需知识的类型
CPU是完成最简单操作的基本处理器。因为必须了解一些这個基本处理器的知识
所以这节提供了一个8086家族处理器的概述。如果读者已熟悉这个题目可以跳过此节。
如果要详细了解8086家族的编程請看本书最后的参考书目。
在本节的后面将讨论作为一个程序员干不了活可以存取的CPU寄存器。然而因为内存寻址
是在DOS层完成很多程序操作的基础,所以首先必须了解8086怎样对内存寻址让我们
一些程序员干不了活批评8086的分段内存寻址方式。内存分段限制着数据项的大小並且指
针结构也很复杂。然而分段式内存对于DOS程序员干不了活来说至今仍还存在。它对解决8086
的固有设计问题是一个明智的方法也是用8086嘚16位寄存器来表示乡8086的20位地
址值的最好的查找方式。 8086有20根地址线它允许在一个内存区域内有2的20次方(即
1048576或1M)字节的寻址能力,但它的寄存器只有16位宽(寄存器的使用将在本章后
面“8086寄存器集”一节中讨论)
解决这个问题的方法就是将整个内存地址分成可以在16位寄存器中被独立存储的
“片”。因此需要用两个寄存器来表示一个地址:一个寄存器存储基地址(或称作段地址),
另一个存储相对于基地址的偏移量该方法理论上可以寻址2的32次方(大于40亿字节)的连续
地址。但要实现这个寻址区间微处理器需要32条地址线,因此它大大地超过叻8086的
能力下面我们用例子说明该寻址区域是非常有用的。
图2.3示出了包含h()或2的32次方个单元的4千兆内存空间区域每
一行是一个区或段(segment),包含10000h(65536或2的16次方)个单元。在选定的每个段内的
地址时可以用相对于该段开始单元的偏移量表示,第一个单元的偏移量为0書写时,采
用段:偏移量(segment : offset)的形式来表示地址而且各地址值均采用十六进制形式。
第一段的最后一个字节(位于0000: FFFFh)后面紧跟的昰下一段的第一个字节
(位于(0001 : 0000h)。每个内存单元的绝对地址——即它的本来位置应从内存区的第
一个字节算起。它的计算公式如下:
实际地址=(段地址*段间隔)+偏移量
图2.3显示了这一计算过程当段间隔等于10000h(64K)时,段号便形成了8位绝对
地址的最高4位值类似地,偏移地址则可以当作绝对地址的最低4位值
实际上,基地址和绝对地址之间的关系并不像图2.3所显示的那样简单采用了先进
技术的硬件设备可以快速地处理地址转换,以取代人们从段和偏移量计算出绝对地址的
尽管通过这个例子对理解是有帮助的但它还留下了一个疑問:8086使用的是20位
(而非32位)地址。因此这个例子必须修改成实际的工作方式。Intel开发的寻址方式是
将段寄存器的内容当成是整个地址的高16位低4位指定为零。换句话说段寄存器包含
了20位绝对地址的高4位16进制数,并且最低位(最右边一位)为零再加上要计算的地
围2.3间隔徝为10000h字节的各内存段
(图中所有数字都为十六进制,除了后缀为“d” 的外它表示该数为十进制。)
址偏移量寄存器中的地址值就可得箌所要的绝对地址了。图2.4显示了Intel寻址方式
中怎样从段—偏移量地址得到绝对地址
图2.4如何计算一个绝对地址
现在,我们已有了基于8086内存寻址概念下面让我们再来讨论8086的寄存器集。
8086用段偏移量来寻址内存会导致一个反常现象;实际使用中的绝对地址可以以
多个组合方式来寻址。例如下面所有的段。偏移量对表示的地址都对应的是同一个绝对
所有这些分段式的地址都对应于同一个绝对地址:011000h注意,烸增加或减少此
地址的一个段位置会对应地增加或减少偏移量中的10h位置。正如所看到的那样内存
段可以用很多方式来覆盖。
8086系列使用叻14个独立的16位可组合的寄存器按用途分组,可分为四类:
表2.1列出了各个寄存器和它们的分类
SP 偏移量 堆栈指针
BP 偏移量 基地址指针
SI 偏移量 源索引地址
DI 偏移量 目的索引地址
IP 偏移量 指令指针
当面对各个寄存器时,你就明白了在硬件层是如何直接对CPU进行操作的要注意
的是,这些操作尽管都由汇编语言来完成但像BASIC、C和Pascal这样的高级语言也有
自己的方法来调用这些寄存器。(有关这方面的技术将在第4章“DOS和BIOS接口”中討
正如上面所提到的8086寄存器集可以按照使用目的,分成四类让我们对此分别介
通用寄存器,正如其名字所提示的用于存储最新结果戓其它临时需要的通用目的。
当使用DOS或BIOS功能时就需要用所需的值装入这些寄存器来完成各种功能。总要
在某个寄存器中包含一个值来对應指定的功能并按所需附加一些其它参数。当从DOS
或BIOS功能返回时程序中要使用的返回值也包含在寄存器中。
通用寄存器是AX、BX、CX和DX为了方便地使用8位或16位值,每个16位的寄存
器可以作为一对8位寄存器来寻址寄存器命名为AL、AH、BL、BH等,分别用来寻址低
8位或高8位(L和H分别指示低囷高)图2.5表示了各个寄存器之间的关系。
这些寄存器的使用非常广泛无论是使用汇编语言,还是使用高级语言只要调用访
问DOS或BIOS的唎程,都常用到它们
图2.5 16位的寄存器可以当作一对8位寄存器来寻址
段寄存器在8086的内存寻址方式中起着很重要的作用。它存储了16位代表64K内
存段的基地址的值读者可能回忆起来:这些值对应于20位基地址的高16位;低4位被
指定为零。 8086的内存寻址硬件将这些基地址和存储在CPU偏移量寄存器中的值进行
组合得到实际应访问的地址。
下面列出了所使用的各个段寄存器:
·CS(代码段)寄存器
·DS(数据段)寄存器
·ES(扩充段)寄存器
·SS(堆栈段)寄存器
每个段寄存器指示不同的段作为程序员干不了活,可以用所选的任何方法在一定范围内使用
这些段寄存器在第3章“动态的DOS” 中,读者将看到怎样编程以及怎样使用段寄存器
段寄存器是为用于以下工作场合而设计的:
· CS保存包含正在运行程序代码段的基地址。
· DS保存包含程序数据段的基地址
· ES是对DS寄存器的补充,用于保存“扩充”段的基地址经常用于数据。
·SS保存程序堆栈的基地址用来临时存放数据。
前面提到的使用段寄存器的限制包括对使用CS和SS寄存器的限制为了便于操
作,8086期望CS寄存器永远指向囸在运行程序的代码段同样SS寄存器永远指向当前
的堆栈段(对8086操作是必须的)。
8086系列的处理器用一个名叫堆栈的结构来跟踪函数调用和其它操作中产生的信
息每当一个子程序被调用时,处理器将各寄存器推入堆栈(PUSH操作)当从子程序返
回时,又将它们弹出(POP操作)烸次PUSH应将堆栈指针指向前一个低地址;POP则恢
复这个“移动的”指针。这些在SP上的操作是86芯片系列内置的操作并且不能被改变;
事实上,囸如编程所希望的SP总是被初始化为指向堆栈存储空间的栈顶而不是栈底。
程序员干不了活使用堆栈来存放计算的中间结果或者向子程序传送参数值。各种编程语言为
同样的目的而广泛地使用了堆栈
堆栈的工作很像自助餐馆的盘子堆,当一个项目加入到(PUSH进)堆上时堆会变
大。当东西拿走时(POP出)最后一个加入堆的项目被第一个弹出。这个结构被称为是后
进先出(LIFO)结构
偏移量寄存器,正如其名芓所表示的那样一般用来作为内存地址的偏移量部分。地
址的段部分一般存在段寄存器中
因为地址被分成段寄存器和偏移量寄存器两蔀分,所以每个偏移量寄存器被隐含地
和指定的包含地址“其它”部分的段寄存器配对这种配对是自动的,除非用特定的命令取
在以下列表中给出了5个偏移量寄存器和隐含的段寄存器之间的配对关系:
·SP(堆栈指针)寄存器(和SS配对)
·BN(基础指针)寄存器(和SS配对)
·SI(源索引)寄存器(和DS配对)
·DI(目的索引)寄存器(和DS配对)
·IP(指令指针)寄存器(和CS配对)
根据这组寄存器在一般情况下所起的莋用,可以将它们分成两类:指针寄存器和索引
指针寄存器提供了一个在段中读取数值的常规方法 SP永远指向当前堆栈的顶部,
并且自动哋被各种汇编语言指令修改其它指针寄存器,特别是BP常在索引操作中用来
作为基本的(或参考)指针。例如一些程序用BP指向堆栈中嘚一个固定位置。这个位置
以后可作为恢复子程序调用前放在堆栈中的变量的参考指针在高级语言编译器中,BP
寄存器的使用便具备了存取参数的标准含意
指令指针(IP)保留下一条将被CPU执行的指令的地址偏移量。当IP和代码段(CS)
寄存器结合时它们指向指令的绝对地址(CS : IP寄存器对永远用于这个用途)。IP的值
在每个指令从当前的代码段取出后由CPU自动地增加。
索引寄存器SI和DI是特定的偏移量寄存器。特别昰当SI和DI与DS和ES段寄存-
器合用时例如,在字符串操作时将使用DS:SI指向源串的地址,ES:DI指向目的串
在非串操作中,程序员干不了活通常用SI囷DI作为源操作数和目的数据的索引(偏移量)正象其
8086标志寄存器使用16位中的9位作为标志,表示处理器的状态或控制处理器的
操作方式這些标志被分为两类:状态标志和控制标志。列出如下:
·AF(辅助进位标志)
这些标志报告最后一个被运行的指令的状态例如,如果最後一条指令产生的值是
零则零标志就被设置。状态标志的设置和清除是自动的但程序也可以设置和清除标志。
很多DOS和BIOS程序就使用进位標志来指示错误
方向标志控制着8086的指令在内存拷贝的区域内指定方向。跟踪标志将CPU置成
“单步”方式(调试器用来控制程序的执行)Φ断标志允许或禁止硬件中断响应。
2.3.3 80286及其更高档的处理器
从80286开始使打破由分段式结构设置的1M内存的限制成为可能。
CPU可以在实地址方式下运行即运行与8086和8088的能力一样的程序。程序员干不了活可以
在实地址方式下编程也可以在保护模式下编程。
在保护模式下建立了┅个描述符表。这些表包括以前段寄存器信息——段的基地
址同时加上一些信息,如是否可以被写入这个段的信息。段寄器则是现在嘚段选择符
在80286保护模式中,一个描述符表项包含有24位基地址当80286在保护模式下
运行时,它可以存取多达16M的内存
80386和80486继续扩充了内存寻址能力。像80286一样它们可以在保护模式下编
程;然而,现在的描述表项有32位基地址它允许寻址多达40亿字节(46字节)的内存。
为适应这个寻址能力的跳跃通用、偏移量和标志寄存器现在也有了32位版本:EAX、
然存在,只是作为32位寄存器的低16位
不仅CPU可以存取4G字节的内存,一个段吔可以扩充到全部4G内存中事实上现
在32位结构可以和16位结构一样容易处理,在DOS环境中的8- 特定软件
已经形成了市场其中包括两个相互竞争嘚保护模式环境。 DOS保护模式接口(DPMI)和
虚拟控制程序接口(VCPI)
另外,还有一个DOS扩充程序该程序允许专门针对8的软件,在允许
存取实地址模式下DOS和BIOS功能的同时在保护模式下进行操作。 DOS扩充程序允
许应用程序在使用CPU的32位扩充能力的同时仍能使用DOS和BIOS提供的服务。这
类程序瑺常比用等同的16位并且对DOS内存没有强制限制开发出的程序运行得要快
要使用80286、80386和80486 CPU的扩充功能,软件必须知道它运行在其中一个芯
片上並且要知道在什么芯片上运行。有三种解决确定当前芯片问题的方法第一种解决
方法是基于80386和80486在加电时用DH寄存器的10(标志)字节(3或4)來区分,它是
什么芯片第二种方法是询问用户,他使用的是哪种芯片第三种方法是从已知的芯片之
间的差异来推断出所使用的芯片是哪一种。
第一种方法必须包含有已重编程的BIOS芯片它超出了大多数程序员干不了活的能力,对用
户而言则更是苛刻它也不能区分80286到8086之间嘚芯片。第二种方法假设用户知道
其机器是什么CPU;在很多情况下这种假设是无效的。第三种方法需要做的工作比第二
种多但比第一种尐,并且是可靠的
列表2.1中的编码演示了怎样确定当前的CPU。它首先测试8088、8086和80286及
其之上芯片的不同之处在8088中,一个值被推进堆栈后堆棧指针在写入堆栈之前减
少。从80286开始则是先写值,然后堆栈指针再减少通过压入堆栈指针,可以检查写入
堆栈的值来确定堆栈指针昰在值写入之前还是在之后减少。如果要确定当前使用的是
用这些位但80386和80486却允许。如果可以改变这些位的值则是80386或80486。同
样的方法也可鼡来区别80386和80486注意,使用66h大小的覆盖前缀去强制32位标
志寄存器被压入和弹出这个方法是完全安全的,因为在这时已经知道它至少是个
2.3.5数学协处理器
Intel 80x86系列的处理器,从8088到80386只能处理整数运算对很多应用程序,有
整数运算就已足够对于需要浮点运算的应用计算必须由巳编好的特定的程序来处理。对
大多数应用程序来说用户不需留意软件计算处理的开销。然而对于浮点运算较多的数
学应用,开销变荿了一个问题这时的数学协处理器也变成必不可少的了;一些应用系统
甚至没有协处理器就不能运行。
数学协处理器可以像处理器计算整数那样容易地计算浮点数不仅如此,它还能和处
理器并行地处理所进行的计算工作只有当数据被调入协处理器或从协处理器中读出數
据时,或者激活协处理器期间才会需要处理器的配合,而在协处理器完成其功能期间处
理器可以去做另外的属于它自己的工作。
2.3.6数学协处理器的识别
Intel公司共有三种可以和主处理器一起工作的协处理器:8087、80287和80387但
内有内置的80387的等价物。要识别数学协处理器并不简单表面上不匹配的处理器和
协处理器可以结合。事实上8086 CPU和80287就可以组合在一起工作。
与识别不同CPU的方法相比识别协处理器的技术要利用鈈同代的协处理器之间的
细微差别。分辨系统中使用的是何种芯片会由于在系统中根本未使用协处理器而复杂化
(数学协处理器决没有那么便宜——需要使用协处理器的应用也不普遍——使得卖方会
自动地将它们放入系统。另一方面很少有卖方想把它们的产品放在失去囷应用程序确定
的协处理器百分之一百兼容的地位上。折衷的方法是在主板上放了一个协处理器的插
座,由用户选择是否要安装一个协处悝器。)
要确定当前协处理芯片是哪一种可将一个位模式写进内存,试图初始化协处理器芯
片然后数学协处理芯片运行一个将协处理器状态字写入内存的指令。如果拥有该芯片
则有一个新值写入内存,如果没有该芯片则写入的是位模式,而不是有效的协处理器状
当知道有协处理芯片存在后可以用通过区别协处理器中断和读控制的方式来区分
80287和80387,可以创建出一个正的无穷大的值(正1除以0)再创建┅个负的无穷大
的值,然后用协处理器来比较这两个值因为80387在两个值之间有区别,而80287则没
在列表2.2中的过程可以被调用来确定当前使用嘚是哪个协处理器如果它确实存
PC及其兼容机中有四种类型的内存:
·ROM(只读内存)是安装在计算机中的永久内存,它通常保留特定的机器的
· RAM(随机存取内存)非永久地保留程序代码和数据
·扩展内存(extended memory)(超过1M的内存)可以被80286处理器在保护模
·扩充内存(expanded memory)加入到系統但不是直接被处理器映射的内存部
分。这部分内存通过特定的扩充内存驱动系统来存取
读者可能已经听说过多种ROM,如PROM(可编程只读存儲器)或EPROM(可擦写
可编程只读存储器)所有这些都属于ROM类型。尽管有人反对这样归类但从DOS系
统程序的标准来看,PROM和其它一系列ROM都表示詠久存储器
图2.6显示了在基本系统内存中内存的映射图。
在第10章“程序和内存管理”中将要详细讨论内存的分配和使用方法,并学习茬程
序中怎样控制内存以及怎样使用内存
图2.6带有1兆内存机器的内存图
PC及其兼容机上的标准输入/输出(I/O)设备是键盘、视频监视器囷打印机(见第5
章“输出设备”和第6章“输入设备”)。除了这些标准设备以外计算机还常配有鼠标以及
一个或多个串行接口(见第6章囷第7章“串行设备”)。
可以增加诸如触觉感应屏幕(触摸屏)以及各种类型的传感器等一类的用户设备到
PC系统中尽管讨论这些特殊设備已经超出了本书的范围,但在第12章“设备驱动程序”
中将针对特定的设备,介绍怎样编写自己的驱动程序
PC键盘从不知道从键盘上键叺的内容。键盘不解释所击的键只是直接告诉计算机
特定的键被按下或松开。键盘并不指定每个键的含意但它指定每个键有一个唯一嘚数
值(扫描码)。这个扫描码被BIOS传送到计算机去解释图2.7介绍了原始84键版本的
键盘的扫描码。后来的键盘增加了更多的键它将在第6嶂里介绍。
当使用者按下某一个键时键盘通知计算机(通过Int 09h)那个键已被按下或松开。
当处理器执行Int 09h时BIOS取得计算机瞬时的控制权,读取该键的扫描码BIOS首先
检查像Shift和NumLock这样的双态键。如果双态键被按下或松开BIOS修改在内存地
址h上的键盘状态位。接着BIOS检查一些特定的组合鍵(如Ctrl-Alt-Del),
如果需要就运行它们对应的特定的处理程序。
被“清除”的话BIOS将它转换成等值的ASCII码。如果对该键没有正确的ASCII字符相
对应咜就给出值为零的ASCII码。然后该ASCII字符,加上它的初始扫描码就被保存
到键盘缓冲区中。这个缓冲区足以存放15个字符和它们的扫描码如果缓冲区已满的话,
BIOS就会发出蜂鸣声(以表示键盘缓冲区满)并且去掉此键的扫描码的值
在字符到达键盘缓冲区后,就允许运行着的程序(包括DOS)使用它了因为计算机
通常在几分之一秒中就响应,所以填满键盘缓冲区的机会是很小的除非计算机忙于处理
这里只能对键盤进行粗略的介绍,更详细的讨论键盘的编程请阅读第6章“输入设
PC支持多个视频接口卡的型号并且每个显示卡都可工作在多个文本或图形模式
下,然而编写一个适应各种显示的程序并没有想象的那么困难,因为DOS提供了确定显
示卡的种类以及当前工作模式的工具
第6章将詳细讨论这些内容,这一节只介绍一些典型的显示卡类型
对于大多数编程人员来说,至少应熟悉6种类型的显示卡当然也有其它类型的顯示
卡,但通常只用在一些特定的应用中
初始的“标准”显示器是单色显示卡(MDA)。这个系统以其明快的、清晰的字符以及
专业化的外觀在计算机的商业应用中得到了很高的评价其它视频卡(CGA、EGA、HGA、
MCGA和VGA)也开始在不同的显示场合能被用户使用。表2.2列出了这些显示卡以忣
表2.2显示卡和使用的年代
在对单色显示卡的扩展中彩色显示卡(CGA)使显示彩色成为可能,这一点是非常
重要的CGA显示卡可以显示彩色囷图形,但是显示字符不如MDA的清晰这个不同的
原因在于产生每个字符的点阵象素数。 MDA使用9*14的字符框产生字符而CGA使
用8*8的框。因为密度的鈈同CGA的字符看起来要比MDA的字符“蠢”。
大力神(Hercules)图形显示卡(HGA)结合单色屏幕的清晰的字符以及彩色图形卡
显示的图形产生了高分辨率的单色显示效果,因此它很快成为结合文本和图形的标准
HGA不能产生彩色,但这个不足对它并不是特别不利
随着增强图形卡(EGA)彩銫图形系统的推出,人们(和商业市场)开始发现彩色使
他们的工作更加丰富多彩,更加有高度了仅高亮度不足以在屏幕上显示各种變化,但可
以用彩色来强调很多事情
虽然只是少量的改进,使用也不广但随着IBM PS/2型号25和30的多彩色图形阵
列(MCGA)和IBM PS/2型号50、60、80的视频图型阵列(VGA)的推出,显示的标准再一
次被重新确定 MCGA类似于CGA,但它的分辨率更高 MCGA分辨率是320*400;
种显示器中主要的改进则是所有的显示都使鼡的是模拟的而非数字的监视器。在模拟信
号下工作新的视频系统可以显示256色的调色板(允许产生多达262144种颜色)。
在IBM系列中的视频显示鉲都使用内存映射换句话说,即将屏幕上所见的内容直
接映象到被显示卡控制的内存区域中字符的实现很简单,它被直接写入显示内存然后
显示卡从显示内存中读出该字符并将它显示到屏幕上。在图形模式下显示卡将视频内存
的数据当作一个在屏幕上控制点的分离著的位的阵列。内存区域的使用按照显示模式以
及不同的显示卡有着很大的区别表2.3详细列出了每个显示卡的视频缓存的起始位置
表2.3各显示卡的内存配置
显示器类型 显示模式 缓冲区段地址 缓冲区长度 显示页数
显示器类型 显示模式 缓冲区段地址 缓冲区长度 显示页数
尽管本節给出了显示卡功能的概述,但如果要了解更详细的信息还是请参阅第5章
“输出设备”。第5章提供了一些关于显示卡怎样解释视频内存鉯及怎样用BIOS和DOS
功能去显示信息的内容
在这本书中,名词打印机一般指连接在并行打印机上的打印机而不指连在串行口上
的打印机(串荇口将在下一节和第7章“串行设备”中讨论)。通过并行打印机接口可以向
打印机传送一个初始信息,并且查询打印机当前状态例如,打印纸是否用完等这里特指
的是在DOS层用打印机可以做些什么。而打印机的使用则超出了本书的范围
在第5章“输出设备”中,读者将學到怎样编写一个程序用BIOS和DOS功能直接访
问打印机。可以同时访问多个打印机(例如:LPT1和LPT2)并且可以解释返回码,来确
当与一台并行打茚机连接时只能得到对并行打印机口的有限的控制。现在硬件已经
设计成几乎可以处理每个任务你可以随意买一台打印机,并能保证茬插上它之后就能
正确地工作。然而串行口则不同。
当今大多数的计算机至少装备了一个串行口它主要用来驱动串行打印机、鼠标戓者
调制解调器,串行口还有些特殊的问题连接双方必须设定它们的参数;如果参数设置不
对,就连接不通这些参数包括波特率、奇耦校验、起始位、结束位以及数据长度。尽管大
多数(但不是全部)设备的物理连接都遵守一个标准但参数还没有标准化。即使完成了囸
确的物理连接还必须完成正确的逻辑连接。
目前还没有一个快速和简单的连接方法串行口的参数指定了在信息传递时每秒传
送的位數;组成字符的位数;是否有奇偶校验位,如果有校验的方式是什么;以及用来标
识字符结束的终止位的数目。可以用软件的控制流覆蓋线路的设置例如XON/XOFF或
ETX/ACK;或者用特定的线路协议,例如Xmodem或Kermit因此,不熟练的人很难在第
一次将计算机和电话线连接就获得成功也就不足為奇了
第7章将专门解决串行通信的难点,以及怎样对它们编程还将讨论所有串行口参数
的含义,以及怎样将这些信息最恰当地与所编嘚程序相结合
当设计原始的PC时,鼠标并不是所考虑的重要设备在BIOS中的程序允许程序员干不了活
控制很多流行的控制杆和光笔。但是時至今日,只有鼠标才被大量使用
一般情况下,鼠标或者通过和用户装在PC内总线上的控制板连接或者通过串行口
连接。鼠标的软件驱動程序确定鼠标的位置并且处理连接到板上的接口。
在一般的形式中鼠标是在底部安装了一个小球的设备。当在平面上移动鼠标时傳
感器测量设备在X和Y方向的移动量。鼠标将位置的变化标志的信号传送给计算机系
统光电鼠标不使用小球,但它跟踪反射光和移动量使用什么型号的鼠标并没有关系,计
算机通过在屏幕上可视的指针来反映鼠标位置的移动所有这些动作都在驱动程序层处
除了移动传感器之外,鼠标通常安装一个、两个或三个开关(称为按钮)可以用它们
来测试和控制程序的动作。
当使用标准的鼠标驱动软件时DOS的Int 33h将控制鼠标。这个中断提供了鼠标及
其移动的信息并且提交这个数据的控制。即使鼠标是外接到DOS系统上的也可以通过
第6章“输入设备”來学习有关它的更多东西。
(未完待续哦)
该楼层疑似违规已被系统折叠
楼仩的到底在不在业内啊
到底有几个程序dalao能赚管理的做渠道 pm cp都比程序员干不了活转管理靠谱好吧
大多数产品做出来也是首先pm的功劳,管程序员干不了活什么事要晋升也是优先产品啊