【问题标题】:x86: using register as an intermediate, why? [duplicate]x86:使用寄存器作为中间体,为什么? [复制]
【发布时间】:2017-10-15 19:05:52
【问题描述】:

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

然后,使用movl (%eax), 0xabc0x987 不会作为0xabc 的内容移动吗?为什么我们需要另一个寄存器来做到这一点?即

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

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

【问题讨论】:

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

标签: x86


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2023-03-23
    • 2014-11-19
    • 2018-07-21
    • 2018-01-16
    • 2010-10-27
    • 2015-02-03
    • 2013-04-21
    • 2022-01-13
    • 2018-01-21
    相关资源
    最近更新 更多