我有困难理解汇编语言和二进制之间的区别。 我只需要了解链接二进制和汇编语言之间的关系。
我有困难理解汇编语言和二进制之间的区别。 我只需要了解链接二进制和汇编语言之间的关系。
汇编语言基本上是以人类可以阅读的形式编写的二进制代码。 然后,汇编器逐行将汇编代码转换为相应的位代码。
想象一下,有一个表格,每个可能的汇编语句都有一行。 然后,在每行的左侧是语句本身,右侧是计算机可以理解的相应位。
话虽如此,汇编器还具有额外的功能,例如宏等,但主要功能是上述描述的功能。
base2
由一些0和1组成。所有计算机都使用这些二进制数(0和1)。它们将指令视为这些数字的集合。它们不感知通常使用高级编程语言(如Python、Java等)生成的人工生成的代码。8B 0E 34 12
,其中8B
表示mov r16, r/m16
,0E
指定目标寄存器(在本例中为CX),以及带有2位寻址模式字段和3位基础寄存器的内存/源寄存器(在这种特定情况下,没有寄存器,只有16位绝对位移)。8B 0E 34 12
将被解码/反汇编为MOV CX,[1234H]
。assembly 标签的维基页面开始阐述了这个问题的答案。你应该阅读一下它。
汇编程序将人类可读的汇编语言转换为二进制文件的字节。汇编语言源代码可以直接指定字节,使用十六进制或其他格式。在x86 NASM语法中,您可以使用db 0x30
语句将该字节汇编到当前输出位置。
您还可以使用机器指令的助记符。例如,add eax,[rdi + rdx * 4]
可以要求Intel语法的x86汇编器发出编码该指令的字节。然后,汇编器计算出将该指令编码为机器码的最短(或唯一)方法,并将这些字节放入输出中。
此外,现代目标文件格式存在多个部分(如.text
和.data
),您可以选择将字节汇编到哪个部分中。因此,您可以使常量保持靠近使用它们的代码,而不会在最终二进制文件中混合代码和数据。
二进制不仅仅是用来表示“数字”的一种数字系统,还可以表示一些对象并用作字符。例如数字“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:)