答案 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)DI
和rep
(或在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的/m
,lock cmpxchg16b
,xsaveopt
,pusha
或fldenv
之类的指令,这些指令可进行多个存储或加载到一个连续的块中。
我也不计算iret
/ enter
字符串指令,因为它们将内存复制到I / O空间或从I / O空间复制。 I / O空间不是内存。
我没有看到http://felixcloutier.com/x86/index.html上的VMX或SGX指令,只是主列表。我不认为我没有错过任何比赛,但我当然可以。