【问题标题】:how does assembler convert from assembly to machine code?汇编程序如何从汇编转换为机器代码?
【发布时间】:2021-04-23 19:44:10
【问题描述】:

我知道这已经被问过很多次了,但我正在寻找一个简单的解释。

假设我有一些 C++ 编译器生成的汇编代码。

现在汇编器开始工作,它必须将汇编代码转换为机器代码。

问题1)。 C++汇编编译器会看每条汇编指令有对应机器码指令的表格吗?

问题2)。 如果C++程序运行在intel处理器上,那么汇编程序需要看一下Intel团队发布的表格,对吧?因为最终,C++程序运行在intel处理器上。

问题 3)。 如果我对问题 2 的看法是正确的,那么用 C++ 编写的程序怎么可能在使用 Intel 的计算机和使用 AMD 处理器的计算机上运行? ?

【问题讨论】:

  • Intel 和 AMD 都使用相同的指令集架构,它定义了所有机器代码的含义。
  • x86 或 AMD64 取决于 32 位或 64 位。
  • 尽管大多数现代 C++ 编译器(MSVC、GCC、Clang)不会生成程序集,而是直接从内部表示到机器代码。
  • ....我被证明是错的 ;)

标签: c++ assembly intel processor


【解决方案1】:

请尽量将您的问题限制为每个问题一个问题。尽管如此,让我试着回答他们。

问题 1

“汇编编译器”称为“汇编器”。汇编是汇编的,不是编译的。汇编器不是特定于C++的。它是特定于架构的,只能用于为该架构组装汇编程序。

是的,汇编程序通常通过将指令助记符映射到它们对应的操作码(操作码)来实现。该表还告诉汇编器指令采用什么操作数以及操作数是如何编码的。如果助记词对应多条指令,则同一个助记词可以有多个条目。

但是,这样做不是必需的。汇编人员可以选择不同的方法或将表格与预处理和后处理步骤结合起来。

问题 2

这是正确的。处理器供应商通常会为其处理器提供文档,其中列出了所有指令及其指令编码。对于英特尔,可以在Intel Software Development Manuals 中找到此信息。请注意,虽然处理器供应商提供了此类规范,但汇编器作者的工作是将这些文档翻译成表格以供汇编器使用。这在传统上是手动完成的,但最近,人们开始将手册自动翻译成表格。

问题 3

Intel 和 AMD 都生产 amd64(也称为 x86-64、IA32e、Intel 64、EM64T 和其他东西)架构的处理器。因此,为 Intel 处理器编写的程序通常也可以在 AMD 处理器上运行。

请注意,英特尔和 AMD 对该架构的实现存在细微差别。您的编译器会识别它们,并且不会生成在两者之间表现不同的代码。

还有各种指令集扩展在一些但不是所有的 amd64 处理器上可用。使用这些的程序只能在具有这些指令集扩展的处理器上运行。但是,除非您明确告诉编译器使用此类扩展,否则它不会使用其中任何一个,并且您的代码将在任何供应商的 amd64 处理器上运行。

【讨论】:

    【解决方案2】:

    C++ 汇编器会不会

    没有“C++”汇编程序。汇编器通常不需要了解编译成汇编代码的高级语言(如果有的话)。

    ...看表,每条汇编指令都有对应的机器码指令?

    没有什么说必须有一个“表”,但可以肯定的是,支持多个 CPU 架构的汇编程序可以做到这一点。

    如果C++程序运行在intel处理器上,那么汇编程序需要看一下Intel团队公布的表格,对吧?

    这样的表可能是由汇编程序的作者而不是 CPU 供应商编写的。它将基于供应商发布的手册。

    用 C++ 编写的程序怎么可能在使用 Intel 的计算机和使用 AMD 处理器的计算机上运行?

    Intel、AMD 和 VIA 都制造了执行相同(ish)指令集的 CPU,称为 x86-64。针对 x86-64 指令集的汇编程序应该在支持 x86-64 指令集的 CPU 上工作。

    不同的实现之间有一些小的差异,如果程序要在所有这些系统上工作,汇编器(和编译器)的设计必须考虑到这些差异。示例:早期的 Intel64 CPU 缺少 NX 位(根据未引用来源的维基百科)。在这些 CPU 上运行的程序不得使用该功能。

    【讨论】:

    • 其他示例包括en.wikipedia.org/wiki/…。这并没有引用早期 Intel64 CPU 缺少 NX 位的要点的来源。这很奇怪,因为en.wikipedia.org/wiki/NX_bit#x86 说英特尔在“Prescott (P4) 内核的后续迭代”中实现了 XD / NX。 (这是英特尔的第一个 x86-64 CPU,包括 Nocona)。这让人倍感意外,因为 x86-64 使用与 PAE 相同的页表格式,而且英特尔大概同时为 PAE 页表添加了 32 位模式 XD 支持。
    • 嗯,同一 wiki 页面 (en.wikipedia.org/wiki/X86-64#History_2) 的另一部分讨论了 Prescott 的步进/修订以及何时实施 XD / NX。这似乎表明某些 Nocona(服务器)内核是基于启用了 EM64T 但不支持 NX 的修订版出售的。
    • @PeterCordes Wikipedia 是我获取示例的地方。通过进一步搜索,我没有找到可靠的来源(如英特尔文档中所示)。只有另一个提到它是一个论坛post,它链接到新闻article关于发布至强E-0步进的文章,(根据英特尔文档)提供XD(NX)。大概更早的至强没有它。
    • Reg 中的那篇文章似乎确实表明存在 D-0 步进 Nocona Xeons,因此这意味着没有 NX 的 x86-64。哇。英特尔也未能在其早期 CPU 中以长模式实现 lahf,这对于将 x86-64 作为基准进行编译而言,这更多是一个持续的缺点。幸运的是,大多数时候它不是一个非常有用的指令,但是没有像 cmpxchg16b(感谢 AMD)和 lahf(感谢 Intel)这样的东西作为真正基线的一部分是令人讨厌的,因为这意味着编译器不能只假设支持不使用额外的选项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多