Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 用不同的指令集架构编译同一段源代码_Assembly_Compilation_Instruction Set - Fatal编程技术网

Assembly 用不同的指令集架构编译同一段源代码

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

好的,据我所知,对于不同的CPU有许多不同类型的ISA,例如x86、MIPS等。当编译器在不同的ISA环境中编译源代码(C++/JAVA)时,生成的汇编代码也会不同。然后,我想知道生成的二进制机器码是不同的还是相同的????我的猜测是生成的二进制代码是相同的,否则不同的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
使用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架构。