Assembly 指令集和汇编语言是一样的吗?

Assembly 指令集和汇编语言是一样的吗?,assembly,instruction-set,Assembly,Instruction Set,我想知道和是不是一回事 如果没有,它们有什么区别,它们之间有什么关系 谢谢和问候 指令由处理器可以执行的所有指令组成,而汇编则是使用这些指令编制程序的程序集。 换句话说,指令集只是CPU可以理解的一组字节,但你不能用它们做任何有用的事情(把指令想象成字母表中的字母),而汇编语言允许你将这些指令(或字母)组合成一个程序(类似于语音)汇编语言将包括指令的助记符,但通常会增加更多,例如: 宏 定义数据的一些方法 定义名称的方法(例如,函数) 编辑:指令(本身)将被编码为二进制,以便CPU读取。助记符是

我想知道和是不是一回事

如果没有,它们有什么区别,它们之间有什么关系

谢谢和问候

指令由处理器可以执行的所有指令组成,而汇编则是使用这些指令编制程序的程序集。

换句话说,指令集只是CPU可以理解的一组字节,但你不能用它们做任何有用的事情(把指令想象成字母表中的字母),而汇编语言允许你将这些指令(或字母)组合成一个程序(类似于语音)汇编语言将包括指令的助记符,但通常会增加更多,例如:

  • 定义数据的一些方法
  • 定义名称的方法(例如,函数)
  • 编辑:指令(本身)将被编码为二进制,以便CPU读取。助记符是指令的名称。例如,在汇编语言中,我可以编写“movax,1”。相应的指令(在x86的情况下)将被编码为B8 0000000 1(十六进制)


    定义数据、宏、函数名等不是实际的指令。宏(很像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: