用 C++ 编写的程序如何在多个 CPU 架构上运行?

Gio*_*dze 1 c++ assembly processor cpu-architecture

我有一个 C++ 程序,我想编译成汇编,然后汇编程序将它编译成机器码。

现在,据我所知,为了将汇编代码转换为机器代码,汇编程序需要某种表来将汇编指令映射到实际的机器指令。

汇编程序将使用哪个表?我的 C++ 程序是否有可能不会在所有 CPU 上运行,因为 CPU 使用不同的表,这意味着相同的机器代码将在不同的 CPU 上做不同的事情?

fuz*_*fuz 5

汇编器为它被告知/编程为汇编的任何体系结构进行汇编。由于每种指令集架构 (ISA) 的汇编语言不同,因此您只能为同一架构的一种架构编写汇编程序。通常不可能意外或有意地为错误的体系结构组装程序。

当您使用编译器时,编译器会使用正确的标志调用正确的汇编器来组装它为您告诉它编译的体系结构生成的汇编代码。生成的程序只能在您编译它的 ISA 的处理器上运行。如果您希望程序在不同 ISA 的处理器上运行,则必须为该其他 ISA 编译它。

如果您的程序编写得不好,那么在为您开发它的架构以外的其他架构编译时,它可能无法编译或运行。这样的程序称为不可移植程序。 然而,除非你做了一些奇怪的事情或者对你正在编程的架构的属性做出假设,否则这不太可能发生。

  • @GiorgiLagidze 不,这是不对的。有许多流行的架构。台式电脑和笔记本电脑大多使用amd64(也称为x86-64),智能手机通常使用AArch64(也称为ARM64),服务器有时也使用SPARC,大型机使用z/Architecture(也称为S390x)。MIPS、RISC-V、ESP32 和 ARM32 等其他架构也很常见。正如我想说的,C++ 程序之所以可以在任何计算机上运行,​​是因为你可以为任何体系结构编译它们。但是,您确实需要为每个架构单独编译它们。 (3认同)
  • @GiorgiLagidze 用 c++ 编写代码意味着它可以针对许多平台进行编译,但生成的二进制文件将仅针对该平台(操作系统/CPU)组合运行。即使像“x86-64”这样的特定 CPU 架构也可能具有仅适用于较新 CPU 的指令(例如 SEE,...)。 (2认同)