【古董技术】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     长度(去掉最后一个字节的)             (总长度,含自身)
  • 未完待续

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

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

相关文章

C++第十七弹---string使用(下)

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】 目录 1、标准库中的string类 1.1、string类的常用接口说明 1.1.1、string类对象的修改操作 1.1.2、string类对象非成员函数重载 总结 1、标准库中的…

牛客热题:有效括号

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:有效括号题目链接方法一&#x…

MySQL视图教程(01):创建视图

MySQL 创建视图 在 MySQL 中, CREATE VIEW 语句用于创建一个数据库视图(View)。 MySQL 是一种常用的关系型数据库管理系统,提供了 CREATE VIEW 语法,用于创建视图(View)。视图是一种虚拟的表&…

Mycat+Mysql搭建数据集群实现数据分片存储

前言 MyCAT介绍 * 一个彻底开源的,面向企业应用开发的“大数据库集群”; * 支持事务、ACID、可以替代MySQL的加强版数据库; * 一个可以视为“MySQL”集群的企业级数据库,用来替代昂贵的Oracle集群; * 一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL; * 一个新颖…

QCC---DFU升级变更设备名和地址

QCC---DFU升级变更设备名和地址 这个很多人碰到这个疑问,升级了改不了设备名和地址 /******************************************************************************* Copyright (c) 2018 Qualcomm Technologies International, Ltd. FILE NAME sink_dfu_ps.c DESCRIPT…

2024.5.1学习记录

1、代码随想录:贪心刷题 2、react 高级使用( hoc render、props、函数组件、serState 传送门等) 3、游山玩水

《拯救大学生课设不挂科第四期之蓝桥杯是什么?我是否要参加蓝桥杯?选择何种语言?如何科学备赛?方法思维教程》【官方笔记】

背景: 有些同学在大一或者大二可能会被老师建议参加蓝桥杯,本视频和文章主要是以一个过来人的身份来给与大家一些思路。 比如蓝桥杯是什么?我是否要参加蓝桥杯?参加蓝桥杯该选择何种语言?如何科学备赛?等…

2023年信息素养大赛小学组C++智能算法复赛试题解析

2023年信息素养大赛小学组C++智能算法复赛真题 智能算法挑战复赛小学组(总共4道题)T1. 判断数字出现了几次 【题目描述】 给定一个正整数 n,判断从 1 到这个数本身的所有数中,一共出现了多少次数字k。 【输入格式】 输入共1行,包括一个正整数n和一个正整数k。(0<n<…

JavaEE之线程(7)_单例模式(设计模式概念、单例模式优点、懒汉、饿汉模式)

一、什么是设计模式&#xff1f; 单例模式是设计模式中较为常见的一种。那么&#xff0c;什么是单例模式&#xff1f; 设计模式&#xff08;Design Pattern&#xff09;都是一些相对优秀的解决方案&#xff0c;很多问题都是典型的、有代表性的问题&#xff0c;学习设计模式&am…

C#面:如果出现ASP.NET中的事件不能触发可能由于什么原因造成

当 ASP.NET 中的事件不能触发时&#xff0c;可能由以下几个原因造成&#xff1a; 事件绑定错误&#xff1a;请确保事件正确地绑定到相应的控件上。在 ASP.NET 中&#xff0c;可以通过在前端代码或者后端代码中使用事件处理程序来绑定事件。如果事件没有正确地绑定到控件上&…

为什么本科毕业后我坚定地选择了就业而不是考研?

大家好&#xff0c;我是小布丁。今天来聊聊我为什么本科毕业后选择了就业而不是考研。 在整个大学期间&#xff0c;我被亲戚拷问最多的问题就是&#xff1a;准备考研吗&#xff1f;相信很多大学生都遇到过这种情况吧。 如果你说准备还好&#xff0c;亲戚大概率就不会问下去&a…

js计算字符串大小存储所占字节数

在JavaScript中&#xff0c;计算字符串所占的大小&#xff08;占用的字节数&#xff09;并不直接&#xff0c;但可以通过一些方法间接得到。 我们需要知道一个前提&#xff0c;英文字母 lenght 和字节数是一样的&#xff1a;都是1&#xff0c;而中文 lenght1&#xff0c;字节数…

golang sqlite主从数据同步插件开发

### golang sqlite主从数据同步插件开发思路 参考Mysql的主从同步机制&#xff0c;Mysql是产生binlog&#xff0c;然后把binlog日志同步到从服务上。 同理&#xff0c;我们按sql执行顺序记录所有的增删改查的sql语句&#xff0c;然后调用接口把sql语句传到从服务上执行。 数…

关于软件设计模式的理解

系列文章 关于时间复杂度o(1), o(n), o(logn), o(nlogn)的理解 关于HashMap的哈希碰撞、拉链法和key的哈希函数设计 关于JVM内存模型和堆内存模型的理解 关于代理模式的理解 关于Mysql基本概念的理解 关于软件设计模式的理解 文章目录 前言一、软件设计模式遵循的六大原则…

前端面试题日常练-day35 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 1. 以下哪个是使用jQuery选择所有具有CSS类名"myClass"的元素的正确语法&#xff1f; a) $(".myClass") b) $("myClass") c) $("#myClass") d) $("…

FURNet问题

1. 为什么选择使用弱监督学习&#xff1f; 弱监督学习减少了对精确标注数据的依赖&#xff0c;这在医学图像处理中尤为重要&#xff0c;因为高质量标注数据通常需要大量专业知识和时间。弱监督学习通过利用少量标注数据或粗略标注数据来训练模型&#xff0c;降低了数据准备的成…

元组推导式

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 使用元组推导式可以快速生成一个元组&#xff0c;它的表现形式和列表推导式类似&#xff0c;只是将列表推导式中的“[]”修改为“()”。例如&#xf…

python深入解析字符串操作的八大神技

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、字符串的长度与切片 示例代码 二、去除多余的空格 示例代码 三、字符串的开头与包含…

元组的创建和删除

目录 使用赋值运算符直接创建元组 创建空元组 创建数值元组 删除元组 自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 元组&#xff08;tuple&#xff09;是Python中另一个重要的序列结构&#…

JavaScript 获取 HTML 中特定父元素下的子元素

JavaScript 获取 HTML 中特定父元素下的子元素 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <title>查找子元素示例</title> </head> <body><div id"parent"><p&…