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

标签 assembly x86 instructions machine-instruction

我以为是零。但是,I see here,

Instructions with two memory operands are extremely rare



我找不到任何可以解释存在哪些指令的东西,虽然很少见。有哪些异常(exception)?

最佳答案

I can't find anything that explains the rarity.



一条 x86 指令最多可以有一个 ModR/M + SIB + disp0/8/32。所以有两个显式内存操作数的指令为零。

x86 内存-内存指令都至少有一个隐式内存操作数,其位置被烘焙到操作码中,例如 push访问堆栈或字符串指令movscmps .

What are the exceptions?



我将使用 [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)SIES:(E)DI (或在 64 位模式 RSI 和 RDI 中)。两者都是隐含的;只有 DS段 reg 是可覆盖的。可用于 repe/repne .
  • MPX bndstx mib, bnd :“将 bnd 中的边界和 mib 索引寄存器中的指针值存储到绑定(bind)表条目 (BTE),并使用 mib 的基址进行地址转换。”操作部分显示了一个负载和一个存储,但我对 MPX 的了解还不够,无法理解它。
  • movdir64b r16/r32/r64, m512 .有自己的功能位,可用in upcoming Tremont (Goldmont Plus Atom 的继任者)。将 64 字节作为具有 64 字节写入原子性的直接存储 (WC) 从源内存地址移动到目标内存地址。目标操作数是(对齐的原子)es: /r来自 ModRM,来源是(未对齐的非原子)/m来自 ModRM。

    对存储使用写组合,请参阅描述。这是任何 x86 CPU 供应商第一次保证在 lock cmpxchg16b 之外超过 8 个字节的原子性。 .但不幸的是,它实际上并不适合多线程,因为它会强制执行类似 NT 的缓存驱逐/绕过行为,因此其他内核将不得不从 DRAM 而不是共享的外部缓存中读取它。

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

    我不计算像 pusha 这样的指令, fldenv , xsaveopt , iret , 或 enter嵌套级别 > 1,对连续 block 执行多次存储或加载。

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

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

    关于assembly - 哪些 x86 指令需要两个(或更多)内存操作数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52573554/

    相关文章:

    file - 从程序集中的文件读取时,为什么会出现打开错误?

    c++ - 与零比较时的 int 运算符 != 和 ==

    linux - 端口映射 I/O 地址空间的位置

    x86 - amd和intel程序员模型兼容性

    c - 如何确定在 C 程序中执行的 x86 机器指令的数量?

    c++ - intel Vtune的整数加减事件计数在哪里?

    assembly - 段寄存器的汇编程序使用

    assembly - 在计算 "$ - label"等字符串长度时,x86 汇编中的美元符号 ($) 意味着什么?

    cycle - 少于一个时钟周期的指令

    assembly - `teSTL` eax 与 eax?