汇编程序如何从汇编代码转换为机器代码?

时间:2021-01-19 13:40:37

标签: c++ assembly intel processor

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

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

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

问题 1). C++ 汇编程序编译器会查看每个汇编指令对应的机器码指令的表格吗?

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

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

2 个答案:

答案 0 :(得分:4)

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

问题 1

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

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

然而,这样做并不是必须的。汇编程序可以选择不同的方法或将表格与预处理和后处理步骤结合起来。

问题 2

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

问题 3

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

请注意,Intel 和 AMD 对这种架构的实现之间存在细微差别。您的编译器知道它们,并且不会生成在两者之间表现不同的代码。

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

答案 1 :(得分:3)

<块引用>

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 上运行的程序不得使用该功能。

相关问题