2017-09-24 88 views
-2

我听说Assembly语言取决于CPU,事实上.exe文件几乎可以在所有Windows机器上运行。让我想知道这是如何工作的?Executable如何能够在Windows的不同CPU上运行

这是否意味着只有几种汇编语言?

或 Windows系统是否进行某种翻译以适应不同类型的CPU?

+1

因为这些不同的CPU都使用相同的指令集,即x86或x86-64。如果使用不同的ARM,它将不会运行。 Windows甚至不会安装在那。 – Havenard

+0

尝试在32位Windows上运行64位二进制文​​件,并参见 –

+0

@Havenard您最好声明已排除Embedded,IoT和RT 8/8.1。 – iBug

回答

3

答案很简单:

他们不能对 “不同的CPU” 执行。

更复杂的答案:

运行Windows大多数计算机使用仅不同类型的CPU:x86或x86-64的。

  • x86-64与x86兼容,因此您可以在x86-64 CPU上运行针对x86编译的可执行文件。
  • 不能在x86 CPU上运行针对x86-64编译的可执行文件。
  • 有Windows计算机使用不同的CPU(ARM,MIPS,SuperH ...)。您不能在x86-64或x86 CPU上运行为这些CPU编译的可执行文件。另一方面,您只能在上运行针对此类计算机上的特定CPU类型(ARM,MIPS,SuperH ...)编译的可执行文件。

然后有所谓的“.NET”可执行文件。这样的可执行文件不包含任何机器代码,但它们包含特殊的字节代码(类似于Java程序)而不是

当您在某台计算机上第一次运行该程序时,Windows会将该字节代码转换为适合您运行该程序的计算机的机器代码。如果您在ARM计算机上运行该程序,则字节代码将被转换为ARM程序。

计算机将实际执行“翻译”,而不是原始的“.NET”可执行文件。

因为“翻译”是针对特定计算机完成的,所以不需要在不同的CPU上执行。

+1

对Windows 10桌面提供ARM64支持 - 可能使用32位x86仿真来运行现有的WinAPI应用程序。 – eryksun

+0

@eryksun为什么不像他们的操作系统那样,只是简单地重新编译源码包中的所有包?困扰着模拟......疯狂。 – Ped7g

+0

@ Ped7g,实际上,这不会发生。应用程序依赖于不受其控制的封闭源库和其他应用程序。在某些情况下,甚至没有人再有源代码。即使他们拥有所有的代码,它的编写和测试可能都很差,将它移植到新的架构上并不值得花费时间和成本。如果Windows桌面支持ARM64和bootstrap市场支持,则仿真x86是必备功能。 – eryksun