【古董技术】ms-dos应用程序的结构

制定一个MS-DOS应用程序计划需要认真分析程序的大小。这种分析可以帮助程序员确定MS-DOS支持的两种程序风格中哪一种最适合该应用程序。.EXE程序结构为大型程序提供了好处,因为所有.EXE文件之前都有额外的512字节(或更多)的文件头。另一方面,以失去这些额外好处为代价,.COM程序结构不会使小型程序负担这些额外文件头字节的开销。因为.COM程序在被EXE2BIN转换之前一开始就是.EXE程序,并且在MS-DOS下应用程序编程的几个方面在使用的程序结构不同的情况下仍然相似,因此对于准备编写只有.COM程序的程序员来说,对.EXE结构的充分了解也是有益的。因此,我们将从讨论.EXE程序的结构和行为开始,然后看一下.COM程序和.EXE程序之间的区别,包括.COM程序结构和内容的限制。

exe程序

.EXE程序相比于.COM程序在应用程序设计方面有几个优势。
选择.EXE格式的考虑因素包括:

  1. 非常大的程序
  2. 多个段 覆盖区
  3. 段和远地址常量 长跳转
  4. 将程序升级到MS OS/2保护模式的可能性

.EXE格式的主要优势是由文件头提供的。最重要的是,文件头包含了使程序能够进行直接段地址引用的信息—这是程序要超出64KB以上才能满足的要求。
文件头还告诉MS-DOS程序需要多少内存。这些信息可以防止系统分配给程序不需要的内存—这在未来升级程序以有效运行在MS OS/2保护模式下的情况下是很重要的考虑因素。
在详细讨论.EXE程序结构之前,我们将看一下.EXE程序的行为。
在这里插入图片描述
截取自早期的微软档案

这张图片展示了一个.EXE程序在内存中的示例,当MS-DOS首次交给程序控制时。该图显示了微软首选的程序段排列方式。
在将控制权转移到.EXE程序之前,MS-DOS会初始化内存的各个区域以及微处理器的几个寄存器。以下讨论解释了在将控制权交给.EXE程序之前可以从MS-DOS期待的内容。

程序段标志psp

程序段标志(或者我也叫他前缀)(PSP)不是任何程序代码的直接结果。相反,这个特殊的256字节(16段)内存页是由MS-DOS在加载所有.EXE和.COM程序到内存时,在它们前面构建的。虽然PSP确实包含对新程序有用的几个字段,但它主要作为CP/M的遗留物存在 - 微软采用了PSP以便更轻松地将在CP/M环境下可用的大量程序移植到MS-DOS环境中。图4-2显示了组成PSP的字段。

PSP:0000H([旧热启动])PSP以8086系列INT 20H指令开始,程序可以使用该指令将控制权传回MS-DOS。PSP在偏移00H处包含此指令,因为在CP/M下,这个地址是WBOOT(热启动/终止),而CP/M程序通常通过跳转到该中断来终止。这种终止方法不应在新程序中使用。请参见下面的终止.EXE程序。

