【问题标题】:Compile same piece of source code with different Instruction Set Architecture使用不同的指令集架构编译相同的源代码
【发布时间】:2016-02-22 06:42:40
【问题描述】:

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

【问题讨论】:

  • “否则不同的CPU怎么能在不同的电脑上运行同一份exe文件?”你怎么会觉得他们可以呢? Raspberry PI 无法运行为基于 x86/Windows 的 PC 构建的可执行文件(反之亦然)。至少不是没有某种模拟器。如果您谈论的是两台基于 x86 的 PC(运行相同类型的操作系统),那么简单的答案是它们共享相同的 CPU 架构。

标签: assembly compilation instruction-set


【解决方案1】:

为不同的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 或其他)代码,并且“已翻译”变体将存放在临时目录中。临时目录中的文件实际上会被执行。

Java 的工作原理类似,但稍微复杂一些...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 1970-01-01
    相关资源
    最近更新 更多