使用不同的指令集架构编译相同的源代码

时间:2016-02-22 06:42:40

标签: assembly compilation isa

好的,据我所知,对于不同的CPU有很多不同类型的ISA,例如x86,MIPS等。当编译器在不同的ISA环境中编译源代码(C ++ / JAVA)时,会生成汇编代码也会有所不同。然后,我想知道生成的二进制机器代码是否会有所不同或只是相同?我的猜测是生成的二进制代码是一样的,否则不同的CPU怎么能在不同的计算机上运行同一段exe文件?我想知道我的假设是否正确。谢谢你的澄清!

1 个答案:

答案 0 :(得分:2)

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

int a;

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

使用GCC编译器编译32位x86:

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

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

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 exectuables:

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

当您在Windows上执行.NET .exe文件时,第一次将.exe文件中与CPU无关的代码转换为仅x86(或仅ARM或其他)代码,并且“已翻译”的变体将存储在临时目录中。实际上将执行临时目录中的文件。

Java的工作方式类似,但有点复杂......