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

问题描述:

可以说,%eax有内容0x1230x123有内容0x987.和地址0xabc有内容0x100x86:使用寄存器作为中间件,为什么?

然后,与movl (%eax), 0xabc, 将不会0x987作为内容0xabc?为什么我们需要另一个注册表来执行此操作?即

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

同样,movl 0xabc, (%eax)不会将其移动到0x100%eax i.e. 0x123??地址我们还需要另一个寄存器以及执行呢?

+0

因为x86 mov指令不占用两个内存操作数。 –

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

86确实提供了更复杂的指令如movsd即做加载和存储从存储器:那一个,例如,移动的4个字节从rsirdi。但是,这些可能并不能真正帮助你:它们仍然需要两个地址寄存器,因为地址没有“直接”形式。它们仅在其rep movs表单中用于执行可变长度内存复制。