答案 0 :(得分:23)
答案 1 :(得分:8)
指令set由处理器可以执行的所有指令组成,而程序集是programming language,它使用这些指令来制作程序。
换句话说,指令集只是CPU可以理解的一组字节,但你不能对它们做任何有用的事情(将指令视为字母表中的字母)而汇编是一种允许你组合这些指令的语言(或字母)制作节目(类似演讲)。
答案 2 :(得分:2)
汇编语言将包含指令的助记符,但通常会添加更多内容,例如:
编辑:指令(本身)将以二进制编码,以供CPU读取。助记符是指令的名称。例如,在汇编语言中,我可能会写“mov ax,1”。对应的指令(在x86的情况下)将被编码为B8 00000001(十六进制)。
定义数据,宏,函数名称等不是实际指令。宏(很像C中的宏等)允许您在组装过程中定义名称。它可能(通常会)导致生成一些指令,但这些指令与宏定义本身是分开的。与C类似,当您定义一些数据时,通常会在目标文件中生成一条记录,为名称X指定一定量的空间,但不会直接生成任何指令。
答案 3 :(得分:2)
汇编语言不仅仅是指令集的超集:它是一种生成目标文件,符号,调试信息,链接的方式,甚至在这个级别上也有一些最小的结构化编程。 (稍微建立其他答案/评论)
大多数C编译器生成程序集,然后将其传递给汇编程序以创建目标文件。如果在使用标记'-S'运行时查看gcc的输出,您将看到上面的大部分内容被使用。如果您打开了调试('-g')和任何动态链接(这些天默认),您会看到大量的程序集不仅仅用于说明。
答案 4 :(得分:2)
计算机(更准确地说是处理器)只能进行计算,即执行算术和逻辑运算。
单个算术或逻辑运算称为指令。
所有指令的集合称为该计算机的指令集(更确切地说是处理器)。
指令集在处理器中硬连线或使用称为微码的技术实现。
计算机只能编程,如果它有一种语言,即它能理解的东西。二进制代码不是计算机的语言。基于二进制代码的指令集是计算机的语言。
语言只不过是纸上的规范。在纸上设计的第一种语言是机器语言。它只能通过硬件(或最新的技术微码)在计算机中实现。该实现称为指令集。所有其他语言都将基于机器语言设计。
机器语言难以使用,因为我们在日常生活中主要使用字母表。因此,决定在机器语言之上引入一种称为汇编语言的助记符语言。汇编语言的实现名为Assembler。
[你可能想知道第一个汇编程序是如何编写的。第一个汇编程序可能用或不用机器语言编写。为简单起见,我在这里没有提到引导的概念]
<强>概要强>
汇编语言由汇编程序转换为指令集。两者都是硬币的不同侧面,它们之间有一层抽象或助记码。机器语言是处理器指令集的“位编码”。汇编语言是处理器指令集的“符号编码”。
答案 5 :(得分:1)
当您查看您在问题中链接到的Assembly language上的维基百科文章时,下面有一个示例显示汇编语言指令和相应的目标代码。两者都是同一事物的不同表示:来自处理器指令集的指令。但只有标题为“指令(AT&amp; T语法)”的列才包含汇编语言。
希望这更清楚。
答案 6 :(得分:1)
一切都在分层架构中,“严格(大部分时间)和明确定义的界面”。
从硬件开始
在您达到处理器之前,有很多层。
第一层意味着我们从“物理 - >设备(电子) - >模拟(放大器) - >盖茨 - >数字电路 - >微架构 - &gt;架构(ISA,处理器)< / p>
称为ISA(指令集架构)的软件部分
它包含受尊敬的处理器可以支持的所有指令。这意味着ISA只能绑定一个处理器(像x86这样的硬件) 重要的是为什么需要这个ISA? 与我之前所说的相同,它是严格且定义良好的界面。处理器无法运行ISA以外的任何指令 [Strict]
但任何想要使用此处理器的人都可以使用ISA的这些命令来完成他的工作。 [定义良好的界面]
现在来到Assembly,C,Assembler,Compiler ....
分层架构您知道我们在硬件中使用它(分层拱门)为您实现一个处理器
您可以详细了解这种分层架构的原因。一步一步处理大问题变得容易。
我们想要的是什么?我们的目标是什么?
我们希望用户可以轻松使用此处理器。 用户 程序员 。
现在看看程序员的难度。
程序员是否可以记住二进制格式的处理器的所有指令。处理器可能会在下一个应用程序中从Intel更改为IBM(现在不是特定于版本)。
汇编程序也是它拥有的一个层 - 两个接口。 与编译器相同。
Ex:您在C中编写代码。处理器无法理解此代码。它理解以二进制格式编写并由ISA中给出的指令定义的内容。但是很难在ISA中的指令中编写(维护)程序。
1)所以用户用C编写代码。 这段代码是C编译器所理解的。因为用户仅限于使用C中给出的语法。这意味着C编译器在一端为用户提供标准且定义良好的接口。在另一个,它可以直接使用ISA指令或另一个称为“汇编程序”的接口。
2)现在如果您正在使用Assembler,那么Compiler会将所有C-Code转换为Assembler给出的语法。而Assembler为Compiler提供的语法称为汇编语言。它也是定义良好的接口,任何人都可以用汇编语言编程。在另一端,Assembler将其所有语法(助记符|指令,ISA中不存在)转换为ISA中的二进制代码指令。
这里有一些这种翻译的例子。
在此文件中,一行是“Machine:Advanced Micro Devices X86-64”,它提供有关处理器的信息,因此我们使用ISA和汇编程序。 C程序员不知道这一点,他可以自由编写C语言。这是 “定义良好的界面”的好处。
比较看看
hello.c(C program)
hello.asm2bin(对象文件表:直接映射助记符和二进制指令)
hello.asm2bin_exe(二进制文件表:链接后的更多映射)
您将在这些文件中看到一行“反汇编部分..” 自汇编程序做什么:它汇编了汇编语言的ISA指令(位模式),所以在这里我们看到第一个ISA指令,然后解组到助记符。
所有文件都在此链接[下载并打开]
https://www.dropbox.com/sh/v2moak4ztvs5vb7/AABRTxl7KQlqU2EkkMkKssqYa?dl=0