Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 为什么nasm在寄存器之间组装MOV指令时使用0x89?_Assembly_X86_Nasm_Instructions - Fatal编程技术网

Assembly 为什么nasm在寄存器之间组装MOV指令时使用0x89?

Assembly 为什么nasm在寄存器之间组装MOV指令时使用0x89?,assembly,x86,nasm,instructions,Assembly,X86,Nasm,Instructions,为什么NASM在两个寄存器之间组装MOV指令时使用0x89操作码(137) 下面是使用NASM组装的代码示例: 55 push ebp 89E5 mov ebp, esp 83EC04 sub esp, byte +0x4 31C0 xor eax, eax C9 leave C3 ret 我想要这样的东西: 55 push ebp 8BEC mov ebp, esp 83EC04 sub esp, byte +0x4 33C0

为什么NASM在两个寄存器之间组装
MOV
指令时使用0x89操作码(137)

下面是使用NASM组装的代码示例:

55      push ebp
89E5    mov ebp, esp
83EC04  sub esp, byte +0x4
31C0    xor eax, eax
C9      leave
C3      ret
我想要这样的东西:

55      push ebp
8BEC    mov ebp, esp
83EC04  sub esp, byte +0x4
33C0    xor eax, eax
C9      leave
C3      ret
我想要0x8B的原因是:如果您查看
MOV
指令的二进制表示,它在NASM中看起来是这样的:

Opcode     Mod   Reg   R/M
10001001   11    100   101 (89 E5)
令人困惑的是,reg操作数是第二个

NASM语法如下:
0x89 11 source\u reg destination\u reg


MOV指令是
MOV destination\u reg,source\u reg

这两个操作码是相同的。这就是x86的冗余。汇编程序可以选择它喜欢的任何东西

x86体系结构的典型指令有两个操作码。第一个操作数有一个寄存器作为第一个操作数,第二个操作数有一个寄存器或内存位置(在操作码参考中缩写为
“reg,reg/mem32”
,或在操作码表中缩写为
“Gv,Ev”
)。第二个操作码的操作数是反向的(即缩写为
“reg/mem32,reg”
“Ev,Gv”
)。这是有道理的:处理器必须知道它是复制到内存中,还是从内存中复制。但当两个操作数都是寄存器时,编码变得冗余:

像这样的reg/reg样式远远不止这些。看到了吗

不同的汇编器发出不同的操作码,因此可以使用此技术

某些汇编程序允许您选择编码。例如,如果将
.s
粘贴到末尾,气体可能会发出另一种编码

10 de   adcb   %bl,%dh
12 f3   adcb.s %bl,%dh

这两个操作码是相同的。这就是x86的冗余。汇编程序可以选择它喜欢的任何东西

x86体系结构的典型指令有两个操作码。第一个操作数有一个寄存器作为第一个操作数,第二个操作数有一个寄存器或内存位置(在操作码参考中缩写为
“reg,reg/mem32”
,或在操作码表中缩写为
“Gv,Ev”
)。第二个操作码的操作数是反向的(即缩写为
“reg/mem32,reg”
“Ev,Gv”
)。这是有道理的:处理器必须知道它是复制到内存中,还是从内存中复制。但当两个操作数都是寄存器时,编码变得冗余:

像这样的reg/reg样式远远不止这些。看到了吗

不同的汇编器发出不同的操作码,因此可以使用此技术

某些汇编程序允许您选择编码。例如,如果将
.s
粘贴到末尾,气体可能会发出另一种编码

10 de   adcb   %bl,%dh
12 f3   adcb.s %bl,%dh

为什么不呢?8B一点也不好。
0x89
有什么问题吗?
0x89
movr/m32,r32
mov ebp,esp
适合这种格式,那么NASM为什么要使用其他操作码呢?为什么不?8B一点也不好。
0x89
有什么问题吗?
0x89
movr/m32,r32
mov ebp,esp
适合这种格式,那么NASM为什么要使用其他操作码呢?