哪些x86指令需要两个(或更多)内存操作数?

时间:2018-09-30 00:10:52

标签: assembly x86 instructions machine-instruction

我认为那里是零。但是,I see here,

  

带有两个内存操作数的指令极为罕见

我找不到任何能解释什么指令的资料,尽管很少见。有什么例外?

1 个答案:

答案 0 :(得分:13)

  

我找不到任何能解释稀有性的东西。

x86指令最多可以具有一个ModR / M + SIB + disp0 / 8/32。因此,零指令包含两个显式内存操作数。

x86存储器指令全都具有至少一个隐式存储器操作数,其位置被烘焙到操作码中,例如<Sidebar items={items}>可以访问堆栈,或字符串指令{{ 1}}和push

  

有什么例外?

我将使用movs来指示ModR / M寻址模式,该模式可以是cmps[mem][rdi]或任何您喜欢的模式。

  • [RIP+whatever]:读取[ebx+eax*4+1234],写入隐式push [mem](在更新[mem]之后)。
  • [rsp]
  • rsp:从pop [mem]读取新的RIP,将返回地址压入堆栈。
  • movsb/w/d/q:读取call [mem],写入[mem](或在64位模式RSI和RDI中)。两者都是隐式的;只有segment reg是可重写的。可与DS:(E)SI一起使用。
  • cmpsb/w/d/q:读取ES:(E)DIrep(或在64位模式下的RSI和RDI)。两者都是隐式的;只有segment reg是可重写的。可与DS:(E)SI / ES:(E)DI一起使用。

  • MPX bndstx mib, bnd:“使用mib的基地址通过地址转换将bnd中的边界和mib的索引寄存器中的指针值存储到绑定表条目(BTE)。 “操作”部分显示了负载和存储,但是我对MPX不够了解,无法理解它。

  • movdir64b r16/r32/r64, m512。有自己的功能位,in upcoming Tremont(Goldmont Plus Atom的后继产品)可用。将具有64字节写原子性的64字节直接存储(WC)从源内存地址移动到目标内存地址。目标操作数是ModRM中的(对齐原子)repe repne,源操作数是ModRM中的es:(非对齐非原子)。

    对商店使用写合并,请参阅描述。这是x86 CPU供应商第一次保证原子性超出/r之外的8个字节。但是不幸的是,它实际上对多线程并不是很好,因为它会强制执行类似NT的缓存逐出/旁路行为,因此其他内核将不得不从DRAM读取它,而不是共享的外部缓存。

AVX2收集和AVX512分散指令值得商bat。它们显然会进行多次加载/存储,但是所有指针都来自一个SIMD向量(和标量基数)。

我没有计算嵌套级别大于1的/mlock cmpxchg16bxsaveoptpushafldenv之类的指令,这些指令可进行多个存储或加载到一个连续的块中。

我也不计算iret / enter字符串指令,因为它们将内存复制到I / O空间或从I / O空间复制。 I / O空间不是内存。

我没有看到http://felixcloutier.com/x86/index.html上的VMX或SGX指令,只是主列表。我不认为我没有错过任何比赛,但我当然可以。