在技术上,我需要一些帮助来描述为什么64位应用程序在32位计算机上的Windows 32位中提示“不是有效的Win32应用程序”?任何MSDN参考都非常欣赏它(我不能谷歌一个可靠的来源)。我知道它不应该运行,但我对此没有很好的解释。
答案 0 :(得分:13)
32位操作系统在32位protected mode中运行。 64位OS在long mode中运行(即64位保护模式)。 64位指令(由64位程序使用)仅在CPU处于长模式时可用;所以你不能在32位操作系统运行的32位保护模式下执行它们。
(以上陈述适用于x86架构)
顺便说一下,“不是有效的Win32应用程序”错误消息的原因是64位可执行文件以PE32 +格式存储,而32位可执行文件以PE32格式存储。 PE32 +文件不是32位Windows的有效可执行文件。它无法理解这种格式。
答案 1 :(得分:7)
以更低级和更详细的方式扩展其他人所说的内容:
编译程序时,将为特定的处理器指令集编写指令。我们所看到的“x = y + z”通常相当于将一个值复制到寄存器中,将add命令与另一个值的内存位置一起传递等等。
特定于这一个问题,64位应用程序需要64位地址空间才能使用。当您将命令传递给32位系统中的处理器时,它会同时处理这32位数据。
重点是什么?在没有创造力的情况下,32位系统上的内存不能超过4千兆字节(2 32 )。一些需要多次操作的任务(比如,处理数字上的简单数学> 40亿无符号)可以在一次操作中完成。更大,更快,但需要与旧系统断开兼容性。
答案 2 :(得分:0)
64位应用程序需要64位CPU,因为它使用64位指令。 32位操作系统会将CPU置于32位模式,从而禁用上述指令。
为什么你期望它能起作用?您正在编译程序以利用32位系统上不存在的功能。
答案 3 :(得分:0)
构建64位体系结构以调用32位CPU不支持的硬件CPU指令,CPU正在模拟这些指令以运行32位操作系统。
答案 4 :(得分:0)
由于理论上可以在指令集的某种仿真模式下运行,一旦应用程序需要的内存超过32位可以解决的内存,就会遇到麻烦。
答案 5 :(得分:0)
64位应用程序不能在32位操作系统上运行的主要原因与底层程序集中使用的寄存器(假设这里是IA-32)语言有关。在32位操作系统和程序中,CPU寄存器能够在寄存器中处理最多32位数据(DWORDS)。在64位操作系统中,寄存器必须处理两位(64),因此必须处理汇编中的QWORD数据大小。编译x86(32位)意味着编译器将寄存器限制为处理32位数据最大值。编译x64意味着编译器允许寄存器处理多达64位的数据。从QWORD(64)下降到DWORD(32)意味着您最终会丢失存储在寄存器中的一半信息。您最有可能得到错误,因为底层编译的机器代码试图将超过32位的数据移动到32位操作系统无法处理的寄存器中,因为其寄存器的最大大小为32位。
答案 6 :(得分:-3)
因为它们根本不同。你不会指望一个法国人懂普通话,所以为什么你会期望一个32位的CPU能够理解64位代码?