assembly 汇编语言和二进制语言有什么区别?

xcitsw88  于 2023-03-18  发布在  其他
关注(0)|答案(4)|浏览(234)

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

qeeaahzv

qeeaahzv1#

二进制不仅仅是用来作为一个数字系统来表示一个'数字',但也可以代表一些对象,并作为字符使用。以数字为例,如'2',当你看到它作为一个数字,它是数字,你可以添加它,也许有人的id 2,你叫他no.2,但你不计算它,因为它实际上是一个字符。
binary和assembly是一一对应的,这意味着你在assembly中写的东西实际上是二进制的。
例如,在我们组装之前,您希望添加一个和一个,您可能需要:
1.加载1至蓄能器
2.累加器中的1加1
3.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:)

3wabscal

3wabscal2#

汇编基本上是以人类可以阅读的形式编写的二进制代码。汇编程序然后获取汇编代码,并将其逐行翻译成相应的位代码。
假设有一个表格,每一行对应一个可能的汇编语句,那么在每一行的左边是语句本身,右边是计算机可以理解的相应位
也就是说,汇编器也有额外的功能,如宏等,但主要功能是上面描述的。

cnwbcb6i

cnwbcb6i3#

对于程序员来说,Binary只是一个编号系统。例如,base2由一些0和1组成。所有的计算机都使用这些二进制数(0和1)。他们将指令视为这些数字的集合。他们感觉不到人工生成的代码,这些代码通常是使用高级编程语言(如Python、Java等)生成的。
很明显,计算机中的机器指令并不是真正的“人类可读”--大多数人无法通过查看指令字节的二进制或十六进制表示来找出100010001......和010001000......之间的运算差异,这些指令只是“机器代码”。
例如,在x86-16体系结构中,用于将值加载到寄存器的机器代码将此指令作为十六进制代码:8B 0E 34 12,其中8B表示mov r16, r/m160E指定目标是 * 哪个 * 寄存器(在本例中为CX),以及哪个存储器/源寄存器,具有2位寻址模式字段和3位基址寄存器(在本例中,没有寄存器,只有16位绝对位移)。

  • P.S.* 需要说明的是,HEX代码用于表示机器代码。实际上,将其转换为二进制“1000101100001101000010010”很容易,这就是您提到的 binary。HEX只是二进制数的文本序列化格式,类似于ASCII 0和1的字符串,但更紧凑。
    汇编比机器码更高级,使二进制/十六进制指令可读。例如,机器码8B 0E 34 12将被解码/反汇编为MOV CX, [1234H]
deyfvvtc

deyfvvtc4#

assembly标签wiki开始或多或少回答了这个问题。你应该读一读它。
汇编器将人类可读的汇编语言汇编成二进制文件的字节。asm源代码可以直接指定字节,十六进制或其他格式。在x86 NASM语法中,您可以使用db 0x30语句将该字节汇编到当前输出位置。
你也可以使用机器指令的助记符。例如add eax, [rdi + rdx*4]要求一个Intel语法的x86汇编器输出编码该指令的字节。然后汇编器计算出将该指令编码成机器码的最短(或唯一)方法,并将这些字节放在输出中。
还有更复杂的情况,例如现代的对象文件格式有多个部分(如.text.data),你可以选择字节将被组装到哪个部分,所以你可以将常量放在使用它们的代码附近,而不会在最终的二进制文件中混合代码和数据。
例如,请参见this godbolt link。在右侧窗格中,可以看到二进制文件和相应的asm源。

相关问题