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

C Dosbox是模拟32位环境还是16位环境?,c,x86-16,32-bit,turbo-c++,dosbox,C,X86 16,32 Bit,Turbo C++,Dosbox,维基说它是一个x86模拟器。 所以,如果DosBox确实是32位应用程序的仿真器,为了支持16位应用程序,它必须有另一个仿真器,对吗?让它在16位模式下运行?(这不是常规操作系统(不是模拟器)的工作方式吗?) 所以基本上我和某人有过这样的争论,他说当TurboCPP编译时,它会生成16位代码,但当你在dosbox上运行它时,它的行为就像一个32位的应用程序,是真的吗?一个int变量的大小是如何变化的?修好了吗?16位是2字节,32位是4字节 因此,如果DosBox确实是32位应用程序的仿真器 那

维基说它是一个x86模拟器。 所以,如果DosBox确实是32位应用程序的仿真器,为了支持16位应用程序,它必须有另一个仿真器,对吗?让它在16位模式下运行?(这不是常规操作系统(不是模拟器)的工作方式吗?) 所以基本上我和某人有过这样的争论,他说当TurboCPP编译时,它会生成16位代码,但当你在dosbox上运行它时,它的行为就像一个32位的应用程序,是真的吗?一个int变量的大小是如何变化的?修好了吗?16位是2字节,32位是4字节

因此,如果DosBox确实是32位应用程序的仿真器

那是相当不精确的。它的DOS模拟器和DOS(其接口部分和服务(dosbox中的实现通常在主机端,根本不在仿真硬件中运行))都在16位实模式端。但它模拟了80386HW(实际上它也模拟了80486和80586的一些部分,但80386是接近“完整”的,因为它是实用的)。因此,任何DOS应用程序(在实模式下启动)都可以将CPU切换到保护模式,这就是许多DOS应用程序所做的,通常使用某种常见的扩展器,如DOS4GW等。。。dosbox确实模拟了足够多的机器,使大多数经典软件都能工作,但如果你是认真的,你可以很容易地创建DOS应用程序,该应用程序可以在真正的硬件上工作,但在dosbox中失败,因为模拟中缺少一些功能

因此,它模拟了80386的真实模式和保护模式(顺便说一下,如何在模式之间切换80386,您可能会得到不太常见的配置,有时称为“非真实模式“/等等……我无法从我的头脑中判断,这些是否在dosbox中得到了准确的模拟,但我认为它的大部分工作“足够好”以运行旧的DOS软件)

所以基本上我和某人有过这样的争论,他说当TurboCPP编译时,它会生成16位代码,但当你在dosbox上运行它时,它的行为就像一个32位的应用程序,是真的吗

不,Borland的Turbo C只生成16位实模式机器代码,它生成的可执行文件以实模式运行(除非有人不遗余力地将switch实现为保护模式,并将其用于部分应用程序代码,但这些代码必须由不同的编译器编译,或以汇编方式编写,因为Turbo C不支持32位保护模式的本机支持,至少在我所知的版本中是这样)

一个int变量的大小是如何变化的

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

尽管如此,如果意外地在32b保护模式下运行16b实模式机器代码,最简单的代码片段(如
xor ax,ax
)实际上将在32b模式下工作,如
xor eax,eax
,反之亦然(
xor-eax,eax
编译为实模式,如果意外地在保护模式下运行,将以
xor-ax,ax
结束操作)因此,在这方面,代码可能会因为混淆而执行一些16b操作,而不是32b操作,但对于任何非平凡的代码,它很可能会在很少的指令中遇到一些更大的差异,这可能会使它以更有趣的方式崩溃


dosbox的好处:dosbox的作者多次拒绝让仿真更精确,他说他的目标是使dosbox完美地适合那个时代的软件,即他的重点是确保旧软件的工作方式是缩进的,甚至是故意在仿真中出现小的缺陷或间隙。这就是为什么它“容易”的原因创建无法在dosbox中正常工作的新DOS软件。原始dosbox项目有多个分支,它们更关心硬件仿真精度,而不是旧软件的可用性(有时,如果仿真仍然不完全完美,但现在它有不同的缺陷,则提高仿真精度可能会破坏旧软件…)

(来自评论)所以基本上,如果我在DosBox中执行一个16位的exe文件,它会像在16位环境中一样运行,像在32位环境中一样运行,对吗


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

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

Dosbox或多或少地模拟32位386 CPU。CPU具有16位实模式(模拟器启动时的默认模式)DOS使用的模式。如果软件需要运行16位和32位保护模式代码,可以将其切换到16位或32位保护模式。就像真正的386 CPU上的16位代码一样,可以在16位实模式下使用32位寻址。短、int、long的大小(我想你说的是C/C++)依赖于用于编译的工具。所有x86的祖父8086有一个20位的地址总线,但只有16位寄存器。因此他们发明了“分段”寻址,例如,将两个寄存器组合起来组成一个20位值。为此,一个“分段寄存器”的值像DS一样,左移4位,然后将另一个寄存器的值加到这个寄存器上,得到20位地址。较新的386有大多数寄存器,地址总线都是32位宽。这些可以是u