Assembly 用不同的指令集架构编译同一段源代码
好的,据我所知,对于不同的CPU有许多不同类型的ISA,例如x86、MIPS等。当编译器在不同的ISA环境中编译源代码(C++/JAVA)时,生成的汇编代码也会不同。然后,我想知道生成的二进制机器码是不同的还是相同的????我的猜测是生成的二进制代码是相同的,否则不同的CPU如何在不同的计算机上运行相同的exe文件??我不知道我的假设是否正确。谢谢澄清 为不同CPU生成的二进制代码不同。一个示例C程序:Assembly 用不同的指令集架构编译同一段源代码,assembly,compilation,instruction-set,Assembly,Compilation,Instruction Set,好的,据我所知,对于不同的CPU有许多不同类型的ISA,例如x86、MIPS等。当编译器在不同的ISA环境中编译源代码(C++/JAVA)时,生成的汇编代码也会不同。然后,我想知道生成的二进制机器码是不同的还是相同的????我的猜测是生成的二进制代码是相同的,否则不同的CPU如何在不同的计算机上运行相同的exe文件??我不知道我的假设是否正确。谢谢澄清 为不同CPU生成的二进制代码不同。一个示例C程序: int a; int b(int c) { return a+c; } 使用32
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
使用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可执行文件除外:
这些类型的可执行文件包含一种特殊类型的代码,既不能由x86执行,也不能由MIPS、ARM或PPC执行。然而,这段代码的设计方式是,它可以很容易地被翻译成机器相关的代码
当您第一次在Windows上执行.NET.exe文件时,.exe文件中与CPU无关的代码将被翻译为仅限x86(或仅限ARM或其他)代码,“翻译后的”变体将存储在临时目录中。将实际执行临时目录中的文件
Java的工作原理类似,但有点复杂…“否则,不同的CPU如何在不同的计算机上运行相同的exe文件?”“你怎么会认为它们可以呢?Raspberry PI无法运行为基于x86/Windows的PC构建的可执行文件(反之亦然)。至少在没有某种模拟器的情况下是不行的。如果你说的是两台基于x86的PC(运行相同类型的操作系统),那么简单的答案是它们共享相同的CPU架构。