2010-12-10 132 views
1

Valgrind使用中间代码表示让我们测试二进制代码,以便我们不必处理编程语言级别的构造。在将二进制代码转换为Valgrind的中间表示(IR)代码的过程中,它显示了使用寄存器执行添加等操作。其中有1024个正在使用。我没有得到的是另一种称为临时寄存器的寄存器,其表示为tX,其中X是某个数字。因此,我可以看到:寄存器和临时寄存器有什么区别?

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

t表示临时注册表。据我所知,他们似乎与常规寄存器非常相似,但无法弄清楚它们的不同之处。有人能告诉我什么是临时登记册,以及它与常规登记簿有什么不同?

+1

我可能在这里丢失了一些明显的东西,但在这个例子中我既没有看到`R`也没有看到`T` ......? – 2010-12-10 05:21:17

+0

@Laurence:解决了我的问题。感谢您指出。 – Legend 2010-12-10 06:04:03

回答

2

在编译器构造类中,我被教导说中间代码中的寄存器是虚拟寄存器。它们不一定与目标平台的可执行文件有关。它们可能是真正的CPU寄存器,或者它们可能是内存中的临时对象。这一切都取决于代码生成器和优化器。代码生成器决定临时分配的位置。

生成IR的一个重要原因是最大化编译器的可移植性。您可以为所有平台使用一个编译器前端,然后将IR传递给特定于平台的代码生成器。 GCC以这种方式工作,我相信大多数(如果不是全部的话)体面编译器以这种方式工作。

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