我很难理解汇编和二进制之间的区别。 我只需要了解链接二进制和汇编之间的关系。
答案 0 :(得分:8)
汇编基本上是以人类可以阅读的形式编写的二进制代码。汇编器然后获取汇编代码并逐行将其转换为相应的位代码。
想象一下,每个可能的汇编语句都有一个包含一行的表。然后在每一行上左边是语句本身,右边是计算机可以理解的相应位
据说汇编程序还具有宏等功能,但主要功能如上所述。
答案 1 :(得分:5)
对于程序员来说, Binary 只是一个数字系统。例如,Base2由一些0和1组成。所有计算机都使用这些二进制数(0和1)。他们假设指令就像一组这些数字。他们感觉不到人为生成的代码,这些代码通常由高级编程语言(如Python,Java等)生成。
很明显,计算机中的机器指令实际上并不是人类可读 - 大多数人都无法弄清楚100010001 ...和010001000之间的操作差异......只需看一下指令字节的二进制或十六进制表示。这些说明只是机器代码。
例如,用于将值加载到x86-16中的寄存器的机器代码将此指令作为HEX代码8B 0E 34 12
,其中8B
表示mov r16, r/m16
和0E
指定哪个寄存器目的地(在本例中为CX),以及具有2位寻址模式字段和3位基址寄存器的存储器/寄存器源(在这种情况下没有寄存器,只有16位)绝对位移)。
PS 为了清楚起见,Hex代码用于表示机器代码,实际上很容易翻译成二进制“10001011000011100011010000010010”,这就是你提到的 Binary 。十六进制只是二进制数的文本序列化格式,如ASCII 0和1的字符串,但更紧凑。
程序集比机器代码更高级别,并使这样的指令对人类可读。机器代码8B 0E 34 12
解码/反汇编为MOV CX, [1234H]
。
答案 2 :(得分:3)
assembly标记维基开始时或多或少地回答了这个问题。你应该阅读它。
汇编程序将人类可读的汇编语言汇编为二进制文件的字节。 asm源可以直接指定字节,十六进制或其他。在x86 NASM语法中,您可以使用db 0x30
语句将该字节组合到当前输出位置。
您还可以将助记符用于机器指令。例如add eax, [rdi + rdx*4]
要求Intel-syntax x86汇编程序发出编码该指令的字节。汇编程序然后计算出将该指令编码为机器代码的最短(或唯一)方式,并将这些字节放在输出中。
还有其他复杂情况,例如现代目标文件格式有多个部分(如.text
和.data
),您可以选择将字节组装到哪个部分。因此,您可以将常量保持在使用它们的代码附近,而无需在最终二进制文件中实际混合代码和数据。
例如,请参阅this godbolt link。在右侧窗格中,您可以看到二进制文件和相应的asm源。
答案 3 :(得分:0)
Binary不是用作数字系统来表示'数字',但也可以代表某些对象并用作char。举一个像' 2'这样的例子,当你把它看作一个数字时,它是数字,你可以添加它,也许某人的身份是2,你叫他2号,但是你不会计算它,因为它实际上是一个字符......
二进制和汇编是一对一的匹配,这意味着你在汇编中写的实际上是二进制的。
例如,在我们进行汇编之前,您需要添加一个和一个,您可能需要:
1.将1加载到累加器
2.add 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:)