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