指令集和汇编语言是一回事吗?

时间:2011-03-21 18:44:58

标签: assembly instruction-set

我想知道instruction setassembly language是否相同?

如果没有,他们有什么不同以及他们的关系是什么?

谢谢和问候!

7 个答案:

答案 0 :(得分:23)

答案 1 :(得分:8)

指令set由处理器可以执行的所有指令组成,而程序集是programming language,它使用这些指令来制作程序。
换句话说,指令集只是CPU可以理解的一组字节,但你不能对它们做任何有用的事情(将指令视为字母表中的字母)而汇编是一种允许你组合这些指令的语言(或字母)制作节目(类似演讲)。

答案 2 :(得分:2)

汇编语言将包含指令的助记符,但通常会添加更多内容,例如:

  1. 某种定义数据的方式
  2. 定义名称的方法(例如,用于功能)
  3. 编辑:指令(本身)将以二进制编码,以供CPU读取。助记符是指令的名称。例如,在汇编语言中,我可能会写“mov ax,1”。对应的指令(在x86的情况下)将被编码为B8 00000001(十六进制)。

    定义数据,宏,函数名称等不是实际指令。宏(很像C中的宏等)允许您在组装过程中定义名称。它可能(通常会)导致生成一些指令,但这些指令与宏定义本身是分开的。与C类似,当您定义一些数据时,通常会在目标文件中生成一条记录,为名称X指定一定量的空间,但不会直接生成任何指令。

答案 3 :(得分:2)

汇编语言不仅仅是指令集的超集:它是一种生成目标文件,符号,调试信息,链接的方式,甚至在这个级别上也有一些最小的结构化编程。 (稍微建立其他答案/评论)

  • 目标文件布局。例如,部分:代码,数据,只读,调试,动态链接。常见的'org'指令告诉汇编程序指令/数据的位置。
  • 预处理。这包括宏(内联扩展,重复)和有时结构化编程(结构布局,定义寄存器的别名)。
  • 数据定义。包括文件批发,或一次定义字节/单词,例如“.byte”,“。word”,“。dw”,具体取决于您的架构。

大多数C编译器生成程序集,然后将其传递给汇编程序以创建目标文件。如果在使用标记'-S'运行时查看gcc的输出,您将看到上面的大部分内容被使用。如果您打开了调试('-g')和任何动态链接(这些天默认),您会看到大量的程序集不仅仅用于说明。

答案 4 :(得分:2)

计算机(更准确地说是处理器)只能进行计算,即执行算术和逻辑运算。

单个算术或逻辑运算称为指令

所有指令的集合称为该计算机的指令集(更确切地说是处理器)。

指令集在处理器中硬连线或使用称为微码的技术实现。

计算机只能编程,如果它有一种语言,即它能理解的东西。二进制代码不是计算机的语言。基于二进制代码的指令集是计算机的语言。

语言只不过是纸上的规范。在纸上设计的第一种语言是机器语言。它只能通过硬件(或最新的技术微码)在计算机中实现。该实现称为指令集。所有其他语言都将基于机器语言设计。

机器语言难以使用,因为我们在日常生活中主要使用字母表。因此,决定在机器语言之上引入一种称为汇编语言的助记符语言。汇编语言的实现名为Assembler。

[你可能想知道第一个汇编程序是如何编写的。第一个汇编程序可能用或不用机器语言编写。为简单起见,我在这里没有提到引导的概念]

<强>概要

  

汇编语言由汇编程序转换为指令集。两者都是硬币的不同侧面,它们之间有一层抽象或助记码。机器语言是处理器指令集的“位编码”。汇编语言是处理器指令集的“符号编码”。

答案 5 :(得分:1)

当您查看您在问题中链接到的Assembly language上的维基百科文章时,下面有一个示例显示汇编语言指令和相应的目标代码。两者都是同一事物的不同表示:来自处理器指令集的指令。但只有标题为“指令(AT&amp; T语法)”的列才包含汇编语言。

