gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 11:50:08 26 4
gpt4 key购买 nike

我想知道是否 instruction setassembly language是一样的吗?

如果不是,它们有什么不同,它们的关系是什么?

感谢致敬!

最佳答案

我想每个人都会给你同样的答案。指令集是处理器可以执行或理解的所有指令的集合(如在数学中)。汇编语言是一种编程语言。

让我根据您提出的一些问题尝试一些示例。我将使用我手头的任何代码从一个处理器跳到另一个处理器。

指令或操作码或二进制或机器语言,无论您想对加载到处理器中以进行解码和执行的位/字节使用什么术语。一个例子

0x5C0B

汇编语言,将是
add r12,r11

对于这个特定的处理器。在这种情况下,这意味着 r11 = r11 + r12。所以我把那个文本,add 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 r12

没有弹出的原因是因为寻址模式足够灵活,可以从源寄存器中的地址读取将值放入目标寄存器并将源寄存器增加一个字。该指令集的汇编程序中的哪个是
mov @r1+,r12

pop 和 mov 的结果都是操作码 0x413C。

指令集和汇编器之间差异的另一个示例,即切换指令集,如下所示:
ldr r0,=bob

对于这种汇编语言来说,这意味着将 bob 的地址加载到寄存器 0 中,没有任何指令,汇编器对它所做的是生成一些看起来像这样的东西,如果你用手在汇编器中编写它:
ldr r0,ZZ123
...
ZZ123: .word bob

本质上,在该指令可到达的位置,而不是在执行路径中,会创建一个字,链接器将用 bob 的地址填充该字。汇编器或链接器的 ldr 指令同样将使用 pc 相关指令的 ldr 进行编码。

这导致指令集和汇编语言之间存在一整套差异
call fun

机器代码无法知道什么是乐趣或在哪里可以找到它。对于这个具有多种寻址模式的指令集(注意,我特意并有意避免命名我正在使用的指令集,因为这与讨论无关)可能是汇编器或链接器(取决于 fun 函数在哪里结束) up 相对于该指令)。

汇编器可以选择将该指令编码为相对于 pc 的指令,如果 fun 函数在 call 指令之前 40 个字节,它可以使用等效的 call pc+36 对其进行编码(去掉 4 个,因为 pc 在执行时是一条指令这是一个 4 字节的指令)。

或者,汇编器可能不知道在哪里或有什么乐趣而将其留给链接器,在这种情况下,链接器可能会放置函数的绝对地址,类似于调用#0xD00D。

加载和存储也是如此,有些指令集有近远pc相对,有些有绝对地址等等。你可能不在乎选择,你可能会说
mov bob,r1 

汇编器或链接器或两者的组合负责其余的工作。

请注意,对于某些指令集,汇编器和链接器可能会在一个程序中同时发生。这些天我们习惯了编译为对象然后链接对象的模型,但并非所有汇编程序都遵循该模型。

汇编语言可以采取一些捷径的更多情况:
hang: b hang
b .
b 2f
1:
b 1b
b 1f
1:
b 1b
2:

挂起:b 挂起是有道理的,分支到称为挂起的标签。本质上是自我的一个分支。顾名思义,这是一个无限循环。但是对于这种汇编语言 b .意味着分支到自我,一个无限循环,但我不必发明一个标签,输入它并分支到它。另一个快捷方式是使用数字 b 1b 表示分支到 1 返回,汇编器查找指令后面或上方的标签号 1。 b 1f 不是指向 self 的分支,表示向前的分支 1,这是此汇编程序的完全有效代码。它将向前或在代码行下方寻找标签编号 1:并且您可以在汇编语言程序中为该汇编器疯狂地重复使用编号 1,从而不必为简单的短分支发明标签名称。第二个 b 1b 分支到第二个 1. 并且是到 self 的分支。

了解创建处理器的公司定义了指令集、机器代码或操作码或它们或您用于处理器解码和执行的位和字节的任何术语,了解这一点很重要。很多时候,该公司会为这些指令生成一个带有汇编语言的文档,即一种语法。通常,该公司会生成一个汇编程序来编译/组装该汇编语言……使用该语法。但这并不意味着地球上选择为该指令集编写汇编程序的任何其他人都必须使用该语法。这在 x86 指令集上非常明显。同样,任何伪指令(如上面的 pop 或宏语法或其他快捷方式(如 b 1b))必须从一个汇编器传递到另一个汇编器。很多时候不是,你会在 ARM 中看到这个,例如 ; 的通用注释符号。不适用于 gnu 汇编程序,您必须改用 @。 ARMs 汇编器确实使用 ; (请注意,我用 ;@ 编写了我的 arm 汇编程序以使其可移植)。例如,使用 gnu 工具会变得更糟,您可以在汇编程序中放入 C 语言内容,例如 #define 和/* comment */并使用 C 编译器而不是汇编程序,它会起作用。我更喜欢尽可能保持纯粹以获得最大的便携性,但您自然可以选择使用该工具提供的任何功能。

关于assembly - 指令集和汇编语言是一回事吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5382130/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com