我正在使用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.
英特尔有一套"NOP"指令,用于记忆操作数.
我不认为他们触摸记忆; 实际上,我不确定他们是否真的形成了一个地址并通过内存映射运行它并检查保护.我不这么认为; 我构建了一个编译器,它可以生成各种各样的寻址模式,作为不同大小的空间填充NOP,并且永远不会陷入陷阱.