汇编语言和二进制之间有什么区别?

8

我有困难理解汇编语言和二进制之间的区别。 我只需要了解链接二进制和汇编语言之间的关系。

4个回答

11

汇编语言基本上是以人类可以阅读的形式编写的二进制代码。 然后,汇编器逐行将汇编代码转换为相应的位代码。

想象一下,有一个表格,每个可能的汇编语句都有一行。 然后,在每行的左侧是语句本身,右侧是计算机可以理解的相应位。

话虽如此,汇编器还具有额外的功能,例如宏等,但主要功能是上述描述的功能。


9
对于程序员来说,二进制只是一种数字系统。例如,base2 由一些0和1组成。所有计算机都使用这些二进制数(0和1)。它们将指令视为这些数字的集合。它们不感知通常使用高级编程语言(如Python、Java等)生成的人工生成的代码。
显然,计算机中的机器指令并不真正可读性强 - 大多数人无法通过查看指令字节的二进制或十六进制表示来确定100010001...和010001000...之间的操作差异。这些指令只是机器码
例如,在x86-16架构中,将一个值加载到寄存器的机器码指令采用这个HEX代码:8B 0E 34 12,其中8B表示mov r16, r/m160E指定目标寄存器(在本例中为CX),以及带有2位寻址模式字段和3位基础寄存器的内存/源寄存器(在这种特定情况下,没有寄存器,只有16位绝对位移)。
附言:需要明确的是,HEX代码用于表示机器码。实际上,将其转换为二进制“10001011000011100011010000010010”很容易,这就是您所提到的二进制。HEX只是一种文本序列化格式,用于像ASCII 0和1串一样的二进制数字,但更紧凑。
汇编比机器码更高级,使二进制/HEX指令可读。例如,机器码8B 0E 34 12将被解码/反汇编为MOV CX,[1234H]

3

标签的维基页面开始阐述了这个问题的答案。你应该阅读一下它。

汇编程序将人类可读的汇编语言转换为二进制文件的字节。汇编语言源代码可以直接指定字节,使用十六进制或其他格式。在x86 NASM语法中,您可以使用db 0x30语句将该字节汇编到当前输出位置。

您还可以使用机器指令的助记符。例如,add eax,[rdi + rdx * 4]可以要求Intel语法的x86汇编器发出编码该指令的字节。然后,汇编器计算出将该指令编码为机器码的最短(或唯一)方法,并将这些字节放入输出中。

此外,现代目标文件格式存在多个部分(如.text.data),您可以选择将字节汇编到哪个部分中。因此,您可以使常量保持靠近使用它们的代码,而不会在最终二进制文件中混合代码和数据。

例如,查看this godbolt link。在右侧面板中,您可以看到二进制和相应的汇编源代码。

1
如果这个回答解决了你的问题,你可以在赞成/反对箭头下面勾选“接受”复选框。 - Peter Cordes

0

二进制不仅仅是用来表示“数字”的一种数字系统,还可以表示一些对象并用作字符。例如数字“2”,当您将其视为数字时,它是数字,您可以将其相加,也许某人的ID是2,您称之为第二个,但您不会计算它,因为它实际上是一个字符...

二进制和汇编是一对一的匹配,这意味着您在汇编中编写的内容实际上是二进制。

例如,在我们拥有汇编之前,您想要添加1和1,您可能需要:

1.将1加载到累加器

2.将1与累加器中的1相加

3.将其存储在地址中

但是您只能使用二进制指令来表示...那么您能做什么?唯一能做的就是使用0和1的组合来表示您需要执行的操作。让我们考虑0001表示加载,0010表示添加,0011表示存储,因此您可能会编写类似以下的内容:

0001 000000001

0010 000000001

0011 000000101(000000101 is a location where you store the stuffs in 

accumulator)

这有点混乱,所以很聪明的你提出了一个好主意,即使用可读性强的单词来表示指令,如下:

0001 -> load

0010 -> add

0011 -> store

所以你可以用汇编语言编写它...

load  1

add   1

store 5

这是很容易理解的汇编语言!(当然,你可以将数字转换为十六进制形式以缩写~)

你可以看到,当你翻译它时,0001实际上不是一个数字,而00000001才是。所以0001只是一种表示法,汇编语言用于替换字符类型表示法以便更好地阅读。00000001才是真正的数字,你可以用任何其他形式来书写它,但巧合的是,对于十进制来说是1,对于十六进制也是1:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接