C代码如何在不同的处理器上是运行?

How can C code be run on different processors?

据我了解,C 代码在某人的机器上被编译为机器(汇编)代码,并成为一个 exe 文件,可以 运行 在许多不同的处理器(机器)上。但是既然不同的处理器都有自己独特的汇编代码,那么这个代码怎么可能运行呢?难道编译后的 exe 只能在一种处理器上 运行 吗?

当您将程序编译为机器代码时,您必须 select 机器代码指令集,可能是 运行 机器的模式(如果适用),以及格式结果代码存储在其中。

所有这些选择都限制了可以执行代码的目标平台。

  • 指令集大致取决于CPU的类型:x86 ("IBM-compatible"), PowerPC, ARM, MIPS, DEC Alpha, Motorola 68k, ... 以内每个 CPU 系列,都有许多子功能和世代可供选择(例如,对于 x86,有 i386、SSE、AVX 等)。较新的 CPU 可能能够执行仅限于老一代的代码,因此可能存在一个共同的子集。

  • x86 上的处理器模式取决于环境:MS-DOS 程序的实模式和任何你 运行 启动时的模式,保护模式,不同的寻址模式可能在某些情况下可用(虚幻模式)...

  • 二进制格式需要被操作系统识别,或者更一般地说,被你拥有的任何加载机制识别:PE 用于 Windows,ELF 用于当代 Linux, a.out 在过去,......一个操作系统可能会为多种二进制格式提供加载器。

这只是您在编译时选择的最基本级别的平台参数,您的程序只会在同意该选择的平台上运行。然而,现实世界的程序还有更多实际限制,例如 OS 系统接口和框架库的可用性,这些也需要匹配。例如,虽然 运行 Windows 中的 PE 二进制文件不难阅读 Linux,但其中包含的代码在 Linux 上没有意义,因为它使用 Windows-特定的软件中断。然而,通过截取和翻译它们,很可能 运行 那些二进制文件毕竟 Linux。