我们可以说,%eax
的内容为0x123
,0x123
的内容为0x987.
,地址0xabc
的内容为0x100
。
然后,movl (%eax), 0xabc
,
不会0x987
移动0xabc
的内容?为什么我们需要另一个注册表呢?即
movl (%eax), %eax
movl %eax, 0xabc
同样地,movl 0xabc, (%eax)
不会将0x100
移动到%eax i.e. 0x123??
的地址吗?我们还需要另一个寄存器来执行此操作吗?
答案 0 :(得分:1)
这是因为x86不提供内存到内存的简单mov
指令。可以查看所有提供的表单here并扫描列表,您将看到基本上加载(从内存移动),存储(移动到内存)和注册寄存器表单,但没有一个从内存加载和存储。
x86确实提供了更复杂的指令,例如从内存加载和存储的movsd
:例如,它会将rsi
的4个字节移动到rdi
。这些可能在你的场景中并没有真正的帮助:它们仍然需要两个地址寄存器,因为地址没有“立即”形式。它们仅在rep movs
形式中用于执行可变长度的内存复制。