Bou*_* Kh 4 binary assembly executable machine-code
我很难理解汇编和二进制之间的区别.我只需要了解链接二进制和汇编之间的关系.
小智 9
汇编基本上是以人类可以阅读的形式编写的二进制代码.然后汇编器获取汇编代码并逐行将其转换为相应的位代码.
想象一下,每个可能的汇编语句都有一个表格.然后在每一行上左边是语句本身,右边是计算机可以理解的相应位
也就是说汇编程序还具有宏等功能,但主要功能如上所述.
对于程序员来说,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]
.
程序集标签 wiki 首先或多或少地回答了这个问题。你应该阅读它。
汇编器将人类可读的汇编语言汇编成二进制文件的字节。asm 源可以直接指定字节(十六进制或其他形式)。在 x86 NASM 语法中,您可以使用db 0x30
语句将该字节组装到当前输出位置。
您还可以使用机器指令助记符。例如add eax, [rdi + rdx*4]
,要求 Intel 语法 x86 汇编器发出编码该指令的字节。然后,汇编器找出将该指令编码为机器代码的最短(或唯一)方法,并将这些字节放入输出中。
还有更多的复杂性,例如现代目标文件格式有多个部分(如.text
和.data
),您可以选择将字节组装到哪个部分。因此,您可以将常量保留在使用它们的代码附近,而无需在最终的二进制文件中实际混合代码和数据。
例如,请参阅这个 godbolt 链接。在右侧窗格中,您可以看到二进制文件和相应的 asm 源代码。
归档时间: |
|
查看次数: |
5220 次 |
最近记录: |