MIPS中堆栈的目的是什么?我们为什么需要它?有人可以提供一个与之相关的示例代码吗?
答案 0 :(得分:1)
考虑以下递归定义的C函数:
main
您正在呼叫public static void main(String[] args){
int day;
int month = 5;
int year = 2018;
String str;
Scanner s = new Scanner(System.in);
day = s.nextInt();
switch(day) {
case 1:
str = "Sunday";
break;
case 2:
str = "Monday";
break;
case 3:
str = "Tuesday";
break;
case 4:
str = "Wednesday";
break;
case 5:
str = "Thursday";
break;
case 6:
str = "Friday";
break;
case 7:
str = "Saturday";
break;
default:
throw new IllegalStateException("'day' cannot be " + day);
}
System.out.println(str);
}
。
将发生以下情况:
最初,返回地址位于寄存器int f(int n)
{
if(n<3)
{
return n+4;
}
else
{
return f(n-1)+f(n-2);
}
}
。
该函数使用函数参数f(20)
调用自身,并返回$ra
。到现在为止还挺好。有些寄存器现在包含f(19)
返回的值。
现在该函数使用参数f(19)
调用自身。
f(19)
返回的值已存储在某个寄存器中。 f(18)
正在写那里的值;在这种情况下,f(19)
会覆盖此寄存器,因为f(19)
和f(18)
是相同的功能。或者f(19)
在那里写了值......好f(18)
和f(20)
是相同的功能。
无论如何都会覆盖寄存器。
因此存储寄存器中返回的值将不起作用。如何存储在全局变量中?
f(20)
我们会遇到同样的问题:调用f(18)
会覆盖变量int intermediate;
int f(int n)
{
...
intermediate = f(n-1);
return f(n-2) + intermediate;
}
,因此我们无法继续添加...
...当我们想要从函数返回时,我们遇到了下一个问题:通过调用f(18)
我们覆盖了intermediate
...
使用局部变量只会解决问题:
f(19)
=&GT;我们应该在哪里存储变量$ra
?在固定的内存地址(=全局变量)或寄存器中?在这两种情况下,我们都有与上述相同的问题。
现在我们可以想到以下解决方案:
int f(int n)
{
int local;
...
}
因此local
将使用int intermediate[100];
int f(int n, int level)
{
...
intermediate[level] = f(n-1, level+1);
intermediate[level] += f(n-2, level+1);
...
}
,从f(20)
调用的函数使用intermediate[0]
,并且从该函数调用的函数使用f(20)
等等...
完全这是“堆叠”的概念!
但是您不必自己实现,但已预先定义寄存器intermediate[1]
指向您可以使用的内存(示例中为intermediate[2]
)。