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

时间:2017-10-15 19:05:52

标签: x86

我们可以说,%eax的内容为0x1230x123的内容为0x987.,地址0xabc的内容为0x100

然后,movl (%eax), 0xabc, 不会0x987移动0xabc的内容?为什么我们需要另一个注册表呢?即

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

同样地,movl 0xabc, (%eax)不会将0x100移动到%eax i.e. 0x123??的地址吗?我们还需要另一个寄存器来执行此操作吗?

1 个答案:

答案 0 :(得分:1)

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

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