Wiki说它是一个x86模拟器。 那么,如果DosBox确实是32位应用程序的模拟器,那么为了支持16位应用程序,它必须有另一个模拟器,对吗?让它以 16 位模式运行?(常规操作系统(不是模拟器)不是这样工作的吗? 所以基本上我和某人有过这个争论,他说当 turbo cpp 编译时它会生成 16 位代码,但是当你在 dosbox 上运行它时,它的行为就像一个 32 位应用程序,这是真的吗?int 变量的大小如何变化?是固定的吗?比如 2 位的 16 字节和 4 位的 32 字节?
所以,如果DosBox确实是32位应用程序的模拟器
这是非常不精确的。它是DOS模拟器,DOS(它的接口部分和服务(dosbox中的实现通常在主机端,根本不在模拟硬件中运行))位于16位实模式端。但它模拟 80386 硬件(实际上它也模拟了 80486 和 80586 的某些部分,但 80386 与实用性一样接近"完整")。因此,任何DOS应用程序(从实模式开始)都可以将CPU切换到保护模式,这就是许多DOS应用程序所做的,通常使用某种常见的扩展器,如DOS4GW等。dosbox确实模拟了足够的机器,使大多数经典的软件工作,但是如果你是卑鄙的,你可以很容易地创建DOS应用程序,它可以在真正的硬件上运行,但在dosbox中失败,因为仿真中缺少一些功能。
因此,它模拟了 80386的实模式和保护模式(顺便说一下,如何在模式之间切换 80386,您可能会得到不太常见的配置,有时称为"虚幻模式"/等......我无法从我的头脑中判断,这些是否在 dosbox 中准确模拟,但我认为其中大部分工作"足够好"以运行旧的 DOS SW)。
所以基本上我和某人有过这个争论,他说当 turbo cpp 编译时它会生成 16 位代码,但是当你在 dosbox 上运行它时,它的行为就像一个 32 位应用程序,这是真的吗?
不,Borland 的 Turbo C 确实只产生了 16 位实模式机器代码,并且它生成的可执行文件以实模式运行(除非有人竭尽全力将开关实现到保护模式并将其用于他们的部分应用程序代码,但这样的代码必须由不同的编译器编译,或者用汇编编写, 因为 Turbo C 没有对 32 位保护模式的本机支持 - 至少在我知道的版本中没有)。
int 变量的大小如何变化?
这是编译时的事情,取决于编译器。
虽然,如果你在 32b 保护模式下意外运行 16b 实模式机器代码,像xor ax,ax
这样最琐碎的代码实际上会在 32b 模式下作为xor eax,eax
工作,反之亦然(xor eax,eax
为实模式编译,如果意外地在保护模式下运行,将按xor ax,ax
结束运行)。所以在这方面,代码可能会由于混乱而做一些 16b 操作而不是 32b 操作,但对于任何非平凡的代码,它很可能会在很少的指令中遇到一些更重大的差异,这可能会使它崩溃它更搞笑的方式。
关于dosbox的好处:dosbox作者多次拒绝使仿真更准确,并表示他的目标是使dosbox完美适用于那个时代的SW,即他的重点是确保旧的SW按缩进工作,甚至故意在仿真中寻找小瑕疵或间隙。这就是为什么创建新的DOS软件"容易"的原因,它将无法在dosbox中正常工作。原始dosbox项目的多个分支,它们更关心硬件仿真的准确性,而不是旧软件的可用性(有时提高仿真精度可能会破坏旧的软件,如果仿真仍然不完全完美,但现在它有不同的缺陷......
(来自评论)所以基本上,如果我要在 DosBox 中执行一个 16 位 exe 文件,它会像在 16 位环境中一样运行,而 32 位 exe 就像在 32 位环境中一样运行,对吗?
没有 32 位 DOS exe 这样的东西。像《DOOM》这样的游戏确实在32b模式下运行,但exe以16位模式启动,然后它确实处理了交换机本身(例如DOOM确实使用了DOS4GW扩展器,就像那个时代的许多其他游戏一样,这通常表示app的主代码是用C编写的,并使用Watcom编译器编译)。我可以理解为什么有人会称这样的可执行文件为"32 位",如果你知道他们正在切换到保护模式并使用它,但从技术上讲,可执行文件的第一条指令是以 16 位真实模式开始的,就像每个 DOS 可执行文件一样。
Dosbox 模拟 32 位 x86 CPU。 该 CPU,无论是真实类型的还是模拟的,都能够运行 16 位代码,以便与同一系列中早期的 16 位 CPU 向后兼容。 在 Dosbox 中运行 16 位游戏与在真正的 80386 PC(也是一台 32 位机器)上运行游戏本质上相同。