【发布时间】:2020-12-11 22:55:33
【问题描述】:
我正在研究 .EXE 程序和 .COM 程序之间的区别。 .EXE 对我来说是合乎逻辑的,堆栈相对于程序代码位于另一个段(实际上堆栈是强制的,并用 .STACK 指示此限制),因此,当我去插入值时堆栈(在 .EXE 中),使用与程序不同的段,我不会混淆这两者。
例子:
SP = 0400
SS = 3996 CS = 3995 IP = 0000
栈的容量为1024 Byte (400h),指的是栈段3996h,与代码段3995h不同。所以我确信数据不会混淆。
但我不明白的是,当我必须处理 .COM 程序时;因为我很清楚他们只使用一个片段,我发现自己遇到了类似的情况:
SP = FFEE
SS = 114A CS = 114A IP = 0100
我有与代码段匹配的堆栈段。那么如果我一直把值放在栈上,它们迟早会出现在我的代码中吗?
【问题讨论】:
-
是的,栈最终会和你的代码段发生冲突。
-
虽然我只能推测 COM 格式仅支持单个段,但我认为是 (a) 因为该模型允许您将 8086 视为 16 位机器,忽略所有段寄存器和 (b ) 因为早在 DOS 1 发布时,IBM 在任何常规配置中都没有配备超过 64k 的内存,而且这么多内存被认为是非常离谱的。
-
“那么如果我一直把值放在栈上,它们迟早会出现在我的代码中吗?”当然,考虑到 8086 段的工作方式,即使堆栈段与代码段不同,如果它们重叠,也可能发生这种情况。他们通常会这样做,因为谁需要一个完整的 64K 单独堆栈?
-
@Fuz:我相信唯一不支持的 DOS 版本是 IBM PC-DOS 1.0,它基本上是当时最新的 86-DOS 的更名版)。 86-DOS 不支持 EXE 文件格式(除了后来制造 86-DOS 的公司最终使用了 OEM MS-DOS 1.25)。 MSDOS 版本从支持 EXE 文件格式的 1.24 开始。 1.24 成为 IBM PC-DOS 1.1 的基础(因此 IBM PC-DOS 1.1+ 支持 EXE)。 MS-DOS 编号不是从 1.0 开始的,因为它们延续了 86-DOS 的编号方案。 CP/M-86也不支持EXE格式。
标签: assembly dos x86-16 memory-segmentation