当前位置: 首页 > 知识库问答 >
问题:

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

扈瑞
2023-03-14

我以为是零。但是,我明白了,

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

我找不到任何东西来解释存在什么指令,尽管很罕见。例外情况是什么?

共有1个答案

宋志学
2023-03-14

我找不到任何解释这种罕见的东西。

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

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

例外情况是什么?

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

>

  • 推送[mem]:读取[mem],写入隐式[rsp](更新rsp后)。
  • 流行[mem]
  • 调用[mem]:从[mem]中读取一个新的愿逝者安息,在堆栈上推送一个返回地址。
  • 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一起使用。

    MPXbndstx mib,bnd:“将bnd中的边界和mib索引寄存器中的指针值存储到绑定表条目(BTE),并使用mib的基进行地址转换。”操作部分显示了加载和存储,但我对MPX了解不够,无法对其进行探索。

    movdir64b r16/r32/r64,m512。有自己的功能位,可在即将推出的Tremont(Goldmont Plus Atom的后续产品)中使用。将64字节作为具有64字节写入原子性的直接存储(WC)从源内存地址移动到目标内存地址。目标操作数是ModRM中的(对齐原子)es:r,源操作数是ModRM中的(未对齐非原子)m。

    对存储使用写入组合,请参阅说明。这是x86 CPU供应商首次保证在锁cmpxchg16b之外的原子性大于8字节。但不幸的是,它实际上并不适合多线程,因为它强制类似NT的缓存逐出/绕过行为,因此其他内核将不得不从DRAM而不是共享外部缓存中读取它。

    AVX2聚集和AVX512分散指令有争议。显然,它们执行多个加载/存储,但所有指针都来自一个SIMD向量(和标量基)。

    我没有计算pushafldenvxsaveopeiretEnter等具有嵌套级别的指令

    我也没有计算ins的字符串指令,因为它们将内存复制到I/O空间。输入/输出空间不是内存。

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

  •  类似资料:
    • 我发现x86 CPU具有以下内存屏障指令:

    • 我被问到这个问题...的与的-两者都存储从到...哪个占用更多内存?

    • 本文向大家介绍造成内存泄漏的操作有哪些?相关面试题,主要包含被问及造成内存泄漏的操作有哪些?时的应答技巧和注意事项,需要的朋友参考一下 以前使用"引用计数"的时候, 还挺多的, 现在都使用"标记清除"好很多了 最起码循环引用之类的, 不会再内存泄漏了 我觉得比较可能的是, 创建了时间循环, setInterval, 但是没有没有释放掉, 这个比较容易造成内存泄漏

    • 问题内容: 例如,如果我有一个带有两种情况的枚举,它是否比布尔值占用更多的内存?语言:Java,C ++ 问题答案: 在Java中,an 是成熟的类: Java编程语言的枚举类型比其他语言的枚举类型更强大。枚举声明定义了一个类(称为枚举类型)。枚举类主体可以包括方法和其他字段。 为了查看每个文件的实际大小,让我们做一个实际的文件并检查它创建的文件的内容。 假设我们有以下枚举类: 编译以上内容并反汇

    • 新手问题。我最近遇到了一个包含大量文件和外部库的项目。其中一些库包含Makefiles和CmakeList。txt。我正在建设一个类似的项目,涉及外部图书馆。有必要同时学习CMake和make吗。还是说CMake就足够了?

    • 因此,我已经阅读了大约半年的关于x86处理器内部发生的事情。所以我决定尝试一下x86程序集的乐趣,只从80386指令开始,以保持它的简单性。(我主要是在学习,而不是优化) 几个月前我做了一个用C语言编写的游戏,所以我去那里用汇编代码从头重写了位图blitting函数。我不明白的是,循环的主要像素绘制主体使用C代码(18条指令)比我的汇编代码(只有7条指令,我几乎100%确定它不会跨越缓存行边界)更