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

Eva*_*oll 3 x86 assembly instructions machine-instruction

我以为没有.但是,我在这里看到,

具有两个存储器操作数的指令极为罕见

我找不到任何可以解释什么指令的内容,尽管很少见.有什么例外?

Pet*_*des 13

我找不到任何可以解释稀有性的东西.

x86指令最多只能有一个ModR/M + SIB + disp0/8/32.因此,有两个显式内存操作数的零指令.

x86内存存储器指令都至少有一个隐式内存操作数,其位置被写入操作码,就像push访问堆栈一样,或者字符串指令movscmps.

有什么例外?

我将使用[mem]以表明它可以是一个MODR/M寻址模式[rdi],[RIP+whatever],[ebx+eax*4+1234],或任何你喜欢.

  • push [mem]:读取[mem],写入隐式[rsp](更新后rsp).
  • pop [mem]
  • call [mem]:从中读取新的RIP [mem],在堆栈上推送返回地址.
  • movsb/w/d/q:读取DS:(E)SI,写入ES:(E)DI (或64位模式RSI和RDI).两者都是隐含的; 只有段reg可以覆盖.适用于DS.
  • rep:读取cmpsb/w/d/qDS:(E)SI (或在64位模式下RSI和RDI).两者都是隐含的; 只有段reg可以覆盖.适用于ES:(E)DI/ DS.

  • MPX repe:"将bnd中的边界和mib的索引寄存器中的指针值存储到绑定表条目(BTE),并使用mib的基址进行地址转换." 操作部分显示了一个负载和一个商店,但我不太了解MPX来理解它.

  • repne.有自己的功能位,可在即将推出的Tremont(Goldmont Plus Atom的继任者)中使用.将64字节作为直接存储(WC)移动,具有64字节写入原子性,从源存储器地址到目标存储器地址.目标操作数是(对齐原子)bndstx mib, bnd movdir64b r16/r32/r64, m512来自ModRM,源是(未对齐的非原子)es:来自ModRM.

    对商店使用写合并,请参阅说明.这是任何x86 CPU供应商第一次保证原子性超过8个字节/r.但不幸的是,它对于多线程实际上并不是很好,因为它会强制类似NT的高速缓存驱逐/绕过行为,因此其他内核必须从DRAM而不是共享外部高速缓存中读取它.

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

我不计算指令等/m,lock cmpxchg16b,pusha,fldenv,或xsaveopt与嵌套级别> 1是做多的商店或载荷的连续块.

我也没有计算iret/ enterstring指令,因为它们将内存复制到I/O空间或从I/O空间复制内存.I/O空间不是内存.

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