没有合适的资源?快使用搜索试试~ 我知道了~
首页MS-DOS编程参考手册:实战指南与授权翻译
MS-DOS编程参考手册:实战指南与授权翻译
需积分: 10 6 下载量 117 浏览量
更新于2024-07-19
收藏 2.21MB PDF 举报
"《MS-DOS编程的技术》是一份珍贵的参考资料,由Terrv Dettmann撰写并授权翻译自1993年Que Corporation出版的第四版《DOS Programmer's Reference》。这本书专为DOS时代的程序员设计,详细介绍了在那个经典的单用户操作系统环境下进行编程的技巧和规范。由于原始电子书是将TXT格式转换成CHM格式,虽然文本呈现可能不够直观,但其内容涵盖了基础至高级的DOS编程概念,如汇编语言、系统调用、文件操作、内存管理等。 尽管作者表示由于个人工作原因未能对全文进行深度整理,但书中包含了丰富的编程实例和理论知识,对于理解早期计算机编程的实践非常重要。此外,版权信息强调了未经许可,任何形式的复制或传播都必须得到出版商的书面同意,体现了对知识产权的尊重。 该中文版由清华大学出版社在1995年出版,且附有版权合同登记和防伪标签,表明其官方性和合法性。书中涉及的磁盘操作系统手册IV部分,说明它不仅局限于基础教程,还深入探讨了与DOS操作系统的交互和高级应用。书本的信息包括了开本、印张、字数以及详细的版次和印刷记录,反映了当时出版行业的标准。 对于想要学习或回顾DOS时代编程技术的读者来说,《MS-DOS编程的技术》是一份不可多得的历史文献,它不仅提供了技术知识,也见证了计算机历史上的一个阶段。尽管如今许多开发者可能已经转向更现代的平台,但理解和研究DOS编程仍然是计算机科学教育中的一个重要环节,因为它展示了编程基础的深厚根基。"
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10159972/bg10.jpg)
第 2 章 DOS 系统结构
DOS 结构涉及硬件之上的整个机器。它不只是操作系统,并且包括整个计算机。如果
想要对使用什么功能或怎样使用它们作出最好的决定,就必须了解 DOS 的结构。
2.1“虚机”概念
认识 DOS 的一个有用的方法是,将它看成是分布在子系统中的一种体系结构。该体
系中每层都提供了一个完整地定义的服务程序集合,以使更高一层可以使用它。因此,每
个层次都成了一个虚拟的机器,它便构成下一个更高层次的计算机。图 2.1 说明了这个关
于 DOS 系统的概念。
图 2.1 虚拟机器的层次结构
物理的机器或硬件,是该体系的最底层。系统之间的很多区别就在于这一层。
围绕着机器,常见的主要组成包括以下几个部分:
·来自 Intel 8086 家族的处理器:8086、8088、80186、80286、80386 和 80486
·在系统中相似的物理设备映象(换句话说,相似的指定中断和地址)。
·一个有限数量的总线设计。
DOS 的一个主要目的就是隐藏各机器之间的差异,以便在编程和用户层都以标准的
方法来使用计算机提供的各种性能。DOS 成功地在各种 IBM 兼容计算机所选择的操作系
统上实现了一致。
2.2 物理机器
机器之间最大的差异就在硬件层,在这个层次一般会发现其“兼容性”是否真的兼容。
当有重大的硬件差异时,在这个层次操作的程序就不能工作了。
物理的计算机系统(见图 2.2)可以分为几个主要部分:
·中央处理器(CPU),完成计算机系统的操作。
·ROM 和 RAM,保留程序和数据。
·输入通道,为计算机输送信息。
·输出通道,将信息送给用户。
·存储设备(软盘和硬盘),临时地或永久地保留数据。
图 2.2 基本计算机的框图
理解计算机系统的所有这些部分,对成功地开发出高质量的软件是很有必要的,特别
是使用 DOS 和 BIOS 尤为重要。下面将讨论这些部分。
2.3 处理器
在 PC 或兼容机上使用的中央处理器(CPU)是 Intel 公司 8086 系列处理器芯片的成
员。在使用的计算机中经常看到 8086、8088、80186、80286、80386 或 80486 芯片。Intel
新
近已经发布的芯片,主要版本有 80386sx、80386DX、80486SX、80486DX、80486DX2 等。
在 Intel 系列中的每个芯片,不仅有区别于已有芯片的特有功能,而且也和早期版本保持
了兼容性。例如,80386(SX 或 DX)就可以完成 80286 或 8088 可以完成的所有工作,并加
上了它自己特有的功能。
本书不详细研究芯片之间的特殊差异,但要知道 DOS 的主要版本是基于 8086 和
8088 芯片的能力而设计的。在讨论 DOS、BIOS 和编程时,所有例子都是运行在 8086 或
8088 上的(没有包括新芯片扩充的特有性能)。在本书中,所有的引用都是针对 8086 的,
但都适用于整个 intel 处理器系列。对 DOS 的一些新的附加和扩充,需要不同 CPU 芯片
知识,我们在例子中将清楚地注明所需知识的类型。
CPU 是完成最简单操作的基本处理器。因为必须了解一些这个基本处理器的知识,
![](https://csdnimg.cn/release/download_crawler_static/10159972/bg11.jpg)
所以这节提供了一个 8086 家族处理器的概述。如果读者已熟悉这个题目,可以跳过此节。
如果要详细了解 8086 家族的编程,请看本书最后的参考书目。
在本节的后面,将讨论作为一个程序员可以存取的 CPU 寄存器。然而,因为内存寻址
是在 DOS 层完成很多程序操作的基础,所以首先必须了解 8086 怎样对内存寻址。让我们
先看以下部分的内容。
2.3.1 8086 内存寻址
一些程序员批评 8086 的分段内存寻址方式。内存分段限制着数据项的大小,并且指
针结构也很复杂。然而,分段式内存对于 DOS 程序员来说至今仍还存在。它对解决 8086
的固有设计问题是一个明智的方法,也是用 8086 的 16 位寄存器来表示乡 8086 的 20 位地
址值的最好的查找方式。 8086 有 20 根地址线,它允许在一个内存区域内有 2 的 20 次方(即
1048576 或 1M)字节的寻址能力,但它的寄存器只有 16 位宽(寄存器的使用将在本章后
面“8086 寄存器集”一节中讨论)。
解决这个问题的方法就是将整个内存地址分成可以在 16 位寄存器中被独立存储的
“片”。因此,需要用两个寄存器来表示一个地址:一个寄存器存储基地址(或称作段地址),
另一个存储相对于基地址的偏移量。该方法理论上可以寻址 2 的 32 次方(大于 40 亿字节)
的连续
地址。但要实现这个寻址区间,微处理器需要 32 条地址线,因此它大大地超过了 8086 的
能力。下面我们用例子说明该寻址区域是非常有用的。
图 2.3 示出了包含 100000000h(4294967296)或 2 的 32 次方个单元的 4 千兆内存空间
区域。每
一行是一个区或段(segment),包含 10000h(65,536 或 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 如何计算一个绝对地址
![](https://csdnimg.cn/release/download_crawler_static/10159972/bg12.jpg)
现在,我们已有了基于 8086 内存寻址概念,下面让我们再来讨论 8086 的寄存器集。
8086 用段。偏移量来寻址内存会导致一个反常现象;实际使用中的绝对地址可以以
多个组合方式来寻址。例如,下面所有的段。偏移量对表示的地址都对应的是同一个绝对
内存地址。
0101:FFF0 1000:1000
03F1:D0F0 1001:0FF0
0900:8000 1002:0FE0
0CB7:4490 1003:0FD0
0FFF:1010 1100:0000
所有这些分段式的地址都对应于同一个绝对地址:011000h。注意,每增加或减少此
地址的一个段位置,会对应地增加或减少偏移量中的 10h 位置。正如所看到的那样,内存
段可以用很多方式来覆盖。
2.3.2 8086 寄存器集
8086 系列使用了 14 个独立的 16 位可组合的寄存器,按用途分组,可分为四类:
·通用寄存器
·段寄存器
·偏移量寄存器
·标志寄存器
表 2.1 列出了各个寄存器和它们的分类。
表 2.1 8086 寄存器集
寄存器 类别 用途
AX 通用
BX 通用
CX 通用
DX 通用
CS 段 代码段
DS 段 数据段
ES 段 附加段
SS 段 堆栈段
SP 偏移量 堆栈指针
BP 偏移量 基地址指针
SI 偏移量 源索引地址
DI 偏移量 目的索引地址
IP 偏移量 指令指针
Flags 标志 状态标志
当面对各个寄存器时,你就明白了在硬件层是如何直接对 CPU 进行操作的。要注意
的是,这些操作尽管都由汇编语言来完成,但像 BASIC、C 和 Pascal 这样的高级语言也有
自己的方法来调用这些寄存器。(有关这方面的技术将在第 4 章“DOS 和 BIOS 接口”中讨
论)。
正如上面所提到的,8086 寄存器集可以按照使用目的,分成四类,让我们对此分别介
绍。
通用寄存器
通用寄存器,正如其名字所提示的,用于存储最新结果或其它临时需要的通用目的。
![](https://csdnimg.cn/release/download_crawler_static/10159972/bg13.jpg)
当使用 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)结构。
偏移量寄存器
偏移量寄存器,正如其名字所表示的那样,一般用来作为内存地址的偏移量部分。地
址的段部分一般存在段寄存器中。
![](https://csdnimg.cn/release/download_crawler_static/10159972/bg14.jpg)
因为地址被分成段寄存器和偏移量寄存器两部分,所以每个偏移量寄存器被隐含地
和指定的包含地址“其它”部分的段寄存器配对。这种配对是自动的,除非用特定的命令取
消这种默认的配对。
在以下列表中,给出了 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 位作为标志,表示处理器的状态或控制处理器的
操作方式。这些标志被分为两类:状态标志和控制标志。列出如下:
状态标志:
·CF(进位标志)
·PF(奇偶标志)
·AF(辅助进位标志)
·ZF(零标志)
.OF(溢出标志)
·SF(符号标志)
这些标志报告最后一个被运行的指令的状态。例如,如果最后一条指令产生的值是
零,则零标志就被设置。状态标志的设置和清除是自动的,但程序也可以设置和清除标
志。
很多 DOS 和 BIOS 程序就使用进位标志来指示错误。
控制标志是:
·DF(方向标志)
·TF(跟踪标志)
·IF(中断标志)
方向标志控制着 8086 的指令在内存拷贝的区域内指定方向。跟踪标志将 CPU 置成
剩余762页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://profile-avatar.csdnimg.cn/fa5a63e96c274c128e2f58860eefcf41_cixichenbo.jpg!1)
cixichenbo
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- 解决Eclipse配置与导入Java工程常见问题
- 真空发生器:工作原理与抽吸性能分析
- 爱立信RBS6201开站流程详解
- 电脑开机声音解析:故障诊断指南
- JAVA实现贪吃蛇游戏
- 模糊神经网络实现与自学习能力探索
- PID型模糊神经网络控制器设计与学习算法
- 模糊神经网络在自适应PID控制器中的应用
- C++实现的学生成绩管理系统设计
- 802.1D STP 实现与优化:二层交换机中的生成树协议
- 解决Windows无法完成SD卡格式化的九种方法
- 软件测试方法:Beta与Alpha测试详解
- 软件测试周期详解:从需求分析到维护测试
- CMMI模型详解:软件企业能力提升的关键
- 移动Web开发框架选择:jQueryMobile、jQTouch、SenchaTouch对比
- Java程序设计试题与复习指南
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)