Assembly 汇编语言中的一对一映射转换

Assembly 汇编语言中的一对一映射转换,assembly,compiler-construction,machine-code,Assembly,Compiler Construction,Machine Code,汇编是一种人类可读的语言,但它通常与相应的机器代码有一对一的关系。因此,可以说汇编程序执行同构(一对一映射)转换 我需要知道汇编程序中的一对一映射转换是什么意思。他们的意思是: 如果你有一条机器指令,这是一些n位代码,那么只有一个汇编命令对应于这个n位代码。 如果反过来也是这样,那么就有了一对一的映射。这意味着在汇编文件中编写的每个助记符都对应于机器代码中的一条指令。在某种程度上,程序集文件只是以人类可读的方式表示机器代码的一种方式 请注意,这是一种简化。在某些机器上,某些指令可以由多个助记符表

汇编是一种人类可读的语言,但它通常与相应的机器代码有一对一的关系。因此,可以说汇编程序执行同构(一对一映射)转换


我需要知道汇编程序中的一对一映射转换是什么意思。

他们的意思是:

如果你有一条机器指令,这是一些n位代码,那么只有一个汇编命令对应于这个n位代码。
如果反过来也是这样,那么就有了一对一的映射。

这意味着在汇编文件中编写的每个助记符都对应于机器代码中的一条指令。在某种程度上,程序集文件只是以人类可读的方式表示机器代码的一种方式


请注意,这是一种简化。在某些机器上,某些指令可以由多个助记符表示,而某些指令不能由汇编程序生成。例如,当有多种方法将单个助记符映射到指令时,编译器只选择一种,而其他方法无法实现时,就会发生这种情况。例如,在8086上,您可以将助记符
mov ax、bx
编码为
89 c3
8b d8
,汇编程序通常选择一个选项,而另一个选项不可编码。

当您使用汇编程序执行操作时,汇编程序会逐个映射(意味着只扫描一条指令或助记符)在x86 CPU上的示例中,文本助记符“add al,al”将组合为两个字节
00 C0
,反之,分解两个字节
00 C0
将显示为
add al,al
(特别是对于x86,根据当前的CPU模式(16/32/64)和在指令操作码之前读取的可能前缀字节,同一机器码是不同的CPU指令时存在一些模糊性。但只要知道CPU模式和内存中的操作码起始地址,就只有一个文本助记符来编码该操作码(一些语法变体允许不同的写入方式)例如,
gas
mov.s
作为替代编码。@Jester和你也可以总是使用
db 0x8b,0xd8
来发出你想要的特定操作码。对我来说,这仍然是一个合理的简化,除非OP正是因为这些微小的异常而提出要求,但他可以更具体一些。在一般级别t他的答案很准确。@Ped7g我刚才在想“让另一个无法编码”。它的意思是同构的。:)例如,这意味着一条指令
ADD AX,5
将被编码为一条机器语言指令
0x4805
。请理解这与指令本身、ADD、xor、store、load等有关。但汇编程序的语法、标签和指令不一定会产生错误ny“代码”,但仍然是该汇编程序的汇编语言的一部分。