我正在使用 libdis
,来自the bastard的x86反汇编程序库,我正试图找出哪些指令访问内存 .
参考这两条说明:
mov eax, [ebx + 10]
lea eax, [ebx + 10]
在 libdis
中,两者都以指令类型 insn_mov
列出,并且地址操作数在两种情况下都具有相同的标志 . 因此,我可以判断是否访问内存的唯一方法是查看指令助记符 .
因此我的问题是:LEA是使用内存操作数的唯一指令,它实际上并不访问内存吗?引用的任何链接都很好 .
我正在使用 libdis
,来自the bastard的x86反汇编程序库,我正试图找出哪些指令访问内存 .
参考这两条说明:
mov eax, [ebx + 10]
lea eax, [ebx + 10]
在 libdis
中,两者都以指令类型 insn_mov
列出,并且地址操作数在两种情况下都具有相同的标志 . 因此,我可以判断是否访问内存的唯一方法是查看指令助记符 .
因此我的问题是:LEA是使用内存操作数的唯一指令,它实际上并不访问内存吗?引用的任何链接都很好 .
2 回答
prefetch
指令系列(prefetcht1,prefetcht2,prefetcht3,prefetchnta)要求处理器将这些内存行拉入缓存中,因为它们很快就会被需要 . 但是,英特尔的文档清楚地表明,传递给预取的错误地址不会导致任何错误 . 这样软件可以将可能超出范围的地址传递给预取而不先检查它们,这样数据就可以在执行这些检查时进行 .与
LEA
不同,Prefetches也不会输出''t have an '' .英特尔有一套“NOP”指令,用于记忆操作数 .
我不认为他们触摸记忆;实际上,我不确定他们是否真的形成了一个地址并通过内存映射运行它并检查保护 . 我不这么认为;我构建了一个编译器,它可以生成各种各样的寻址模式,作为不同大小的空间填充NOP,并且永远不会陷入陷阱 .