Dosbox 模拟 32 位环境还是 16 位环境?

Does Dosbox emulate a 32bit enviroment or a 16bit environment?

Wiki 说它是一个 x86 模拟器。 所以,如果 DosBox 确实是 32 位应用程序的模拟器,那么为了支持 16 位应用程序,它必须有另一个模拟器,对吗?使其在 16 位模式下变为 运行?(这不是常规操作系统(不是模拟器)的工作方式吗?) 所以基本上我和某人发生了这个争论,他说当 turbo cpp 编译时它生成 16 位代码,但是当你 运行 它在 dosbox 上时它表现得像一个 32 位应用程序,这是真的吗? int 变量的大小如何变化?是固定的吗?比如 16 位 2 个字节和 32 位 4 个字节?

So, if DosBox is indeed an emulator for 32 bit applications

这很不准确。它是 DOS 模拟器,而 DOS(它的接口部分和服务(在 dosbox 中的实现通常在主机端,根本不是 运行ning 在仿真硬件中))在 16 位实模式端。但它模拟了 80386 HW(实际上它也模拟了 80486 和 80586 的某些部分,但 80386 在实际应用中接近 "complete")。所以任何 DOS 应用程序(从实模式开始)都可以将 CPU 切换到保护模式,这就是许多 DOS 应用程序所做的,通常使用某种常见的扩展程序,如 DOS4GW 等......dosbox 确实足够模拟使大多数经典 SW 工作的机器,但如果你是卑鄙的人,你可以轻松创建 DOS 应用程序,它可以在真正的硬件上工作但在 dosbox 中失败,因为在仿真中缺少一些功能。

所以它模拟了 80386 的实模式和保护模式(顺便说一句,你如何在模式之间切换 80386 你可能会得到不太常见的配置,有时称为 "unreal mode"/等等......我无法从我的脑海中判断出这些是否在 dosbox 中准确模拟,但我认为它的大部分工作 "good enough" 到 运行 旧 DOS SW)。

So basically I had this argument with someone, he said that when turbo cpp compiles it generates 16 bit code, but when you run it on dosbox it behaves like a 32 bit application, is that true?

不,Borland 的 Turbo C 确实只生成 16 位实模式机器代码,并且由它生成的可执行文件 运行ning 在实模式下(除非有人竭尽全力实现切换到保护模式和将其用于他们的部分应用程序代码,但此类代码必须由不同的编译器编译,或以汇编语言编写,因为 Turbo C 没有对 32 位保护模式的本机支持——至少在我所知道的版本中没有).

and how does the size of an int variable change?

那是编译时的事情,取决于编译器。

尽管如此,如果您 运行 不小心将 16b 实模式机器代码置于 32b 保护模式,最普通的代码片段 xor ax,ax 实际上可以在 32b 模式下运行 xor eax,eax,反之亦然(xor eax,eax为实模式编译,如果不小心运行处于保护模式,将结束运行为xor ax,ax)。所以在这方面,代码可能由于混淆而执行一些 16b 操作而不是 32b 操作,但对于任何非平凡的代码,它很可能在少数指令中遇到一些更主要的差异,这可能会使它以更搞笑的方式崩溃.

关于 dosbox 的好处:dosbox 作者多次拒绝让仿真更准确,他说他的目标是让 dosbox 完美地适应那个时代的 SW,即他的重点是确保旧 SW 工作如缩进所示,甚至有意针对仿真中的小缺陷或间隙。这就是为什么要 "easy" 创建新的 DOS 软件,它不能在 dosbox 中正常工作的原因。原始dosbox项目有多个分支,它们更关心硬件仿真的准确性而不是旧软件的可用性(有时提高仿真精度可能会破坏旧软件,如果仿真仍然不完全完美,但现在它有不同的缺陷.. .).

(from comments) So basically if I were to execute a 16 bit exe file in DosBox, it would run as though it were on a 16 bit environment and a 32 bit exe as though it were on a 32 bit environment right?

没有 32 位 DOS exe 之类的东西。像 DOOM 这样的游戏确实 运行 在 32b 模式下,但 exe 以 16 位模式启动,然后它自己处理开关(例如 DOOM 确实使用了 DOS4GW 扩展程序,就像那个时代的许多其他游戏一样,这通常表明应用程序的主要代码是用 C 编写的,并使用 Watcom 编译器编译)。我能理解为什么有人会称这样的可执行文件为“32 位”,如果你知道他们正在切换到保护模式并使用它,但从技术上讲,可执行文件的第一条指令是从 16 位实模式开始的,就像每个 DOS 可执行文件一样。

Dosbox 模拟 32 位 x86 CPU。 CPU,无论是真实的还是模拟的,都能够使用 运行 16 位代码,以便与同一系列中早期的 16 位 CPU 向后兼容。 运行 Dosbox 中的 16 位游戏与 运行 真正的 80386 PC(也是 32 位机器)上的游戏基本相同。