wordpress   发布时间:2022-04-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了DOS标头中的e_cblp和e_cp是什么?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我正在尝试深入理解DOS标题,我坚持使用这些标题.我知道唯一需要的字节是MZ签名和指向PE部分的指针,但我必须知道这两个是什么: USHORT e_cblp; // Bytes on last page of file USHORT e_cp; // Pages in file 在大多数可执行文件的二进制代码中,这些值分别为90h和03h.一个页面是512字
@H_419_2@
我正在尝试深入理解DOS标题,我坚持使用这些标题.我知道唯一需要的字节是MZ签名和指向PE部分的指针,但我必须知道这两个是什么:

USHORT e_cblp;          // Bytes on last page of file
USHORT e_cp;            // Pages in file

在大多数可执行文件的二进制代码中,这些值分别为90h和03h.一个页面是512字节的代码,所以有3个页面,但在哪里?我在哪里可以找到它们?如何在512字节的最后一页中识别这些90h(144)字节?

此信息仅由DOS请求.将在DOS中运行的PE文件的唯一代码是DOS存根,它不是3页代码而只是64字节.那么,90h和03h必须做什么?我不能只说e_cblp = 01h和e_cp = DOS标头DOS存根?

解决方法

它是“整个”MZ格式可执行文件的大小,忽略了最后一页中最后一个字节的任何内容.当MS-DOS加载MZ格式的可执行文件时,它会在标题之后复制文件中的所有内容,直到达到此限制.因此,大多数PECOFF可执行文件将此字段设置为大于MS-DOS存根的值这一事实意味着当可执行文件在MS-DOS下运行时,PECOFF标头和PECOFF部分数据的一部分将被加载到内存中.

我不知道为什么Microsoft链接器(和GNU链接器,但不是Borland或Watcom)使用的认DOS存根说它的大小为1168字节,实际上要小得多.如果在使用Microsoft的链接器时提供自己的存根,则它使用提供的可执行文件的大小.在加载PECOFF可执行文件时,Windows似乎忽略了此值,并且认的DOS存根对额外数据没有任何用处.

请注意,可以使用Microsoft的链接器创建长度仅为1024字节的有效PECOFF可执行文件.这要求可执行文件只有一个部分,并且大小小于512字节.然Windows将加载并运行可执行文件,但MS-DOS将拒绝,因为文件大小小于MZ标头中给出的1168大小值.

@H_419_2@

大佬总结

以上是大佬教程为你收集整理的DOS标头中的e_cblp和e_cp是什么?全部内容,希望文章能够帮你解决DOS标头中的e_cblp和e_cp是什么?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。