<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=MZ</id>
	<title>MZ - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.foofun.cn//index.php?action=history&amp;feed=atom&amp;title=MZ"/>
	<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=MZ&amp;action=history"/>
	<updated>2026-05-14T03:36:20Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>http://wiki.foofun.cn//index.php?title=MZ&amp;diff=691&amp;oldid=prev</id>
		<title>Zhang3：创建页面，内容为“{{File formats}}  MS-DOS EXE格式，以MZ签名开头（微软工程师马克·兹比科夫斯基-Mark Zbykowski的首字母缩写），是在MS-DOS 2.0中引入的（1.0版仅采用简单的COM格式）。 它被设计成在实模式下运行的可重新定位的可执行文件。 因此，只有DOS和Windows 9x可以本机使用这种格式，但通过几个自由的DOS模拟器（例如[http://www.dosbox.com/ DOSBox]），可实现在各种操作系统…”</title>
		<link rel="alternate" type="text/html" href="http://wiki.foofun.cn//index.php?title=MZ&amp;diff=691&amp;oldid=prev"/>
		<updated>2022-02-28T08:03:47Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“{{File formats}}  MS-DOS EXE格式，以MZ签名开头（微软工程师马克·兹比科夫斯基-Mark Zbykowski的首字母缩写），是在MS-DOS 2.0中引入的（1.0版仅采用简单的&lt;a href=&quot;/index.php?title=COM&quot; title=&quot;COM&quot;&gt;COM&lt;/a&gt;格式）。 它被设计成在实模式下运行的可重新定位的可执行文件。 因此，只有DOS和Windows 9x可以本机使用这种格式，但通过几个自由的DOS模拟器（例如[http://www.dosbox.com/ DOSBox]），可实现在各种操作系统…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{File formats}}&lt;br /&gt;
&lt;br /&gt;
MS-DOS EXE格式，以MZ签名开头（微软工程师马克·兹比科夫斯基-Mark Zbykowski的首字母缩写），是在MS-DOS 2.0中引入的（1.0版仅采用简单的[[COM]]格式）。 它被设计成在实模式下运行的可重新定位的可执行文件。 因此，只有DOS和Windows 9x可以本机使用这种格式，但通过几个自由的DOS模拟器（例如[http://www.dosbox.com/ DOSBox]），可实现在各种操作系统（如Linux、Amiga、Windows NT等）下运行。 虽然MZ可执行文件可以独立存在，但它们嵌入在所有[[NE]]、[[LE]]和[[PE]]可执行文件中，通常作为以上文件的存根，因此以上文件在DOS下运行时，它们会显示：&lt;br /&gt;
&lt;br /&gt;
    This program cannot be run in MS-DOS mode.&lt;br /&gt;
&lt;br /&gt;
所以也可以使用它们，以便单个可执行文件可以为同一应用程序提供两个入口（例如，一个用于DOS，一个用于Windows）。 如果从命令行提示符启动程序，Windows 9x将运行MZ可执行文件，如果正常启动，则运行PE可执行文件。 在引导加载程序（boot loaders）中，它们可以帮助提供一个DOS版本，尤其是因为UEFI需要PE格式，而其中刚好可以包含一个MZ可执行文件。&lt;br /&gt;
&lt;br /&gt;
==MZ文件结构==&lt;br /&gt;
&lt;br /&gt;
MZ可执行文件仅由两个结构组成：文件头和重定位表（relocation table）。  文件头后面是程序映像，文件头如下所示：&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
|-&lt;br /&gt;
! colspan=2|偏移量&lt;br /&gt;
! 字段&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x00&lt;br /&gt;
|签名（Signature）&lt;br /&gt;
| word&lt;br /&gt;
| 0x5A4D（ASCII表示“M”和“Z”）&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x02&lt;br /&gt;
| Extra bytes&lt;br /&gt;
| word&lt;br /&gt;
|最后一页中的字节数。&lt;br /&gt;
|-&lt;br /&gt;
| 4&lt;br /&gt;
| 0x04&lt;br /&gt;
| Pages&lt;br /&gt;
| word&lt;br /&gt;
| 所有页的数量。&lt;br /&gt;
|-&lt;br /&gt;
| 6&lt;br /&gt;
| 0x06&lt;br /&gt;
| Relocation items&lt;br /&gt;
| word&lt;br /&gt;
| 重新定位表中的条目数。&lt;br /&gt;
|-&lt;br /&gt;
| 8&lt;br /&gt;
| 0x08&lt;br /&gt;
| Header size&lt;br /&gt;
| word&lt;br /&gt;
| 文件头占用的段落数。 其实它可以是任何值，因为加载程序只使用它来查找实际可执行数据的起始位置。 它可能比“标准”字段的头文件占用的空间大，这样如果您想包含自己的文件头元数据，甚至将重定位表放在那里，或者将其用于任何其他目的，都可以使用标准头以后的空间。&lt;br /&gt;
|-&lt;br /&gt;
| 10&lt;br /&gt;
| 0x0A&lt;br /&gt;
| Minimum allocation&lt;br /&gt;
| word&lt;br /&gt;
|程序'''必要'''的段落数，不包括PSP和程序映像。（译者注：PSP指Program Segment Prefix） 如果没有足够大的自由块，加载将停止。&lt;br /&gt;
|-&lt;br /&gt;
| 12&lt;br /&gt;
| 0x0C&lt;br /&gt;
| Maximum allocation&lt;br /&gt;
| word&lt;br /&gt;
|程序'''请求'''的段落数。 如果没有足够大的空闲块，则分配最大的空闲块。&lt;br /&gt;
|-&lt;br /&gt;
| 14&lt;br /&gt;
| 0x0E&lt;br /&gt;
| Initial SS&lt;br /&gt;
| word&lt;br /&gt;
|SS的可重定位段地址。&lt;br /&gt;
|-&lt;br /&gt;
| 16&lt;br /&gt;
| 0x10&lt;br /&gt;
| Initial SP&lt;br /&gt;
| word&lt;br /&gt;
|SP的初始值。&lt;br /&gt;
|-&lt;br /&gt;
| 18&lt;br /&gt;
| 0x12&lt;br /&gt;
|校验和（Checksum）&lt;br /&gt;
| word&lt;br /&gt;
|当和文件中所有其他word求和时，结果应为零。&lt;br /&gt;
|-&lt;br /&gt;
| 20&lt;br /&gt;
| 0x14&lt;br /&gt;
| Initial IP&lt;br /&gt;
| word&lt;br /&gt;
|IP的初始值。&lt;br /&gt;
|-&lt;br /&gt;
| 22&lt;br /&gt;
| 0x16&lt;br /&gt;
| Initial CS&lt;br /&gt;
| word&lt;br /&gt;
|CS的可重定位段地址。&lt;br /&gt;
|-&lt;br /&gt;
| 24&lt;br /&gt;
| 0x18&lt;br /&gt;
| Relocation table&lt;br /&gt;
| word&lt;br /&gt;
|到重定位表的（绝对）偏移量。&lt;br /&gt;
|-&lt;br /&gt;
| 26&lt;br /&gt;
| 0x1A&lt;br /&gt;
| Overlay&lt;br /&gt;
| word&lt;br /&gt;
|用于Overlay管理的值。如果为零，则这是主可执行文件。&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 0x1C&lt;br /&gt;
| Overlay information&lt;br /&gt;
| N/A&lt;br /&gt;
|文件有时包含用于主程序Overlay管理的额外信息。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
段落大小为16字节。页面（或块）的长度为512字节。&lt;br /&gt;
&lt;br /&gt;
如果minimum 和 maximum allocation字段都清除了，MS-DOS将尝试在内存中尽可能高地加载可执行文件。 否则，在内存不足时，映像将加载到256字节PSP结构的正上方。&lt;br /&gt;
&lt;br /&gt;
===重定位===&lt;br /&gt;
&lt;br /&gt;
在将可执行文件加载到内存中之后，程序加载器将遍历重定位表中的每个条目。 对于每个重定位条目，加载器将起始段地址添加到segment:offset对指向的字值中。 因此，例如，重新定位条目0001:001A将使加载程序将起始段地址添加到程序数据中偏移量1*0x10+0x1A=0x2A处的值。&lt;br /&gt;
&lt;br /&gt;
重定位表中的每个指针如下所示：&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
|-&lt;br /&gt;
! colspan=2 |偏移量&lt;br /&gt;
! 字段&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 0&lt;br /&gt;
| 0x00&lt;br /&gt;
| Offset&lt;br /&gt;
| word&lt;br /&gt;
| 在提供的区段内重新安置的偏移量。&lt;br /&gt;
|-&lt;br /&gt;
| 2&lt;br /&gt;
| 0x02&lt;br /&gt;
| Segment&lt;br /&gt;
| word&lt;br /&gt;
| 相对于加载段地址的重新定位段。&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
CS和SS寄存器以类似的方式重新定位。&lt;br /&gt;
&lt;br /&gt;
==初始程序状态==&lt;br /&gt;
* ES和DS寄存器都指向包含PSP结构的段。&lt;br /&gt;
* CS等于文件头中指定的值，通过向其添加起始段地址重新定位。&lt;br /&gt;
* IP等于文件头中指定的值。请注意，与[[COM]]可执行文件不同，MZ程序不会在偏移量0x100处启动。&lt;br /&gt;
* SS等于文件头中指定的值，重新定位，就像CS一样。&lt;br /&gt;
* SP等于文件头中指定的值。&lt;br /&gt;
* 如果PSP中的第一个FCB具有有效的驱动器标识符，则AL为0x00，否则为0xFF。&lt;br /&gt;
* AH与AL相同，但适用于PSP中的第二个FCB。&lt;br /&gt;
* 所有其他寄存器可以设置为0，也可以不设置为0。你应该认为它们都还没有定义。&lt;br /&gt;
&lt;br /&gt;
==PE扩展==&lt;br /&gt;
&lt;br /&gt;
随着[[PE]]可执行文件的出现，微软在MZ头文件中添加了一些项目，在WinNT.h中进行了定义&lt;br /&gt;
&lt;br /&gt;
{| {{wikitable}}&lt;br /&gt;
|-&lt;br /&gt;
! colspan=2 |偏移量&lt;br /&gt;
! 字段&lt;br /&gt;
! 大小&lt;br /&gt;
! 描述&lt;br /&gt;
|-&lt;br /&gt;
| 28&lt;br /&gt;
| 0x1C&lt;br /&gt;
| Reserved&lt;br /&gt;
| qword&lt;br /&gt;
|&lt;br /&gt;
|-&lt;br /&gt;
| 36&lt;br /&gt;
| 0x24&lt;br /&gt;
| OEM identifier&lt;br /&gt;
| word&lt;br /&gt;
|按名称定义，但未提供其他信息；通常为零&lt;br /&gt;
|-&lt;br /&gt;
| 38&lt;br /&gt;
| 0x26&lt;br /&gt;
| OEM info&lt;br /&gt;
| word&lt;br /&gt;
|按名称定义，但未提供其他信息；通常为零&lt;br /&gt;
|-&lt;br /&gt;
| 40&lt;br /&gt;
| 0x28&lt;br /&gt;
| Reserved&lt;br /&gt;
| 20 bytes&lt;br /&gt;
|-&lt;br /&gt;
| 60&lt;br /&gt;
| 0x3C&lt;br /&gt;
| PE header start&lt;br /&gt;
| dword&lt;br /&gt;
| PE头的起始地址&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==另见==&lt;br /&gt;
* [http://web.archive.org/web/20120204110033/http://www.nondot.org/sabre/os/files/Executables/EXE.txt OSRC]&lt;br /&gt;
* [http://www.delorie.com/djgpp/doc/exe/ D.J. Delorie: MZ Header format]&lt;br /&gt;
* [http://www.pinvoke.net/default.aspx/Structures.IMAGE_DOS_HEADER IMAGE_DOS_HEADER]&lt;br /&gt;
* [https://marcin-chwedczuk.github.io/a-closer-look-at-portable-executable-msdos-stub A closer look at Portable Executable MS-DOS Stub]&lt;br /&gt;
* [https://github.com/FDOS/kernel/blob/master/kernel/task.c#L601 FreeDOS kernel's MZ loader source code]&lt;br /&gt;
&lt;br /&gt;
[[Category:Executable Formats]]&lt;/div&gt;</summary>
		<author><name>Zhang3</name></author>
	</entry>
</feed>