将汇编语言转换为机器码的方式是什么?

8
我是一名新手程序员,从C++语言开始学习。据我所知,C++编译器(例如Visual Studio)将C++语言转换为汇编语言。但是我试图了解将汇编语言转换为计算机可理解且可以执行的机器码的工具或方法,但没有找到答案。
因此,问题是,汇编语言在何处以及如何转换为机器码?是否由操作系统中集成的某种编译器完成?
提前感谢。

1
不,那只发生在旧时代。这是一个典型的引导步骤,但没有人想等待额外所需的汇编器传递。现在仅剩下的是C和C++编译器仍然有生成汇编清单的选项。 - Hans Passant
微软的C++编译器直接生成机器码,而GNU C编译器生成汇编代码,然后使用汇编器将其转换为机器码。 - Ross Ridge
1
微软编译器有输出汇编代码的功能。我不知道是否有选项可以编译为汇编代码,然后汇编汇编代码。微软汇编器为32位是ML.EXE,64位是ML64.EXE。还有一个MASM.EXE,它在某些情况下指的是MASM 5.x版本,而ML.EXE则是MASM 6.x或更高版本的新名称。 - rcgldr
4个回答

11
一些编译器(例如 GNU)将 C/C++ 代码转换为汇编代码。一个被称为“汇编器”的工具将汇编代码转换为机器码,而一个被称为“链接器”的工具将多个机器码文件连接成一个单独的可执行文件(在 Windows 下为 .EXE 文件)。这些大多数编译器允许你将生成的汇编代码写入文件,以便你可以查看汇编代码或修改它。
汇编器和链接器是工具链的一部分,这意味着它们通常与编译器一起提供。
然而,一些编译器(例如 Microsoft)直接将 C/C++ 代码转换为机器语言,因此不再需要汇编器。其中许多编译器无法创建汇编代码,因此无法将汇编代码写入文件。
顺便说一下:甚至有一些编译器(不是针对 C/C++,而是针对其他编程语言)直接创建 .EXE 文件,因此不需要链接器。

但是如果这样的话,为什么不所有编译器都直接将高级编程语言转换成机器码而不是汇编语言呢?这样不是更好吗?我的意思是,从我所读到的来看,汇编语言使用户更容易阅读低级代码,但对计算机运行程序并不方便。 - Karim K.
1
无论如何你都需要“汇编器”工具,因为某些代码(在操作系统内核中)不能用高级语言编写。汇编代码更易于生成和调试,因此编写汇编代码可以使编译器开发更简单。一些CPU类型使用不同的机器码,但是相同的汇编指令(历史上的例子:6800/6809;现代的例子:混合字节序的CPU,ARM abi/thumb)。在这些情况下,您只需要一个编译器即可为两个CPU服务。 - Martin Rosenau
clang/LLVM也可以直接生成机器码,但他们所说的是使用内置的汇编器。它仍然可以编译使用GNU C内联汇编语法的代码。但是,编译器生成的指令可能永远不会经过文本表示;我不确定。clang和MSVC绝对可以为用户输出可读的汇编代码(甚至带有注释);你不必只是反汇编目标文件。 - Peter Cordes
嗨@MartinRosenau,我想了解汇编代码何时转换为机器代码。因为它将在哪种CPU上运行只有在运行时才知道,所以这是如何处理的?这是否意味着,当用户双击exe文件时,汇编器将转换为机器代码?我是在讨论C语言的情况下。第二个问题是,将直接转换为机器代码的Microsoft编译器如何处理这种情况? - Gajanan Kulkarni
@GajananKulkarni 很抱歉回复晚了。EXE文件已经包含机器码,而不是汇编代码。唯一的例外是.NET EXE文件(例如由C#创建的文件),它们不包含机器码,而是一个“.NET程序集”。然而,“.NET程序集”与汇编语言或汇编代码无关(只有“assembly”这个词是共同的)... - Martin Rosenau

6
当编译器将高级代码转换成汇编语言时,其形式如下:
  • MOV AX,[A] ; # 将 A 移动到寄存器 Ax
  • ADD AX,[B] ; # 将 B 加到 A
  • IMUL AX ; # 平方(A+B)
  • MOV [C],AX ;
汇编程序将这些汇编指令转换成机器码。
汇编指令的典型格式为:操作码 操作数 [操作数]
如果查看微处理器手册,您将了解每个指令如何转换成二进制格式,例如 1001000。某些位用于操作码,而其他位用于操作数。 http://www.mathemainzel.info/files/x86asmref.html

2
汇编语言通过一个称为汇编器的实用程序转换为可执行的机器代码;这个转换过程称为汇编或组装代码。
了解更多请点击这里
干杯!!

0

汇编代码的转换过程与目标/机器代码类似,因为它经过了一个称为汇编器的东西(类似于您给出的编译器)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接