使用不同的指令集体系结构编译同一段源代码

Compile same piece of source code with different Instruction Set Architecture

OK,据我了解不同的CPU有很多不同类型的ISA,比如x86,MIPS等。当编译器编译源代码时(C++/JAVA) 在不同的ISA环境下,生成的汇编代码也会不同。然后,我想知道生成的二进制机器代码是否也会不同或只是相同????我胡乱猜测生成的二进制代码应该是一样的,不然怎么会CPU 运行同一个exe文件在不同的电脑上不同呢??我想知道我的假设是否正确。感谢您的澄清!

不同的CPU生成的二进制码是不同的。一个 C 程序示例:

int a;

int b(int c)
{
    return a+c;
}

使用适用于 32 位 x86 的 GCC 编译器编译:

8b 44 24 04             // mov    0x4(%esp), %eax
03 05 xx xx xx xx       // add    a, %eax
c3                      // ret

使用 MIPS 的 GCC 编译器编译的相同程序:

3c 1c xx xx 27 9c xx xx  // la      gp, GOT  - actually 2 instructions!
8f 82 xx xx 00 00 00 00  // la      v0, a    - actually 2 instructions!
8c 42 00 00              // lw      v0,0(v0)
03 e0 00 08              // jr      ra
00 44 10 21              // addu    v0, v0, a0

当然,x86 的 .exe 文件不能在 MIPS 上运行,反之亦然!

Java 和 .NET 可执行文件是一个例外:

这些类型的可执行文件包含一种特殊类型的代码,既不能由 x86 执行,也不能由 MIPS、ARM 或 PPC 执行。但是,此代码的设计方式使其可以轻松转换为与机器相关的代码。

当您第一次在 Windows 上执行 .NET .exe 文件时,.exe 文件中的 CPU 独立代码将被转换为仅限 x86(或仅限 ARM 或whatever) 代码和 "translated" 变体将存储在一个临时目录中。临时目录中的文件将实际执行。

Java 工作原理类似但有点复杂...