📜  门| GATE CS 2010 |第37章

📅  最后修改于: 2021-06-28 23:23:02             🧑  作者: Mango

下面的程序使用六个临时变量a,b,c,d,e,f。

a = 1
    b = 10
    c = 20
    d = a+b
    e = c+d
    f = c+e
    b = c+e
    e = b+f
    d = 5+e
    return d+f

假设所有操作都从寄存器中获取操作数,那么执行该程序而不溢出所需的最少寄存器数量是多少?
(A) 2
(B) 3
(C) 4
(D) 6答案: (B)
说明:所有给定的表达式最多使用3个变量,因此我们永远不要超过3个寄存器。

请参阅http://en.wikipedia.org/wiki/Register_allocation

它至少需要3个寄存器。

寄存器分配的原则:如果需要将变量分配给寄存器,则系统检查是否有可用的空闲寄存器,如果找到了可用寄存器,则进行分配。如果没有可用的寄存器,则它将检查包含无效变量(将来将不使用其值的变量)的寄存器,如果找到,则进行分配。否则,它会溢出(它会在最长的时间后检查需要其值的寄存器,将其值保存到内存中,然后使用该寄存器进行当前分配,然后在需要该寄存器的旧值时,系统获取从保存它的内存中将其分配到任何可用的寄存器中)。

但是在这里,我们不应该按照问题的指示进行溢出。

让我们为变量分配寄存器。

a = 1 (假设寄存器R1已分配给变量’a’)

b = 10 (R2为’b’,因为将来将使用’a’的值,因此不能用R1中的’b’代替’a’的变量)

c = 20 (R3代表’c’,因为将来将使用’a’和’b’的值,因此不能分别用R1或R2中的’c’代替变量’a’或’b’ )

d = a + b (现在,可以将’d’分配给R1,因为R1包含死变量’a’,之所以这样称呼是因为将来将不使用它,即,没有后续表达式使用的值变量“ a”)

e = c + d (“ e”可以分配给R1,因为当前R1包含变量’d’的值,该值将不会在后续表达式中使用。)

注意:已经计算出的变量值仅由READ操作使用(而不是WRITE),因此,我们仅需在后续表达式的RHS端查看是否要使用该变量。

f = c + e (’f’可以分配给R2,因为寄存器R2中’b’的值不会在后续表达式中使用,因此R2可用于为’f’分配’b’)

b = c + e (’b’可以分配给R3,因为稍后不再使用R3中的’c’值)

e = b + f (这里’e’已经在R1中,所以这里没有分配,直接分配)

d = 5 + e (’d’可以分配给R1或R3,因为两者中的值都不再使用,让我们在R1中进行分配)

返回d + f (此处没有分配,仅添加并返回了寄存器R1和R2的内容)

因此我们只需要3个寄存器R1 R2和R3。

这个问题的测验