汇编语言和指令集的区别?

问题描述 投票:0回答:1

我一直在研究汇编语言和指令集。 我对汇编语言和指令集之间的区别感到困惑。

我在网上研究了“汇编语言通过汇编器转换为指令集”。两者都是硬币的两面,中间有一层抽象或助记码。机器语言是处理器指令集的“位编码”。 请指导我。

assembly cpu-architecture instruction-set
1个回答
0
投票

首先,这些条款会受到意见的影响,它们不一定是一成不变的,特别是因为人们会扔掉它们,但是,你几乎或已经拥有了它。

机器代码,通常意味着二进制位,你必须查看这些位来解码它们。

指令集或指令集架构或ISA。这是一组指令,通常在某些文档中使用机器代码和汇编语言进行描述。因此,指令集可能有一条加法指令(或许多基于寻址模式、寄存器、立即数、间接指令等),它应该具有某种形式的加载和存储。虽然大多数通用指令集在名称和功能上具有相同的基本指令,但细节(如果您愿意的话,机器代码)却有所不同。架构这个词通常是这个术语的一部分,架构可以超越指令本身,因此执行模式如用户与主管,以及其他因素。

汇编语言只是一种编程语言,这就是它变得棘手的地方。您的主要指令集 x86、arm、mips 等都有多种不兼容的汇编语言。它可能是微妙的事情,例如 %ax 与 ax 或冒号或标签名称上没有冒号等。但是它们是不兼容的,您将为同一手臂目标编写的程序提供给一个手臂汇编器,它可以工作,但将其提供给另一个手臂汇编器,并且你会得到很多错误。假设所有指令集都有多种不兼容的汇编语言。

归根结底,汇编语言是由汇编器、工具定义的,而不是核心/芯片供应商。核心/芯片供应商将在其文档中使用一种汇编语言,并且可能与他们支持的工具(在其历史上的某个时刻编辑过)相匹配。但汇编程序没有理由必须遵守这一点。由于各种原因,汇编器(工具)不会遵守这一点,特别是如果是工具链的一部分,如果是通用工具链(gnu、llvm 等)的一部分则更糟。

只要工具/工具链创建符合指令集架构规则的可用代码,就一定是错误的吗?

一个人可以创造

  pickle = apple + orange

并且可以将指令编码更通常写为

  add r0,r1

你不太可能找到使用 pickle、apple、orange 语法编写代码的人,但也许有人将其用作工具链的一部分,编译器生成它,汇编器组装它,链接器将所有内容链接在一起,不人类必须编写它......它将是一种有效的“汇编语言”,尽管创建它是不明智的并且可能在作者之外拥有零用户。

所以

机器代码是处理器实际咀嚼的位。

汇编语言是一种编程语言,理想情况下可用于生成机器代码(通常与链接器一起)。从历史上看,每个指令集往往有不止一种汇编语言。

指令集架构是该处理器的整体设计和规范,包括机器代码位(但不一定是汇编语言的完整描述)。

© www.soinside.com 2019 - 2024. All rights reserved.