MIPS:为什么我们需要堆栈?

时间:2018-05-23 10:24:06

标签: assembly stack mips

MIPS中堆栈的目的是什么?我们为什么需要它?有人可以提供一个与之相关的示例代码吗?

1 个答案:

答案 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])。