首页 > 解决方案 > CPU寄存器的内容多久改变一次?

问题描述

CPU寄存器保存的数据是否经常变化?维基百科的文章将寄存器描述为“一个快速访问的位置......少量快速存储”。我假设内存很快,因为经常访问和修改寄存器?

标签: cpuhardwarecpu-registerslow-level

解决方案


是的,数据寄存器可能会在随后的指令中经常发生变化。超标量、乱序执行、流水线、寄存器重命名等使分析变得复杂,但即使在简单的有序 CPU 上,寄存器也可以每条指令频繁更改一次。一个看似合理的程序可能会运行许多指令,所有指令都影响同一个寄存器:

// Type your code here, or load an example.
int polynom(int num) {
    return num * num + 2 * num + 1;
}

编译为:

polynom(int):
        push    rbp
        mov     rbp, rsp
        mov     DWORD PTR [rbp-4], edi
      * mov     eax, DWORD PTR [rbp-4]
      * imul    eax, eax
      * mov     edx, DWORD PTR [rbp-4]
        add     edx, edx
      * add     eax, edx
      * add     eax, 1
        pop     rbp
        ret

eax注意对寄存器的多次写入,用星号表示。在这个小函数中,五个几乎连续的指令写入该特定寄存器,这意味着如果要在紧密循环中调用此代码,我们可以预期程序可见状态eax1会以超过 1 GHz 的速率变化。

更基本的一点是,有些架构寄存器几乎总是在每条指令上发生变化。其中最明显的是程序计数器(EIP在 x86 和RIPx86_64 上的许多上下文中称为 PC)。因为这个寄存器指向当前正在执行的指令,所以它肯定会随着每条指令而改变,除非像 x86 REP 编码这样的反例或简单地跳转到自身的指令。

1同样,除了寄存器重命名等架构考虑因素外,它使用多个物理寄存器来实现单个逻辑、程序可见的寄存器。


推荐阅读