2013-07-02 33 views
1

有什么办法(在ASM/C/C++中)能够查询缓存中内存地址的内容,甚至可以获取寄存器中的当前值?获取寄存器/缓存中的当前值?

这是否会像海森堡原理一样有效?试图从寄存器检索值的代码可能导致寄存器被卸载?

+0

您对此感兴趣的任何特定CPU? –

+1

海森堡原理绝对适用于缓存以及“printf()”和家族使用的任何寄存器。但除此之外,你可以尝试打一个调试器并打破程序。 – Mysticial

+0

@CaptainObvlious我没有考虑到特定的CPU。相对现代。 Nehalem处理器+? – user997112

回答

2

大多数处理器没有“从高速缓存中读取值”的标准指令。人们可以推测现代处理器能够为测试目的而读取/写入缓存内容,但是如果存在这样的指令,它们就不会被公开描述,并且在使用它们时可能需要小心以避免干扰实际的代码执行。读取任何内存都可能会影响您想要检查的缓存行中的内容。

寄存器值需要相当小心地注意如何编写代码,并且通常几乎不可能在不影响SOMETHING的情况下存储所有寄存器值,尽管通过使用“push”类型指令可以在大多数处理器中获得非常接近的值将值存储在堆栈上。一旦这些值被“保存”,就可以使用正则存储器读取指令来获取这些值,并且由于这些值已经被存储,所以可以使用(几乎)任何寄存器来存储其余的代码。

编辑:由于现在指定了处理器类型: 在32位模式下的x86处理器上,可以使用PUSHA将所有寄存器压入堆栈(包括列表中间的ESP的原始值)。但是,对于x86-64,您必须为每个寄存器使用单独的PUSH指令。但这样做仍然是可行的。

我不熟悉英特尔的任何指令来检查缓存内容。