2013-10-09 69 views
1

编程语言和寄存器变量之间的一个主要区别是寄存器数量有限,在当前计算机上通常为32个,如MIPS。当变量超过32个时,寄存器会发生什么变化?

这是我在学习MIPS语言时阅读的内容。假设有一个程序有超过32个变量,每个变量存储在一个寄存器中。当没有空的寄存器时,剩下的变量会发生什么?

+2

假定在这种情况下,所有变量都不是**存储在寄存器中。所以至少有一些存储在内存中。 – nrz

+0

没有“MIPS语言”这样的东西。任何编译器生成代码以在MIPS处理器上运行,通过在堆栈帧中存储多余的变量来处理此问题。 –

+1

我怀疑@nrz的意思是“不是所有变量都是”而不是“所有变量都不是”。问题在于,在任何时候,只能在寄存器中保存有限数量的变量,其余的将驻留在内存中,直到需要为止(根据我所知,没有需要33个操作数的指令)。 – Michael

回答

2

并非所有MIPS 32个寄存器被用于存储变量,一些具有特殊的用途等$k0$k1$gp$sp,因此用于存储变量可用寄存器是以下。

通常变量不是通过创建喜欢这里的函数栈帧存储在寄存器,它们存储在内存中:

当你想更新变量或使用它在很大程度上就像在柜台
# make space of 30 vars, 4 bytes each 
addi $sp, $sp, -4 * 30 

# $t0 = 1 
addi $t0, $0, 1 

# store vars into the stack 
sw  $t0, 0($sp) # 1 
addi $t0, $t0, 1 # $t0++ 
sw  $t0, 4($sp) # 2 
addi $t0, $t0, 1 # $t0++ 
sw  $t0, 8($sp) # 3 
addi $t0, $t0, 1 # $t0++ 
sw  $t0, 12($sp) # 4 
#... 

# now to access the 4th var, 12($sp), into $t1 
lw  $t1, 12($sp) 

# do stuff 

# deallocate the space and destroy those vars when you done 
addi $sp, $sp, 4 * 30 

,你从内存加载它到一个寄存器,做你想做的事情,然后更新内存存储变量。

+0

谢谢你的答案。这是我在其他章节中在同一本书中找到的答案。 “许多程序比计算机有更多的变量寄存器,因此,编译器试图保留寄存器中最常用的变量,并且其余的寄存器放在内存中,使用加载和存储来在寄存器和内存之间移动变量。不常用的变量(或稍后需要的那些变量)被称为溢出寄存器。“ – str4thm0r3

相关问题