使用不同的指令集体系结构编译同一段源代码
Compile same piece of source code with different Instruction Set Architecture
OK,据我了解不同的CPU有很多不同类型的ISA,比如x86,MIPS等。当编译器编译源代码时(C++/JAVA) 在不同的ISA环境下,生成的汇编代码也会不同。然后,我想知道生成的二进制机器代码是否也会不同或只是相同????我胡乱猜测生成的二进制代码应该是一样的,不然怎么会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
使用 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 或whatever) 代码和 "translated" 变体将存储在一个临时目录中。临时目录中的文件将实际执行。
Java 工作原理类似但有点复杂...
OK,据我了解不同的CPU有很多不同类型的ISA,比如x86,MIPS等。当编译器编译源代码时(C++/JAVA) 在不同的ISA环境下,生成的汇编代码也会不同。然后,我想知道生成的二进制机器代码是否也会不同或只是相同????我胡乱猜测生成的二进制代码应该是一样的,不然怎么会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
使用 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 或whatever) 代码和 "translated" 变体将存储在一个临时目录中。临时目录中的文件将实际执行。
Java 工作原理类似但有点复杂...