DOS 可执行文件中的“MZ”标头及其对堆栈的影响

Tar*_*n R 1 assembly stack dos

DOS 可执行文件的前 2 个字节是 0x4d 和 0x5a。如果这些被执行,0x4d 意味着'dec ebp',0x5a 是'pop edx'。

'dec ebp' 将基指针减 1,'pop edx' 将 esp 的值增加 4(x86 程序集)。我的问题是这些操作不会使堆栈处于不一致的状态吗?而且由于命令行参数(如果有)是相对于 ebp 存储的,这些操作不会使命令行参数无法访问吗?

我可能遗漏了一些明显的东西,如果是这样,请幽默我...

Dar*_*zka 5

与 COM 类型的可执行文件(从程序映像的第一个字节开始执行)不同,EXE 类型的可执行文件不应以可执行代码开头。在 EXE 文件的开头有一个标题块,其中包含实际程序入口点的地址等。

因此,字节“MZ”(或 - 据称同样有效 - 'ZM')不代表指令。它们只是用于识别格式的标记。

维基百科文章DOS MZ executable 中有一个很好的概述。

注意:可执行文件的 DOS 部分是隐式的 16 位实模式,应该按原样反汇编,而不是 32 位代码。