在现代CPU上运行8086汇编编写的游戏

时间:2017-07-23 16:40:47

标签: assembly dos x86-16

我为8086处理器编写了一个游戏,并在名为DOSBox的DOS模拟器上运行。

现在我想向其他人展示游戏而不必下载模拟器。基本上,我想将8086程序集编译为现代操作系统的可执行文件。这可能,还是应该将其转换为另一种汇编语言?如果是这样,有没有办法自动进行此转换?

1 个答案:

答案 0 :(得分:15)

问题不在于汇编语言,而在于运行时环境。

现代x86处理器运行用8086汇编语言编写的代码绝对没有问题。新芯片与8086几乎100%向后兼容。实际上,它们只是一个(非常)快速的8086启动。

不起作用的部分是程序中希望在DOS之上运行的部分。您几乎肯定会调用DOS API(通过中断)并执行其他特定于平台的事情。这就是为什么你需要DOSBox模拟器:不要模拟以便运行DOS,程序然后运行在其上。

在某些情况下,您可以在Windows下使用虚拟DOS机在控制台环境中运行DOS应用程序,但存在一些非常重要的限制。首先也是最重要的是,64位版本的Windows无法在所有中运行16位DOS应用程序,因此这只适用于32位版本的Windows。其次,DOS程序有很多假设(比如,它们直接在硬件上运行,因此可以与它们进行交互,但是它们需要)与在Windows上运行模拟不兼容。游戏尤其因这些假设和不兼容的行为而臭名昭着,这些行为都是由专业软件公司在20世纪80年代撰写的,以及您今天可能写的。为什么?因为游戏需要绝对的速度来获得良好的图形效果,所以他们做的事情就像直接写入视频内存而不是调用慢速的DOS API来做。

你可以重写你的游戏而不是依靠DOS,但那将是大规模的承诺,相当于完全重写。这就像将程序从Windows移植到Macintosh。您必须检查所有正在调用的系统函数,并将它们更改为Windows(或任何其他操作系统)上的等效函数。这已经是一项艰巨的任务,但在某些情况下,您甚至可能会发现 没有直接备用,因此您需要重写代码。有一些方法可以编写代码来促进这种类型的平台可移植性(例如,清楚地分离驱动游戏逻辑的代码和进行系统调用的代码),但是你可能没有编写汇编代码记住了。

它可能不是很漂亮,但最好的解决方案是将游戏打包到DOS环境,如DOSBox,它是GPL许可的。其他虚拟化软件也可以使用。例如,VM VirtualBox,其中VM运行MS-DOS或GPL许可FreeDOS。作为Ross Ridge says,这就是公司在GOG.com和Steam上销售旧的MS-DOS游戏的行为。