【问题标题】:Obtaining current value in registers/cache?获取寄存器/缓存中的当前值?
【发布时间】:2013-07-02 23:23:37
【问题描述】:

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

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

【问题讨论】:

  • 您对任何特定的 CPU 感兴趣?
  • 海森堡原理绝对适用于缓存以及printf() 和家庭使用的任何寄存器。但除此之外,您可以尝试使用调试器并破坏程序。
  • @CaptainObvlious 我没有考虑特定的 CPU。比较现代。尼哈勒姆+?

标签: c++ caching assembly cpu cpu-registers


【解决方案1】:

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

寄存器值需要相当仔细地注意如何编写代码,并且通常几乎不可能在不影响某处的情况下存储所有寄存器值,尽管您可以在大多数处理器中通过使用“推送”类型指令来存储堆栈上的值。一旦“保存”了这些值,就可以使用常规内存读取指令来获取它们,并且由于这些值已经被存储起来,因此您可以(几乎)为其余代码使用任何寄存器。

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

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

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多