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

how does assembler convert from assembly to machine code?

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

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

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

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

问题2).如果C++程序运行s在intel处理器上,那么,汇编程序需要看看table发表的英特尔团队,对吧?因为最后,C++ 程序 运行s 在英特尔处理器上。

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

Will the C++ assembler

没有“C++”汇编程序。汇编程序通常不需要了解有关编译为汇编代码的高级语言(如果有的话)的任何信息。

... look at the table where each assembly instruction has the corresponding machine code instruction ?

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

If the C++ program runs on the intel processor, then, assembler needs to take a look at the table published by Intel team, right ?

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

how is it possible that program written in C++ can be run on the computer which uses Intel and on the computer which uses AMD processor ?

Intel、AMD 和 VIA 都制造了 CPU,它们实现了相同的(ish)指令集,称为 x86-64。以 x86-64 指令集为目标的汇编程序应该在支持 x86-64 指令集的 CPU 上工作。

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

请尽量将您的问题限制为每个问题一个问题。不过,让我试着回答一下吧。

问题 1

“汇编编译器”称为“assembler”。程序集是 assembled, 不是 编译的。 并且 assembler 不是特定于 C++。它特定于体系结构,只能用于 assemble 该体系结构的汇编程序。

是的,assemblers通常是通过有一个很大的table映射指令助记符到它们对应的操作码(opcodes)来实现的。 table 还告诉 assembler 指令采用什么操作数以及操作数是如何编码的。如果助记词对应多条指令,则同一个助记词可以有多个条目。

然而,这样做并不是必须的。汇编器可以选择不同的方法或将 table 与预处理和后处理步骤相结合。

问题 2

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

问题 3

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

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

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