Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Translation 是否有将DOS机器代码翻译到Windows环境的工具?_Translation_Dos_Backwards Compatibility_Machine Code - Fatal编程技术网

Translation 是否有将DOS机器代码翻译到Windows环境的工具?

Translation 是否有将DOS机器代码翻译到Windows环境的工具?,translation,dos,backwards-compatibility,machine-code,Translation,Dos,Backwards Compatibility,Machine Code,在Windows环境中运行DOS程序时,通常使用DOS仿真器。但是,这是一个速度慢、CPU占用量大的解决方案,有很多限制。这个想法打动了我;简单地翻译/改编打算在DOS中运行的机器代码,使其在Windows中运行,难道不是更能提高CPU效率吗?就您的知识而言,有什么工具可以完成这项工作吗? 它甚至可以创建exe文件,可以在DOS和Windows中运行。这是可能的,因为所有PE格式的Windows exe文件都包含一个初始DOS标头,后跟DOS代码,如果文件在DOS中运行,该代码会指示计算机显示错

在Windows环境中运行DOS程序时,通常使用DOS仿真器。但是,这是一个速度慢、CPU占用量大的解决方案,有很多限制。这个想法打动了我;简单地翻译/改编打算在DOS中运行的机器代码,使其在Windows中运行,难道不是更能提高CPU效率吗?就您的知识而言,有什么工具可以完成这项工作吗?

它甚至可以创建exe文件,可以在DOS和Windows中运行。这是可能的,因为所有PE格式的Windows exe文件都包含一个初始DOS标头,后跟DOS代码,如果文件在DOS中运行,该代码会指示计算机显示错误消息。DOS代码之后是其他PE头,然后是Windows兼容代码。可以将显示错误消息的DOS代码替换为来自DOS程序的真实代码,然后在PE头后面的Windows兼容代码中,您可以放置一个转换器,该转换器翻译DOS代码,然后将执行转移到它


相反,尽管难度更大,但也有可能。您只需使用一个windows程序,将显示错误的dos代码替换为将windows兼容代码翻译/改编为dos环境,然后将执行转移到dos环境的代码。

理论上这是可能的。在实践中,我认为,我只看到了相反的一面:DOS扩展器模拟Win32 API的一个子集,并允许简单的Windows应用程序在DOS中运行

DOS有两个问题:

  • 一切都可以访问(特权指令、所有/大部分硬件)
  • 它从部分时间到大部分时间都以实寻址模式运行
  • 因此,如果您仍想访问所有内容,则需要模拟或虚拟化许多内容(CPU、内存、中断、各种设备)。否则它将无法与其他任何事物和平共处。DOSBox已经为您完成了大部分工作

    x86系统支持64位。这有一个CPU设计缺陷。一旦CPU处于64位(又称长)模式,它就不能再在实寻址模式或虚拟8086模式下执行16位代码。这方面的兼容性不是在CPU中设计或实现的(比如说,多亏了AMD和intel)。因此,要么丢失64位和所有需要它的内容,要么丢失DOS。有一种硬件虚拟化(intel VT/AMD Pacifica),它可以恢复16位,但您需要一个虚拟机监控程序,而且,由于没有魔力(虚拟机监控程序本身不能使一台电脑变成两台电脑),您仍然需要模拟/虚拟化DOSBox所做的许多事情

    没有廉价有效的解决方案。除了一台专门用于DOS的旧电脑之外。而且这些越来越难以获得和维护


    我认为你严重低估了所需的工作量和所涉及的复杂性。如果无法重写程序,请使用仿真器或虚拟机。如果可以,请重写它以在Windows本机上工作。另一种选择可能是简单地将DOSBox或类似的程序与程序捆绑在一起,使其仅显示为一个Windows程序,可能只是一个包含所有内容的.exe。

    由于DOS程序只能访问一点点内存,即使是在实模式下,我认为在Windows下也很容易将内存转移到虚拟模式,因此,在DOS下访问的内存将在Windows中以虚拟模式由单个应用程序使用。我认为直接访问硬件不会是一个问题,您只需在Windows中用不同的API函数替换它即可访问硬件。我认为代码的翻译也可以在64位模式下运行。这将是一个很酷的项目。我很惊讶以前没有人想到这个巧妙的解决方案。@user504882 DOS程序可以通过himem.sys和DPMI主机访问相当多的内存。对于“mov dword[0xb8000],eax”或“out 0x20,al”,您会调用什么“Windows中的API函数”?在考虑Windows API之前,难道你不需要先截取和解码这些指令吗?静态和动态二进制翻译并不是什么新鲜事,已经存在了几十年。为任何特定的源和目标环境找到一个好的,那是另一回事了。您也可以轻松地在虚拟机中运行它,在虚拟机中,处理器可以本机运行的指令和属于程序的地址空间,当它超出其地址空间时,虚拟机将接管并模拟该事务,这与在虚拟机中运行windows或linux或其他程序没有什么不同。这里再次找到一个好的主人和客人,另一个故事