据我了解,C代码被编译为某人机器上的机器(汇编)代码,它变成了一个可以在许多不同处理器(机器)上运行的exe文件。但是由于不同的处理器有自己独特的汇编代码,这个代码怎么运行?编译的exe只能在一种处理器上运行吗?
答案 0 :(得分:15)
将程序编译为机器代码时,必须选择机器代码指令集,可能是运行机器的模式(如果适用),以及存储结果代码的格式。
所有这些选择限制了可以执行代码的目标平台。
指令集大致取决于CPU的类型:x86(“IBM兼容”),PowerPC,ARM,MIPS,DEC Alpha,Motorola 68k,......在每个CPU系列中,有很多子 - 可选择的特征和世代(例如,对于x86,有i386,SSE,AVX,......)。较新的CPU可能能够执行仅限于老一代的代码,因此可能存在共同的子集。
x86上的处理器模式取决于环境:MS-DOS程序的实模式以及在启动,保护模式下运行的任何内容,在某些情况下可能会使用不同的寻址模式(虚幻模式)。
二进制格式需要被操作系统识别,或者更普遍地通过你所拥有的加载机制识别:用于Windows的PE,用于当代Linux的ELF,在过去的a.out中,......操作系统可以为多种二进制格式提供加载器。
这只是您在编译时选择的最基本级别的平台参数,并且您的程序将仅在同意此选择的平台上运行。但是,对于真实世界的程序存在许多实际限制,例如OS系统接口和框架库的可用性,这些也需要匹配。例如,虽然在Linux中读取和运行Windows PE二进制文件并不困难,但其中包含的代码在Linux上没有意义,因为它使用Windows特定的软件中断。但是,通过拦截和翻译它们,毕竟很可能在Linux上运行这些二进制文件。