我很难理解汇编和二进制之间的区别,我只是需要理解链接二进制和汇编之间的关系。
qeeaahzv1#
二进制不仅仅是用来作为一个数字系统来表示一个'数字',但也可以代表一些对象,并作为字符使用。以数字为例,如'2',当你看到它作为一个数字,它是数字,你可以添加它,也许有人的id 2,你叫他no.2,但你不计算它,因为它实际上是一个字符。binary和assembly是一一对应的,这意味着你在assembly中写的东西实际上是二进制的。例如,在我们组装之前,您希望添加一个和一个,您可能需要:1.加载1至蓄能器2.累加器中的1加13.store 它在一个地址但是你只能用brinary insctrtion来表示....你能做什么呢?你唯一能做的就是用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:)
3wabscal2#
汇编基本上是以人类可以阅读的形式编写的二进制代码。汇编程序然后获取汇编代码,并将其逐行翻译成相应的位代码。假设有一个表格,每一行对应一个可能的汇编语句,那么在每一行的左边是语句本身,右边是计算机可以理解的相应位也就是说,汇编器也有额外的功能,如宏等,但主要功能是上面描述的。
cnwbcb6i3#
对于程序员来说,Binary只是一个编号系统。例如,base2由一些0和1组成。所有的计算机都使用这些二进制数(0和1)。他们将指令视为这些数字的集合。他们感觉不到人工生成的代码,这些代码通常是使用高级编程语言(如Python、Java等)生成的。很明显,计算机中的机器指令并不是真正的“人类可读”--大多数人无法通过查看指令字节的二进制或十六进制表示来找出100010001......和010001000......之间的运算差异,这些指令只是“机器代码”。例如,在x86-16体系结构中,用于将值加载到寄存器的机器代码将此指令作为十六进制代码:8B 0E 34 12,其中8B表示mov r16, r/m16,0E指定目标是 * 哪个 * 寄存器(在本例中为CX),以及哪个存储器/源寄存器,具有2位寻址模式字段和3位基址寄存器(在本例中,没有寄存器,只有16位绝对位移)。
base2
8B 0E 34 12
8B
mov r16, r/m16
0E
MOV CX, [1234H]
deyfvvtc4#
assembly标签wiki开始或多或少回答了这个问题。你应该读一读它。汇编器将人类可读的汇编语言汇编成二进制文件的字节。asm源代码可以直接指定字节,十六进制或其他格式。在x86 NASM语法中,您可以使用db 0x30语句将该字节汇编到当前输出位置。你也可以使用机器指令的助记符。例如add eax, [rdi + rdx*4]要求一个Intel语法的x86汇编器输出编码该指令的字节。然后汇编器计算出将该指令编码成机器码的最短(或唯一)方法,并将这些字节放在输出中。还有更复杂的情况,例如现代的对象文件格式有多个部分(如.text和.data),你可以选择字节将被组装到哪个部分,所以你可以将常量放在使用它们的代码附近,而不会在最终的二进制文件中混合代码和数据。例如,请参见this godbolt link。在右侧窗格中,可以看到二进制文件和相应的asm源。
db 0x30
add eax, [rdi + rdx*4]
.text
.data
4条答案
按热度按时间qeeaahzv1#
二进制不仅仅是用来作为一个数字系统来表示一个'数字',但也可以代表一些对象,并作为字符使用。以数字为例,如'2',当你看到它作为一个数字,它是数字,你可以添加它,也许有人的id 2,你叫他no.2,但你不计算它,因为它实际上是一个字符。
binary和assembly是一一对应的,这意味着你在assembly中写的东西实际上是二进制的。
例如,在我们组装之前,您希望添加一个和一个,您可能需要:
1.加载1至蓄能器
2.累加器中的1加1
3.store 它在一个地址
但是你只能用brinary insctrtion来表示....你能做什么呢?你唯一能做的就是用0和1的组合来表示你需要做的事情。让我们假设0001表示加载,0010表示添加,0011表示存储,所以你可以写这样的东西:
累加器)
这是相当混乱,所以聪明的你想出了一个好主意,这是用可读的话重复这样的指示:
这样你就可以用汇编语言来写了。
这是很容易理解的汇编!(当然你可以把数字改成十六进制的缩写~)
你可以看到,当你翻译它的时候,0001实际上不是一个数字,00000001是。所以0001只是一个符号,为了更好的阅读,汇编被用来代替cahr类型的符号。00000001实际上是一个数字,你可以用任何其他的形式写它,但是巧合的是十进制是1,十六进制也是1:)
3wabscal2#
汇编基本上是以人类可以阅读的形式编写的二进制代码。汇编程序然后获取汇编代码,并将其逐行翻译成相应的位代码。
假设有一个表格,每一行对应一个可能的汇编语句,那么在每一行的左边是语句本身,右边是计算机可以理解的相应位
也就是说,汇编器也有额外的功能,如宏等,但主要功能是上面描述的。
cnwbcb6i3#
对于程序员来说,Binary只是一个编号系统。例如,
base2
由一些0和1组成。所有的计算机都使用这些二进制数(0和1)。他们将指令视为这些数字的集合。他们感觉不到人工生成的代码,这些代码通常是使用高级编程语言(如Python、Java等)生成的。很明显,计算机中的机器指令并不是真正的“人类可读”--大多数人无法通过查看指令字节的二进制或十六进制表示来找出100010001......和010001000......之间的运算差异,这些指令只是“机器代码”。
例如,在x86-16体系结构中,用于将值加载到寄存器的机器代码将此指令作为十六进制代码:
8B 0E 34 12
,其中8B
表示mov r16, r/m16
,0E
指定目标是 * 哪个 * 寄存器(在本例中为CX),以及哪个存储器/源寄存器,具有2位寻址模式字段和3位基址寄存器(在本例中,没有寄存器,只有16位绝对位移)。汇编比机器码更高级,使二进制/十六进制指令可读。例如,机器码
8B 0E 34 12
将被解码/反汇编为MOV CX, [1234H]
。deyfvvtc4#
assembly标签wiki开始或多或少回答了这个问题。你应该读一读它。
汇编器将人类可读的汇编语言汇编成二进制文件的字节。asm源代码可以直接指定字节,十六进制或其他格式。在x86 NASM语法中,您可以使用
db 0x30
语句将该字节汇编到当前输出位置。你也可以使用机器指令的助记符。例如
add eax, [rdi + rdx*4]
要求一个Intel语法的x86汇编器输出编码该指令的字节。然后汇编器计算出将该指令编码成机器码的最短(或唯一)方法,并将这些字节放在输出中。还有更复杂的情况,例如现代的对象文件格式有多个部分(如
.text
和.data
),你可以选择字节将被组装到哪个部分,所以你可以将常量放在使用它们的代码附近,而不会在最终的二进制文件中混合代码和数据。例如,请参见this godbolt link。在右侧窗格中,可以看到二进制文件和相应的asm源。