【问题标题】:When is assembly language used?什么时候使用汇编语言?
【发布时间】:2019-09-01 16:47:52
【问题描述】:

我正在上计算机组织的课程,我看到了这个剪辑:

为什么编译器编写者需要了解汇编语言?编译器不会将 Java 等高级语言翻译成二进制(或 Java 的字节码)吗?汇编语言什么时候出现?

我的书中有这样一句话:

高级编程语言 一种可移植语言,例如 C、C++、Java 或 Visual Basic,由单词和代数符号组成,编译器可以将其翻译成汇编语言。

我真的认为编译器会从高级语言变为二进制。这不对吗?

【问题讨论】:

  • 编译器生成的“二进制”是二进制编码的汇编指令。
  • 出于多种原因,编译成汇编语言比直接编译成机器代码更有意义。只有编译器生成的一些信息会产生实际的指令。汇编器先于目标的编译器,所以那里总是有一个汇编器。
  • 工具链一词来源于工具链、编译器、汇编器、链接器
  • 只有汇编语言的一部分是与指令相关的语法。有相当数量的不是指令,但在能够定义随后使用链接器链接的标签方面非常有价值,例如“main”或“printf”。为什么要重新发明轮子?有些人会直接编译成机器代码,就像有些人用汇编语言编写操作系统一样,因为他们可以。比如你为什么要爬山?因为它就在那里。
  • 该列表缺少编译语言所需的引导程序。例如,对于引导 C,您的语言选择是什么?

标签: assembly compiler-construction


【解决方案1】:

编译器完全有可能以文本形式发出汇编,然后将其输入汇编器,而不是直接发出二进制机器代码(例如,GCC 就是这样做的),但我不认为那个作者幻灯片甚至做出了这种区分。汇编语言和机器语言基本上是同一种语言的不同表现形式,所以区别并没有那么大的意义。

事实上,我很难相信任何知道给定机器的机器代码的人也不会知道它的汇编语言 - 几乎可以肯定,你会通过首先学习汇编形式然后查找机器代码来学习机器代码机器数据表中的二进制值。

在 Java 的情况下是字节码

要编写字节码编译器,您不需要了解汇编或机器语言。确实如此。 (不过,您需要知道它才能实现 JVM 的 JIT 编译器)。

【讨论】:

  • 当你说机器语言时,你是指二进制吗?
  • @Jwan622 在文件格式的上下文中,“二进制”仅表示“非文本”。它不是特定文件格式的名称。例如,PDF 是一种二进制格式(以及大多数图形、视频或音频格式等),但 CPU 肯定无法执行 PDF。当我说机器语言时,我指的是给定 CPU 可以理解的特定二进制格式。
  • @Jwan622 这确实意味着(尽管在文件格式的上下文中,它更具体地表示“不代表纯文本的 0 和 1 序列”,因为否则每个文件都是二进制文件并且术语“二进制文件”将毫无意义)。但并不是每个 1 和 0 的序列都可以由 CPU 执行。
猜你喜欢
  • 1970-01-01
  • 2010-11-18
  • 2014-09-03
  • 2016-04-02
  • 1970-01-01
  • 2019-02-19
  • 2015-04-26
  • 1970-01-01
  • 2010-12-24
相关资源
最近更新 更多