LEA是x86中唯一一条内存操作数不能访问内存的指令吗?

Qua*_*key 6 x86 assembly

我正在使用libdis,来自这个混蛋的x86反汇编程序库,我正试图找出哪些指令访问内存.

参考这两条说明:

mov eax, [ebx + 10]
lea eax, [ebx + 10]
Run Code Online (Sandbox Code Playgroud)

libdis,两者都列出了指令类型insn_mov,并且地址操作数在两种情况下都具有相同的标志.因此,我可以判断是否访问内存的唯一方法是查看指令助记符.

因此我的问题是:LEA是使用内存操作数的唯一指令,它实际上并不访问内存吗?引用的任何链接都很好.

Soa*_*Box 10

prefetch指令的家庭(prefetcht1,prefetcht2,prefetcht3,prefetchnta)要求处理器去和那些记忆线拉入缓存,因为他们将很快需要.但是,英特尔的文档清楚地表明,传递给预取的错误地址不会导致任何错误.这样软件可以将可能超出范围的地址传递给预取而不先检查它们,这样数据就可以在执行这些检查时进行.

与之不同,预取也没有"输出" LEA.


Ira*_*ter 7

英特尔有一套"NOP"指令,用于记忆操作数.

我不认为他们触摸记忆; 实际上,我不确定他们是否真的形成了一个地址并通过内存映射运行它并检查保护.我不这么认为; 我构建了一个编译器,它可以生成各种各样的寻址模式,作为不同大小的空间填充NOP,并且永远不会陷入陷阱.

  • @peter ferrie:这只是意味着 CPU 有关于在执行之前获取整个指令的规则,这是一个正交主题。问题是,如果 NOP 试图获取由 mod/rm 字节形成的地址。除了刚才举的例子,你还有具体的证据吗? (3认同)
  • 看来他们确实访问了memoty [根据Peter Ferrie](http://pferrie.host22.com/misc/lowlevel2.htm):"有趣的是,尽管名称如此,但如果Mod/RM字节告诉它,它会访问内存所以这个"No OPeration"会导致页面错误.毕竟不是NOP." (2认同)