Dosbox是否模拟32位环境或16位环境?

时间:2019-08-01 04:07:11

标签: c x86-16 32-bit turbo-c++ dosbox

Wiki说它是一个x86模拟器。 因此,如果DosBox确实是32位应用程序的仿真器,则要使其支持16位应用程序,它必须在其中包含另一个仿真器,对吗?使其以16位模式运行?(这不是常规操作系统(非仿真器)如何工作吗?) 因此,基本上我和某人有一个论点,他说,turbo cpp编译时会生成16位代码,但是在dosbox上运行时,它的行为就像32位应用程序,是真的吗?以及int变量的大小如何变化?是固定的吗?例如2个字节(16位)和4个字节(32位)?

2 个答案:

答案 0 :(得分:4)

  

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

这很不准确。它是DOS仿真器,而DOS(其接口部分和服务(dosbox中的实现通常在主机端,根本不在仿真硬件中运行))在16位实模式端。但是它模拟80386 HW(实际上,它确实也模拟80486和80586的某些部分,但80386在实际中接近“完整”)。因此,任何DOS应用程序(以实模式启动)都可以将CPU切换到保护模式,这就是许多DOS应用程序所做的,通常使用某种常见的扩展程序(例如DOS4GW等)... dosbox确实可以模拟足够的机器来可以使大多数经典的SW正常工作,但是,如果您是故意的话,您可以轻松创建DOS应用程序,该应用程序可以在真正的硬件上运行,但是由于仿真中缺少某些功能而无法在dosbox中运行。

因此它同时模拟了80386的实模式和受保护模式(通过在模式之间切换80386的方式,您可能会得到一些不太常用的配置,有时称为“虚幻模式” / etc ...而我无法从我的脑海中可以看出,是否可以在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 SW“容易”而无法在dosbox中正常工作的原因。原始dosbox项目有多个分支,它们关心的是硬件仿真的准确性而不是旧软件的可用性(有时,如果仿真仍不完全完善,则提高仿真精度可能会破坏旧软件,但现在它具有不同的缺陷。 )。

  

(来自注释)因此,基本上,如果我要在DosBox中执行一个16位exe文件,它将好像在16位环境中运行,而在32位exe中就像在32位环境中运行就可以了吗?

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

答案 1 :(得分:3)

Dosbox模拟32位x86 CPU。该CPU(包括实型CPU和仿真CPU)都能够运行16位代码,以便与同一系列中的早期16位CPU向后兼容。在Dosbox中运行16位游戏与在实际的80386 PC(也是32位计算机)上运行游戏的过程基本相同。