PSP:0002H(分配给程序的最后一个段的地址)MS-DOS在PSP的偏移02H引入了一个字。它包含已分配给程序的内存块后的段地址。这个地址应该仅用于确定分配给程序的内存块的大小或结束位置;它不应被视为程序可以占用的自由内存的指针。在大多数情况下,这个地址不会指向空闲内存,因为任何空闲内存都已经被分配。
在这里插入图片描述
这张图片是微软msdos4时期的
除非使用/CPARMAXALLOC开关链接程序,否则程序不会被分配到指定的内存。即使使用了/CPARMAXALLOC,MS-DOS可能会将程序安装到与程序需求一样大的内存块中。行为正常的程序应该只通过提供的MS-DOS功能调用来获取额外的内存。PSP:0005H(MS-DOS功能调用[旧bios中断)偏移05H也是从CP/M中遗传下来的。这个位置包含一个8086系列的远程(段间)调用指令,用于调用MS-DOS的功能请求处理程序。(在CP/M中,这个地址是操作系统中断,用于类似的目的。)这个向量不应该在新程序中用于调用MS-DOS。MS-DOS仅提供这个中断以支持CP/M风格的程序,因此只能通过它支持CP/M风格的功能(00-24H)。

PS13:000AH-0015H(22H、231I和24H中断向量保留)MS-DOS使用偏移OAH到15H来保存三个特定程序的中断的内容。MS-DOS必须保存这些,因为它允许任何程序通过一个MS-DOS功能调用执行另一个程序(称为子进程),当被调用的程序终止时返回控制给原始程序。因为当子程序终止时原始程序会恢复执行,所以MS-DOS必须为原始程序还原这三个中断,以防被调用的程序改变了它们。涉及的三个向量包括程序终止处理程序(中断22H)、Control-C/Control-Break处理程序(中断23H)和关键错误处理程序(中断2411)。MS-DOS将这些的原始执行内容保存在子程序的PSI’中,从偏移0A开始为程序结束处理程序、OM为Control-C/Control-Break处理程序,12H为关键错误处理程序。

PSP:002C1-1(环境段地址)在MS-DOS 2.0及更高版本中,偏移2CH处的字包含了程序所能找到的PSP中最有用的一部分信息——MS-DOS环境的第一个段地址。这个指针使程序能够通过环境搜索任意由用户使用SET命令放置在那里的配置或目录搜索路径字符串.

PSP008011默认的 DTA 位于 PSP 的整个后半部分(128 字节)。MS-DOS 将内存中的这一区域用作程序使用 FCB 风格文件访问函数时的默认记录缓冲区。再次,MS-DOS 是从 CP/M 继承了这个位置。(MS-DOS 提供一个程序可调用以更改 MS-DOS 将用作当前 DTA 的地址的功能。请参阅微软的参考之南《系统调用:中断 211:函数 1ah》。)因为默认 DTA 在程序执行需要它的文件操作之前没有任何作用,所以 MS-DOS 将命令尾置于此供程序检查。命令尾包括用户执行程序时在程序名称之后输入的任何文本。通常,ASCII 空格(20H)是命令尾中的第一个字符,但 MS-DOS 认识的任何分隔符都可以占据此位置。MS-DOS 从偏移量 81H 开始存储命令尾文本,并始终在文本末尾放置一个 ASCII 回车(ODH)。为了提供额外帮助,它在偏移量 80H 处放置了命令尾的长度。这个长度包括最后的 ODH 之外的所有字符。例如,命令行:

c:》DOIT ASS V CAN

然后你再doit对应psp:80h的地方就有

	0A    20 41 53 53   20  56 20  43 41 4E   0c
	长度 空格  a s s     空格 v 空格 c a n     长度
	(去掉最后一个字节的)             (总长度,含自身)
  • 未完待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/647235.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【MinIO学习】

OSS Docker podman MinIO服务器 MinIO客户端 Bucket Object 时间同步 The difference between the request time and the servers time is too large。 URL

AGI系列(1):掌握AI大模型提示词优化术,提问准确率飙升秘籍

当我们向AI大模型提问时,通常人们的做法是有什么问题,就直接去问,得到大模型的回复结果,时好时坏,完全没有可控性。 那么有没有一种方式或是一套方法,可以让我们向大模型提问时,得到的结果更准确…

二十九篇:构建未来:信息系统的核心框架与应用

构建未来:信息系统的核心框架与应用 1. 引言 在这个充满挑战和机遇的信息时代,信息系统已经成为现代组织不可或缺的神经中枢。它们不仅革新了我们处理信息的方式,更是极大地增强了决策制定的效率和质量。在这篇文章中,我将分享我…

JMeter学习笔记二

面试题: 1.做接口测试时,你是怎么做的数据校验(返回值验证)?一般你会验证哪些数据? 校验code 200(说明后端接到了你的请求,并且给了应答) 返回信息 sucess 2.有1w个用户名密码需要登录&#xff…

搭建Harbor镜像仓库

前言 1、系统版本:CentOS9 2、harbor版本:v2.9.4 3、提前安装好docker和docker-compose,参考地址。我这里安装的版本是docker:26.1.3 docker-compose:v2.27.1 安装步骤 下载安装包 1、下载地址:ha…

基于门控的循环神经网络:GRU

门控循环单元(GatedRecurrentUnit,GRU)网络,也是一种基于门控的循环神经网络,但是名气不如LSTM大,GRU是对LSTM的一种改版,可以理解为是LSTM的简化版。LSTM有三个门,输入门&#xff0…

代码随想录-Day20

654. 最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums…

探索Python列表的奥秘:从零开始学习

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、列表简介与用途 二、列表的创建与访问 三、列表的增删改查 四、列表生成式与高级操作…

The view model in Acise

在FreeCAD中,借助于Boost Signals2实现了业务层、显示层的分层,但整个FreeCAD Gui层却采用了Coin3D进行渲染,很难在这方面进行扩展。 相较之下,在SALOME中,可以为不同的Module指定特定的ViewModel,支持Ope…

Sping源码(八)—Spring事件驱动

观察者模式 在介绍Spring的事件驱动之前,先简单的介绍一下设计模式中的观察者模式。 在一个简单的观察者模式只需要观察者和被观察者两个元素。简单举个栗子: 以警察盯梢犯罪嫌疑人的栗子来说: 其中犯罪嫌疑人为被观察者元素而 警察和军人为…

C++ List完全指南:使用方法与自定义实现

文章目录 list的使用几种构造函数 list的实现1.节点类的定义1.1节点类的构造函数 2.正向迭代器实现2.1operator*重载2.2operator->重载2.3operator重载2.4operator--2.5operator和operator! 3.反向迭代器实现3.1operator*重载3.2operator->重载3.3operator重载…

音视频入门基础:像素格式专题(3)——FFmpeg源码解析BMP格式图片的底层实现原理

音视频入门基础:像素格式专题系列文章: 音视频入门基础:像素格式专题(1)——RGB简介 音视频入门基础:像素格式专题(2)——不通过第三方库将RGB24格式视频转换为BMP格式图片 音视频…

每日一问-如何设置VS Code 中 Markdown粘贴图片的位置

VS Code内的markdown编辑器应该算是比较好用的,但是有一个问题一直困扰着我,就是在编辑markdown文件时,粘贴图片的位置问题。默认情况下,VS Code会将粘贴的图片放在markdown文件的同级目录下,这样会导致markdown文件的…

OWASP top10--SQL注入(二)

目录 06:SQL注入提交方式 6.1、get提交 6.2、post提交 6.3、cookie提交 6.4、HTTP Header头提交 07:注入攻击支持类型 7.1、union注入: 7.1.1、union操作符一般与order by语句配合使用 7.1.2、information_schema注入 7.2、基于函数…

AIGC语音交互

目录 一、总体介绍 二、环境设置与安装 三、语音识别 四、语音合成 五、GPT调用 六、信息关系 七、实现效果 一、总体介绍 达成效果:在ROS系统中实现用户语音提问得到智能语音回答 用到的技术:科大讯飞的语音识别、语音合成 GPT 操作系统&#x…

顶顶通呼叫中心中间件-自动外呼输入分机号(比如隐私号)(mod_cti基于FreeSWITCH)

顶顶通呼叫中心中间件-自动外呼输入分机号(比如隐私号)(mod_cti基于FreeSWITCH) 比如有些人的号码是这样的就需要用上自动外呼输入分机号了 号码1:182XXXX8111-1234 号码2:182XXXX8222 如果号码是这样的就根据以下步骤配置 注意使用这个需要:…

web如何做接口层面自动化测试?

接口层面约等于集成化测试,且需要启动web容器 一般web项目的,代码都是按照分层开发的,业务主要是集中在service和dao层,而我们如果仅仅是利用之前的单元测试,然后把依赖的代码直接mock掉,仅仅测试controller这一块是没…

如何将前端项目打包并部署到不同服务器环境

学习源码可以看我的个人前端学习笔记 (github.com):qdxzw/frontlearningNotes 觉得有帮助的同学,可以点心心支持一下哈(笔记是根据b站尚硅谷的前端讲师【张天禹老师】整理的,用于自己复盘,有需要学习的可以去b站学习原版视频&…

【Spring】深入理解 Spring 状态机:简化复杂业务逻辑的利器

前言 在软件开发中,有许多场景需要处理状态转换和状态驱动的逻辑,比如订单处理、工作流程管理、游戏引擎等。Spring 状态机(Spring State Machine)是 Spring Framework 提供的一个强大的模块,用于帮助开发人员轻松构建…

计算机网络 1

两台主机想通信,其实本质就是两个文件的资源交换,但是长距离的通信,面临的是很多的问题。这个时候需要通过一些方式来保证可靠性 什么是协议 这样一个例子,我是住在农村,我读高中了我需要去县里面读书。这个时候呢&…