cpu - CPU寄存器的内容多久改变一次?
问题描述
CPU寄存器保存的数据是否经常变化?维基百科的文章将寄存器描述为“一个快速访问的位置......少量快速存储”。我假设内存很快,因为经常访问和修改寄存器?
解决方案
是的,数据寄存器可能会在随后的指令中经常发生变化。超标量、乱序执行、流水线、寄存器重命名等使分析变得复杂,但即使在简单的有序 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
注意对寄存器的多次写入,用星号表示。在这个小函数中,五个几乎连续的指令写入该特定寄存器,这意味着如果要在紧密循环中调用此代码,我们可以预期程序可见状态eax
1会以超过 1 GHz 的速率变化。
更基本的一点是,有些架构寄存器几乎总是在每条指令上发生变化。其中最明显的是程序计数器(EIP
在 x86 和RIP
x86_64 上的许多上下文中称为 PC)。因为这个寄存器指向当前正在执行的指令,所以它肯定会随着每条指令而改变,除非像 x86 REP 编码这样的反例或简单地跳转到自身的指令。
1同样,除了寄存器重命名等架构考虑因素外,它使用多个物理寄存器来实现单个逻辑、程序可见的寄存器。
推荐阅读
- python - 如何修复 pytube 错误:“AttributeError: 'NoneType' 对象没有属性 'download'”
- python - python - 如何禁止登录WebDriverMangager for Python?
- javascript - 将JS拆分成多个源文件
- git - 比较 .pdf 文件时覆盖 Gits diff 行为
- excel - 创建 Azure 管道仪表板的最佳做法是什么。使用工作簿(KQL)或日志>查询(KQL)创建仪表板哪个更好?
- .net - 付款失败时出现空白屏幕
- java - 将许多双精度类型参数添加到 List java
- react-native - 从反应原生的另一个数据文件中提取数据时如何设置图像?
- next.js - 无法从 Strapi API 获取数据到 next.js 前端
- javascript - 如何通过键动态创建多个值的jquery obj?