希望这更清楚。

答案 6 :(得分:1)

一切都在分层架构中,“严格(大部分时间)和明确定义的界面”

从硬件开始

  1. 在您达到处理器之前,有很多层。

    第一层意味着我们从“物理 - >设备(电子) - >模拟(放大器) - >盖茨 - >数字电路 - >微架构 - &gt;架构(ISA,处理器)< / p>

  2. 但是从处理器开始,它有两个部分(大多数嵌入式系统都有)。 : 硬件和软件。
  3. 称为ISA(指令集架构)的软件部分

    它包含受尊敬的处理器可以支持的所有指令。这意味着ISA只能绑定一个处理器(像x86这样的硬件) 重要的是为什么需要这个ISA? 与我之前所说的相同,它是严格且定义良好的界面。处理器无法运行ISA以外的任何指令 [Strict]

    但任何想要使用此处理器的人都可以使用ISA的这些命令来完成他的工作。 [定义良好的界面]

  4. 现在来到Assembly,C,Assembler,Compiler ....

    • 分层架构您知道我们在硬件中使用它(分层拱门)为您实现一个处理器

      您可以详细了解这种分层架构的原因。一步一步处理大问题变得容易。

    • 我们想要的是什么?我们的目标是什么?

      我们希望用户可以轻松使用此处理器。 用户 程序员

    • 现在看看程序员的难度。

      程序员是否可以记住二进制格式的处理器的所有指令。处理器可能会在下一个应用程序中从Intel更改为IBM(现在不是特定于版本)。

      • 所以这里我们也有分层架构[未修复]。
      • 1)汇编程序 - 编译程序
      • 2)汇编程序

    汇编程序也是它拥有的一个层 - 两个接口。 与编译器相同。

    Ex:您在C中编写代码。处理器无法理解此代码。它理解以二进制格式编写并由ISA中给出的指令定义的内容。但是很难在ISA中的指令中编写(维护)程序。

    1)所以用户用C编写代码。 这段代码是C编译器所理解的。因为用户仅限于使用C中给出的语法。这意味着C编译器在一端为用户提供标准且定义良好的接口。在另一个,它可以直接使用ISA指令或另一个称为“汇编程序”的接口。

    2)现在如果您正在使用Assembler,那么Compiler会将所有C-Code转换为Assembler给出的语法。而Assembler为Compiler提供的语法称为汇编语言。它也是定义良好的接口,任何人都可以用汇编语言编程。在另一端,Assembler将其所有语法(助记符|指令,ISA中不存在)转换为ISA中的二进制代码指令。

    这里有一些这种翻译的例子。

    • 在C = hello.c
    • 在汇编代码中= hello.s
    • In Object Code = hello.obj(No Linking Done:More Info)

    在此文件中,一行是“Machine:Advanced Micro Devices X86-64”,它提供有关处理器的信息,因此我们使用ISA和汇编程序。 C程序员不知道这一点,他可以自由编写C语言。这是 “定义良好的界面”的好处。

    • 在机器代码中= hello.binary(链接后:更多信息)

    比较看看

    • hello.c(C program)

    • hello.asm2bin(对象文件表:直接映射助记符和二进制指令)

    • hello.asm2bin_exe(二进制文件表:链接后的更多映射)

      您将在这些文件中看到一行“反汇编部分..” 自汇编程序做什么:它汇编了汇编语言的ISA指令(位模式),所以在这里我们看到第一个ISA指令,然后解组到助记符。

    所有文件都在此链接[下载并打开]

    https://www.dropbox.com/sh/v2moak4ztvs5vb7/AABRTxl7KQlqU2EkkMkKssqYa?dl=0

    • 在Linux中您可以使用vim,emacs打开这些文件。
    • 在Windows中只需使用vim或使用“打开 - &gt;在右键单击文件后选择一个程序从......”选项并选择您选择的文本编辑器。