【问题标题】:How can a program written in C++ be run on multiple CPU architectures?用 C++ 编写的程序如何在多个 CPU 架构上运行?
【发布时间】:2021-01-19 14:06:54
【问题描述】:

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

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

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

【问题讨论】:

  • 即使是汇编代码也因架构而异。您是否有理由不能为每个目标架构编译相同的源代码?
  • 现在还有编译器可以创建程序集吗?我以为这通常是通过反汇编生成的代码来模拟的。
  • 您在描述LLVM。使用它。
  • 要了解为什么您所要求的内容本质上是矛盾的,请查看一些简单的 ISA 示例,例如 6502、68000 和 8088,以了解它们的不同之处。编译器必须知道要定位哪个架构,否则它只会发出垃圾。一个简单的查找表并不能解决问题,这些芯片的工作方式在许多情况下根本不同
  • 您是否混淆了“中间代码”(C++ 编译器第一阶段的输出)与第二阶段的输出(基于目标处理器/架构的可重定位目标文件)?第一阶段的输出(“中间代码”)可以针对不同的处理器/架构“重新定位”。

标签: c++ assembly cpu-architecture processor


【解决方案1】:

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

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

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

【讨论】:

  • 现在用 C++ 编写的程序可以在任何计算机上运行的原因让我相信我们的处理器(我的、你的,而且大多数人都使用相同的指令集架构),对吗?
  • @GiorgiLagidze 不,这是不对的。有许多流行的架构。台式机和笔记本电脑大多使用 amd64(也称为 x86-64),智能手机通常使用 AArch64(也称为 ARM64),服务器有时也使用 SPARC,大型机使用 z/Architecture(也称为 S390x)。 MIPS、RISC-V、ESP32 和 ARM32 等其他架构也很常见。正如我试图说的,C++ 程序可以在任何计算机上运行的原因是你可以为任何架构编译它们。但是,您确实需要为每个架构分别编译它们。
  • 我觉得我说的还是对的。由于大多数笔记本电脑和台式电脑都使用 amd64,因此编写 C++ 软件的人将其编译为 amd64 架构,因为他知道这是大多数人使用的架构。
  • @GiorgiLagidze 用 c++ 编写代码意味着它可以在许多平台上编译,但生成的二进制文件只能在这个平台(OS/CPU)组合上运行。即使是像 x86-64 这样的特定 CPU 架构也可以包含可能仅适用于较新 CPU(如 SEE,...)的指令。
  • @GiorgiLagidze 当然这很重要。但是,请记住,程序不仅必须针对特定架构进行编译,还必须针对特定操作系统进行编译。因此,如果您希望您的程序同时在 Linux 和 Windows 笔记本电脑上运行,则必须编译两次,一次用于 amd64 Linux,一次用于 amd64 Windows。
【解决方案2】:

一般来说,所谓的汇编大致是一种人类可读的(文本)形式的机器代码(二进制)。

正如 franji1 在评论中所说,通常编译器会从源代码发出中间抽象机器代码。而且这种代码可以很容易(它打算)被翻译成汇编/机器代码。

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

这就是编译器的设计目的。编译器在某种程度上具有误导性。编译器可以是“编译器阶段”或“编译器工具链”。 编译器阶段是将源代码转换为中间抽象形式的阶段,然后需要由汇编器将其转换为目标汇编/机器代码。 编译通常表示从源代码到可执行机器代码的整个过程。

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

大概是的。这就是像Instruction Set Reference Manual 这样的文档的用途:描述必须如何将文本形式转换为字节形式。

汇编器将使用哪个表?

查看文档...

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

您必须为每个平台(机器/操作系统)生成程序的字节形式。编译器旨在为给定平台生成机器代码,该平台准确地实现您的源代码指定的内容。这就是编译器存在的原因,让您免于在汇编中编写程序(这很难做到)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2014-07-05
    相关资源
    最近更新 更多