Assembly和binary有什么区别?

问题描述 投票:3回答:4

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

assembly binary executable machine-code
4个回答
9
投票

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

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

也就是说汇编程序还具有宏等功能,但主要功能如上所述。


5
投票

对于程序员来说,Binary只是一个数字系统。例如,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”,这就是你提到的Binary。十六进制只是二进制数的文本序列化格式,如ASCII 0和1的字符串,但更紧凑。

装配比机器代码更高级,并使这种指令对人类可读。机器代码8B 0E 34 12解码/反汇编到MOV CX, [1234H]


3
投票

标签维基开始时或多或少地回答了这个问题。你应该阅读它。

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

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

还有其他复杂情况,例如现代目标文件格式有多个部分(如.text.data),您可以选择将字节组装到哪个部分。因此,您可以将常量保持在使用它们的代码附近,而无需在最终二进制文件中实际混合代码和数据。

例如,请参阅this godbolt link。在右侧窗格中,您可以看到二进制文件和相应的asm源。


0
投票

二进制不是用作数字系统来表示'数字',而是也可以表示一些对象并用作char。拿一个像'2'的例子,当你把它看成一个数字时,它是数字,你可以添加它,也许某人的身份2,你叫他2号,但是你不会计算它,因为它在事实上是一个焦点....

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

例如,在我们进行汇编之前,您需要添加一个和一个,您可能需要:

1.将1加载到累加器

2.在蓄能器中加1

3.将其存储在一个地址中

但你只能使用brinary insctrction来表示......你能做什么?唯一可以的是使用0和1的组合来表示你需要做的事情。让我们认为0001意味着加载,0010意味着添加,0011作为商店,所以你可能会写如下:

0001 000000001

0010 000000001

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

累加器)

这是非常混乱,所以聪明的你出来一个好主意,这是使用可读的单词来反复这样的指示:

0001 -> load

0010 -> add

0011 -> store

所以你可以在汇编中写出......

load  1

add   1

store 5

这很容易理解汇编!(当然你可以将数字改成十六进制形式为缩写〜)

你可以看到,当你翻译它时,0001实际上不是一个数字,00000001是。所以0001只是一个符号,并且汇编用于替换cahr类型的符号以便更好地读取。 00000001实际上是一个数字,你可以在任何其他形式上编写它,但巧合的是十进制是1,对于十六进制也是1 :)

© www.soinside.com 2019 - 2024. All rights reserved.