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

2025-10-03 16:10:59

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

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

x86内存-内存指令都至少有一个隐式内存操作数,其位置被放入操作码,如访问堆栈的push或字符串指令movs和cmps。

例外是什么?

我将使用[mem]来指示ModR/M寻址模式,它可以是[rdi]、[RIP+whatever]、[ebx+eax*4+1234]或任何您喜欢的方式。

push [mem]:读取[mem],写入隐式[rsp] (在更新rsp之后)。pop [mem]call [mem]:从[mem]读取一个新的RIP,在堆栈上推送一个返回地址。movsb/w/d/q:读取DS:(E)SI,写入ES:(E)DI (或以64位模式RSI和RDI).两者都是隐式的;只有DS段reg是可重写的。可用于rep。cmpsb/w/d/q:读取DS:(E)SI和ES:(E)DI (或以64位模式读取RSI和RDI).两者都是隐式的;只有DS段reg是可重写的。可用于repe / repne。MPX bndstx mib, bnd:“将bnd中的边界和mib的索引寄存器中的指针值存储到绑定表条目(BTE)中,并使用mib基进行地址转换。”操作部分显示了一个负载和一个存储,但我对MPX还不太了解。movdir64b r16/r32/r64, m512。它有自己的特性位,可用的在即将到来的特雷蒙特 (戈德蒙特+原子的继承者)。将具有64字节写入原子性的64字节直接存储(WC)从源内存地址移动到目标内存地址.目标操作数是(对齐原子) es: /r来自ModRM,源是(未对齐非原子) /m来自ModRM。

使用写组合存储,请参阅说明。这是任何x86 CPU供应商第一次保证lock cmpxchg16b以外的原子性大于8字节。但不幸的是,它实际上并不适合多线程,因为它强制类似NT的缓存驱逐/绕过行为,因此其他内核将不得不从DRAM中读取它,而不是共享的外部缓存。AVX2集合和AVX512散射指令是值得商榷的。它们显然会执行多个加载/存储,但是所有的指针都来自一个SIMD向量(和一个标量基)。

我不计算嵌套级别>1的指令,如pusha、fldenv、xsaveopt、iret或enter,这些指令可以执行多个存储或加载到一个连续块。

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

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