"MZ" header 在 DOS 可执行文件中及其对堆栈的影响
"MZ" header in a DOS executable and its effects on the stack
DOS 可执行文件的前 2 个字节是 0x4d 和 0x5a。如果执行这些,0x4d 意味着 'dec ebp' 和 0x5a 是 'pop edx'.
'dec ebp' 将基指针减 1,'pop edx' 将 esp 的值增加 4(x86 汇编)。我的问题是这些操作不会使堆栈处于不一致状态吗?而且由于命令行参数(如果有的话)是相对于 ebp 存储的,这些操作不会使命令行参数无法访问吗?
我可能遗漏了一些明显的东西,如果是的话请逗我...
不同于 COM 类型的可执行文件 - 其中执行从程序映像的第一个字节开始 - EXE 类型的可执行文件不应该以可执行代码开头。在 EXE 文件的开头有一个头块,其中包含实际程序入口点的地址等。
因此字节 'MZ'(或者 - 假设同样有效 - 'ZM')不代表指令。它们只是用于识别格式的标记。
维基百科文章 DOS MZ executable 中有一个很好的概述。
注意:可执行文件的 DOS 部分是隐含的 16 位实模式,应该这样反汇编,而不是 32 位代码。
DOS 可执行文件的前 2 个字节是 0x4d 和 0x5a。如果执行这些,0x4d 意味着 'dec ebp' 和 0x5a 是 'pop edx'.
'dec ebp' 将基指针减 1,'pop edx' 将 esp 的值增加 4(x86 汇编)。我的问题是这些操作不会使堆栈处于不一致状态吗?而且由于命令行参数(如果有的话)是相对于 ebp 存储的,这些操作不会使命令行参数无法访问吗?
我可能遗漏了一些明显的东西,如果是的话请逗我...
不同于 COM 类型的可执行文件 - 其中执行从程序映像的第一个字节开始 - EXE 类型的可执行文件不应该以可执行代码开头。在 EXE 文件的开头有一个头块,其中包含实际程序入口点的地址等。
因此字节 'MZ'(或者 - 假设同样有效 - 'ZM')不代表指令。它们只是用于识别格式的标记。
维基百科文章 DOS MZ executable 中有一个很好的概述。
注意:可执行文件的 DOS 部分是隐含的 16 位实模式,应该这样反汇编,而不是 32 位代码。