【问题标题】:What is the difference between Registers and Temporary Registers?登记册和临时登记册有什么区别?
【发布时间】:2010-12-10 05:18:26
【问题描述】:

Valgrind 使用中间代码表示来让我们检测二进制代码,这样我们就不必处​​理编程语言级别的结构。在将二进制代码转换为 Valgrind 的中间表示 (IR) 代码的过程中,它显示了寄存器用于加法等操作。其中有 1024 个正在使用。我没有得到另一种类型的寄存器,称为临时寄存器,表示为tX,其中 X 是某个数字。因此,我可以看到:

t28 = Add32(t26,0xFFFFFFFC:I32)
t4 = LDle:I32(t28)

t 表示临时寄存器。据我所见,它们的行为似乎与常规寄存器非常相似,但无法弄清楚它们有何不同。谁能告诉我什么是临时寄存器以及它与常规寄存器有何不同?

【问题讨论】:

  • 我可能在这里遗漏了一些明显的东西,但在那个例子中我既没有看到 R 也没有看到 T...?
  • @Laurence:解决了我的问题。感谢您指出。

标签: c architecture valgrind computer-architecture


【解决方案1】:

在编译器构造课程中,我被告知中间代码中的寄存器是虚拟寄存器。它们不一定与目标平台的可执行文件有任何关系。它们可以是真正的 CPU 寄存器,也可以是内存中的临时寄存器。这完全取决于代码生成器和优化器。代码生成器决定了应该在哪里分配临时对象。

生成 IR 的一个重要原因是最大限度地提高编译器的可移植性。您可以为所有平台使用一个编译器前端,然后将 IR 传递给特定于平台的代码生成器。 GCC 就是这样工作的,我敢肯定,如果不是全部的话,大多数体面的编译器都是这样工作的。

另一个好处是您可以在将 IR 代码发送到代码生成器之前对其执行某些优化。一些优化不是特定于平台的:例如,不受循环影响的代码可以被拉出循环。平台优化器通常在较低级别上进行优化,例如寄存器分配、分支等,这些东西实际上取决于 CPU 的属性。

【讨论】:

  • 太棒了。谢谢你的详细解释。
猜你喜欢
  • 2018-07-15
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 2023-03-18
  • 1970-01-01
  • 2016-06-12
相关资源
最近更新 更多