x86:为什么使用寄存器作为中间层?

x86:为什么使用寄存器作为中间层?,x86,X86,比如说,%eax有内容0x123,0x123有内容0x987。和地址0xabc有内容0x100 然后,使用movl(%eax),0xabc, 是否将0x987作为0xabc的内容移动?为什么我们需要另一个寄存器来执行此操作?i、 e movl (%eax), %eax movl %eax, 0xabc 类似地,movl 0xabc,(%eax)是否会将0x100移动到%eax的地址,即0x123??我们是否也需要另一个寄存器来执行此操作?这是因为x86不提供内存到内存的简单mov指令。

比如说,
%eax
有内容
0x123
0x123
有内容
0x987。
和地址
0xabc
有内容
0x100

然后,使用
movl(%eax),0xabc
, 是否将
0x987
作为
0xabc
的内容移动?为什么我们需要另一个寄存器来执行此操作?i、 e

movl (%eax), %eax    
movl %eax, 0xabc

类似地,
movl 0xabc,(%eax)
是否会将
0x100
移动到
%eax的地址,即0x123??
我们是否也需要另一个寄存器来执行此操作?

这是因为x86不提供内存到内存的简单
mov
指令。可以查看所有提供的表单并扫描列表,您将看到基本上是加载(从内存中移动)、存储(移动到内存)和注册注册表表单,但没有一个是从内存中加载和存储的


x86确实提供了更复杂的指令,例如从内存加载和存储的
movsd
:例如,该指令将4个字节从
rsi
移动到
rdi
。不过,在您的场景中,这些可能并没有真正的帮助:它们仍然需要两个地址寄存器,因为地址没有“立即”表单。它们仅在
rep mov
表单中用于执行可变长度内存复制。

因为x86 mov指令不需要两个内存操作数。