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

news2024/12/23 18:42:04

制定一个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     长度
	(去掉最后一个字节的)             (总长度,含自身)
  • 未完待续

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

跨境选品师不是神话:普通人也能轻松掌握,开启全球贸易新篇章!

随着互联网技术的飞速发展,跨境电商行业已成为全球经济的新增长点。在这个背景下,一个新兴的职业——跨境选品师,逐渐走进了人们的视野。那么,跨境选品师究竟是做什么的?普通人又该如何成为优秀的跨境选品师呢? 一、跨境选品师的…

Docker compose 的方式一键部署夜莺

官方安装文档:https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v7/install/docker-compose/ 介绍:夜莺监控是一款开源云原生观测分析工具,采用 All-in-One 的设计理念,集数据采集、可视化、监控告警、数据分析…

数据结构(四)串

2024年5月26日一稿(王道P127) 定义和实现

日志的介绍及简单实现

个人主页:Lei宝啊 愿所有美好如期而遇 目录 日志是什么? 为什么需要日志? 实现一个简单日志 时间戳 clock_gettime time & localtime 可变模板参数(使用C语言),va_start & va_end & vsprintf 宏 __LINE__…

推荐一款媒体影音嗅探神器—Chrome扩展插件(猫抓cat-catch)

目录 1.1、前言1.2、下载地址1.3、github Releases 版本说明1.4、安装步骤1.5、猫抓插件常规设置1.5.1、设置抓取文件的类型1.5.2、设置抓取文件的后缀名 1.1、前言 我们在日常上网的过程中,很多音频、视频网站下载资源都非常不方便,要么需要安装客户端&…

【高阶数据结构】AVL树的旋转与底层(C++实现)

1.AVL树的概念及作用 2.AVL树插入数据的规则 1.按照搜索树的规则插入,然后更新父亲的平衡因子 2.更新父亲的平衡因子后,如果出现一下三种情况需要进行相应处理 3.AVL树的旋转 3.1右单旋 右单旋的所有情况可以抽象为上图:图中,a,…

【识人】感情与交友中,如何判断一个人的性格,以及是否值得交往和相处

【识人】感情与交友中,如何判断一个人的性格,以及是否值得交往和相处 文章目录 序言正文1、学会筛选,贴标签,学会区别对待,2、男生女生一定要在年轻的时候学会对外在祛魅3、培养付出意识,学会顶风相见。4、…

protobuf —— 认识和安装

protobuf —— 认识和安装 什么是序列化和反序列化有哪些常见的什么是序列化和反序列化工具Protobuf安装安装依赖开始安装 连接动态库一些遗留问题 我们今天来看一个序列化和反序列化的工具:protobuf。 什么是序列化和反序列化 序列化(Serialization&a…

Yolov9调用COCOAPI生成APs,APm,APl

最近在做小目标检测的东西,因为后期毕业论文需要,所以开始使用Yolov9模型,运行val.py的时候不会自己产生小目标的AP指标,所以研究了一下,步骤非常简单: 第一步: 在数据集中生成json格式的Annota…

【LLM多模态】综述Visual Instruction Tuning towards General-Purpose Multimodal Model

note 文章目录 note论文1. 论文试图解决什么问题2. 这是否是一个新的问题3. 这篇文章要验证一个什么科学假设4. 有哪些相关研究?如何归类?谁是这一课题在领域内值得关注的研究员?5. 论文中提到的解决方案之关键是什么?6. 论文中的…

AIGC时代算法工程师的面试秘籍(2024.4.29-5.12第十三式) |【三年面试五年模拟】

写在前面 【三年面试五年模拟】旨在整理&挖掘AI算法工程师在实习/校招/社招时所需的干货知识点与面试方法,力求让读者在获得心仪offer的同时,增强技术基本面。也欢迎大家提出宝贵的优化建议,一起交流学习💪 欢迎大家关注Rocky…

LVS精益价值管理系统 DownLoad.aspx 任意文件读取漏洞复现

0x01 产品简介 LVS精益价值管理系统是杭州吉拉科技有限公司研发的一款专注于企业精益化管理和价值流优化的解决方案。该系统通过集成先进的数据分析工具、可视化的价值流映射技术和灵活的流程改善机制,帮助企业实现高效、低耗、高质量的生产和服务。 0x02 漏洞概述…

【数据库】基于PyMySQL连接并使用数据库(代码示例)

这里写目录标题 前言1、安装PyMySQL2、打开要连接的数据库3、创建数据库连接4、获取数据库版本5、新建数据库表6、向表中插入数据7、查询表中的相关记录8、更新表中的相关记录9、删除表中的相关记录10、关闭游标和连接完整代码 前言 本文演示了如何基于PyMySQL使用代码来创建数…

异步获取线程执行结果,JDK中的Future、Netty中的Future和Promise对比

JDK中的Future和Netty中的Future、Promise的关系 三者源头追溯 Netty中的Future与JDK中的Future同名,但是是两个不同的接口。Netty中的Future继承自JDK的Future,而Promise又对Netty中的Future进行了扩展。 JDK中的Future源自JUC并发包: Net…

打卡信奥刷题(19)用Scratch图形化工具信奥B3972 [语言月赛 202405] 二进制 题解

进制转换是经典的编程题,尤其是10进制转换为2进制。方法是拿给定的数,不断地除2,将余数放在对应的位置,剩下的数为对应数除2向下取整 [语言月赛 202405] 二进制 题目描述 在介绍十进制转二进制的篇目中,我们总会看到…

一文读懂:http免费升级https

背景: 随着现在全民网络安全意识的日益提升,各个网站需要实现的https数量也随之提升,那么如何将原本网站的http访问方式升级为https呢? 该内容为如何免费将网站的http访问升级为https访问 论https的加密逻辑: 步骤 …

【计算机网络】初识Tcp协议

💻文章目录 📄前言Tcp基础概念Tcp 的报文格式三次握手四次挥手 Tcp的滑动窗口机制概念超时重传机制高速重传 TCP传输控制机制流量控制拥堵控制慢启动 Tcp的性能优化机制延迟应答捎带应答 📓总结 📄前言 TCP三次握手、四次挥手&…

element-ui 实现输入框下拉树组件(2024-05-23)

用element-ui的 el-input&#xff0c;el-tree&#xff0c;el-popover组件组合封装 import url("//unpkg.com/element-ui2.15.14/lib/theme-chalk/index.css"); <script src"//unpkg.com/vue2/dist/vue.js"></script> <script src"//…

SEO之核心关键词(一)

初创企业需要建站的朋友看这篇文章&#xff0c;谢谢支持&#xff1a; 我给不会敲代码又想搭建网站的人建议新手上云 选择关键词的第一步是确定网站核心关键词。 核心关键词通常就是网站首页的目标关键词。一般来说&#xff0c;整个网站会有很多目标关键词&#xff0c;这些关键…

记一次MySQL执行修改语句超时问题

异常问题 原因分析 这个问题发生在开发环境&#xff0c;怀疑是提交事务时终止项目运行&#xff0c;没有提交该事务&#xff0c;造成死锁 调试该事务时时间太长&#xff0c;为什么说有这个原因呢&#xff0c;因为通过查找日志显示 The client was disconnected by the server …