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