Assembly 指令集和汇编语言是一样的吗?
我想知道和是不是一回事 如果没有,它们有什么区别,它们之间有什么关系 谢谢和问候 指令由处理器可以执行的所有指令组成,而汇编则是使用这些指令编制程序的程序集。Assembly 指令集和汇编语言是一样的吗?,assembly,instruction-set,Assembly,Instruction Set,我想知道和是不是一回事 如果没有,它们有什么区别,它们之间有什么关系 谢谢和问候 指令由处理器可以执行的所有指令组成,而汇编则是使用这些指令编制程序的程序集。 换句话说,指令集只是CPU可以理解的一组字节,但你不能用它们做任何有用的事情(把指令想象成字母表中的字母),而汇编语言允许你将这些指令(或字母)组合成一个程序(类似于语音)汇编语言将包括指令的助记符,但通常会增加更多,例如: 宏 定义数据的一些方法 定义名称的方法(例如,函数) 编辑:指令(本身)将被编码为二进制,以便CPU读取。助记符是
换句话说,指令集只是CPU可以理解的一组字节,但你不能用它们做任何有用的事情(把指令想象成字母表中的字母),而汇编语言允许你将这些指令(或字母)组合成一个程序(类似于语音)汇编语言将包括指令的助记符,但通常会增加更多,例如:
定义数据、宏、函数名等不是实际的指令。宏(很像C等中的宏)允许您在组装过程中定义名称。它可能(通常会)生成一些指令,但这些指令与宏定义本身是分开的。与C语言非常相似,当您定义一些数据时,通常会在对象文件中生成一条记录,为名称X指定一定的空间,但不会直接生成任何指令。当您查看问题中链接到的关于您的Wikipedia文章时,下面的示例显示了汇编语言指令和相应的目标代码。两者都是同一事物的不同表示:来自处理器指令集的指令。但只有标题为“指令(AT&T语法)”的列包含汇编语言
希望这能让事情更清楚 汇编语言不仅仅是指令集的超集:它是生成对象文件、符号、调试信息、链接的一种方式,甚至在这个级别上也可以进行一些最小的结构化编程。(此处以其他答案/评论为基础)
- 对象文件布局。例如,部分:代码、数据、只读、调试、动态链接。通用的“org”指令告诉汇编程序指令/数据的位置
- 预处理。这包括宏(内联扩展、重复)和有时结构化编程(结构布局、定义寄存器别名)
- 数据定义。包括文件批发,或一次定义字节/字,例如“.byte”、“.word”、“.dw”,具体取决于您的体系结构
大多数C编译器生成汇编,然后将其传递给汇编程序以创建对象文件。如果您在使用标志'-S'运行时查看gcc的输出,您将看到上面的大部分内容都在使用中。如果您打开了调试('-g')和任何动态链接(目前默认),您将看到大量的程序集,而不仅仅用于说明。我认为每个人都给出了相同的答案。指令集是处理器可以执行或理解的所有指令的集合(如数学)。汇编语言是一种编程语言 让我根据您提出的一些问题来尝试一些例子。我将用手头的任何代码在处理器之间跳跃 指令、操作码、二进制或机器语言,用于加载到处理器中进行解码和执行的位/字节的任何术语。一个例子
0x5C0B
汇编语言将是
add r12,r11
对于这个特定的处理器。在这种情况下,这意味着r11=r11+r12。所以我把这个文本,加上r12,r11在一个文本文件中,然后用汇编程序(一个编译汇编语言的程序)把它汇编成某种形式的二进制。像任何编程语言一样,有时您创建对象文件,然后将它们链接在一起,有时您可以直接使用二进制文件。还有许多形式的二进制文件,它们是ascii和二进制形式,还有其他的讨论
现在,在不属于指令集的汇编程序中,您可以做什么?它们有何不同?首先,您可以使用宏:
.macro add3 arg1, arg2, arg3
add \arg1,\arg3
add \arg2,\arg3
.endm
.text
add3 r10,r11,r12
宏类似于内联函数,它们不是被调用的函数,而是生成内联代码的函数。例如,与C宏没有什么不同。因此,您可以使用它们来保存一些输入,或者您可以使用它们来抽象一些您希望反复执行的操作,并希望能够在一个地方进行更改,而不必触及每个实例。上述示例基本上生成了以下内容:
add r10,r12
add r11,r12
指令集和汇编语言之间的另一个区别是伪指令,例如,对于这个特定的指令集,没有用于从堆栈中弹出内容的pop指令,至少没有这个名称,我将解释原因。但您可以保存一些键入并在代码中使用pop:
pop r12
没有pop的原因是寻址模式足够灵活,可以从源寄存器中的地址读取数据,将值放入目标寄存器,并将源寄存器增加一个字。此指令集的汇编程序中的哪个是
mov @r1+,r12
pop和mov都会产生操作码0x413C
指令集和汇编程序之间的另一个差异示例是切换指令集,如下所示:
ldr r0,=bob
对于这种汇编语言来说,这意味着将bob的地址加载到寄存器0中,没有相应的指令,汇编程序对它所做的是生成一些类似于这样的东西,如果您手动将其写入汇编程序:
ldr r0,ZZ123
...
ZZ123: .word bob
基本上,在一个可以从该指令到达的地方,而不是在
call fun
mov bob,r1
hang: b hang
b .
b 2f
1:
b 1b
b 1f
1:
b 1b
2: