简单的答案是
看到你需要了解两件事
在 64 位平台上编译并不意味着您的应用程序是 64 位的。您可以在 64 位平台上编译 32 位应用程序。
-
现在看看你在计算机上运行的程序或应用程序的所有内容都是由处理器执行的,因此每个程序在被处理器执行之前的最后时刻都会被转换或目标代码或机器代码,而这些“位”实际上代表处理器拥有的“寄存器”(处理器使用的内存类型)的大小。所以关键是每当像程序 C++ 这样的高级语言被转换为机器代码时。编译器遵循这些步骤(简单来说)
您的源代码 ---> 转换为系统特定程序集 ---> 二进制代码
然后这个二进制代码由处理器执行。
现在看到我提到的汇编语言是特定于机器/处理器的。 ARM 处理器、x86 处理器、PowerPC 处理器等不同。(这些是处理器架构)
现在假设我们现在正在考虑 32 位 Intel 处理器 (x86) 将如何运行 64 位程序
您编写了一个用于将数字 10 和 20 相加的程序并编译了二进制文件以直接在处理器上运行(暂时忘记操作系统及其库)
现在让我们看看“您的源代码”转换为 32 位汇编程序和 64 位汇编程序
汇编输出(32 位或 x86 代码)
mov eax, 10
add eax, 20 ;OUTPUT IS SAVED TO "EAX" REGISTER WHICH IS A 32 BITS REGISTER
汇编输出(64 位或 x86_64 代码)
mov rax, 10
add rax, 20 ;OUTPUT IS SAVED TO "RAX" REGISTER WHICH IS A 64 BIT REGISTER
现在这些汇编程序被逐行转换为二进制代码
当您在 32 位处理器上运行 64 位代码的输出二进制文件时,32 位处理器甚至不知道“RAX”是什么,这将立即导致中断(来自处理器的错误)
处理器寄存器的图像如图所示(x86_64特定)
为简单起见,处理器内部有许多可用寄存器,我只使用 x86_64 处理器的 EAX 和 RAX 寄存器。对于 x86_64 处理器(64 位),知道这些“RAX”和“EAX”是什么意思。但是 32 位处理器(x86)不会理解“RAX”的含义。这就是为什么 32 位程序可以在 64 位机器上运行而相反是不可能的唯一原因....
注意:它不仅仅是寄存器,还有处理器特定的指令。较新处理器支持的所有指令可能不被较旧处理器支持。
示例:“imul reg, reg”(整数乘法)指令仅适用于 Intel 80386 及更高版本
我知道这有点令人困惑。解释起来有点复杂。我仍然希望这能解决您的问题。