有人能跟我一起解读这段MIPS代码吗?

3

输入图像描述

输入图像描述

我的第一个问题是

  1. 在调整堆栈空间时,为什么选择了数字8?我想它意味着8个字节,但如何确定需要调整8个字节?我知道我们应该为所有参数(在这种情况下,一个参数)分配足够的空间,并且我猜还要为返回地址分配空间,但我们怎么知道每个参数需要多少字节?

  2. 我试图阅读代码以理解发生了什么,但我感到困惑

beq $t0, $zero, L1.

从这里我知道我们会跳转到L1,其中n减1,但然后我就困惑了。jal fact是什么意思?

意味着我们立即返回到顶部的fact位置,但这次参数是n = 1而不是n = 2吗?[假设n = 2是我们最初的参数]我们什么时候到达代码,指示将$a0和$v0相乘?

老实说,我非常难以理解所有这些。如果我理解正确,每次调用阶乘函数时,都会向堆栈添加一个新的“堆栈帧”...每个帧将8个字节分配到堆栈中?并且每个新帧都包含返回地址以返回到调用它的过程。如果我理解正确,我很难在代码中看到它。


2
把文字放在这里,而不是过大的图片中,怎么样? - deviantfan
1个回答

1

enter image description here

答案1在您的代码注释中:
这个“8”取决于您的代码,它是图片中的“n”。

需要8字节,因为您需要两个值的位置。每个整数值有4字节...
这些值是一个参数和返回地址。
(调用者和被调用函数有两个单独的返回地址,
但寄存器只有一个位置。
因此,调用者会暂时将自己的地址保存在堆栈上)

关于beq
正确。如果$t0$zero相等(即$t0的值为0),则跳转到L1

关于jal...
嗯,简单来说:这是一个函数调用,而不是跳转。

如果您的代码没有函数调用或跳转,那么它将自上而下处理每个指令。
想象一下,在计算机中有一个东西指向你现在所在的位置。
所以,如果要处理jal,则会指向jal指令。
那里发生了什么:
您获得到fact的第一条指令的另一个指针,
而第一个指针保持在jal处。
然后,第二个指针将自上而下地遍历该函数,
而第一个指针则保持在原地。
直到第二个指针到达其末尾:jr
在那里,第二个指针被再次移除,
第一个指针将继续之前停止的位置。
...
递归的“魔力”在于,第二个指针可以生成第三个指针,并等待他等等...

你描述得非常好,真的帮了我很多。 - FrostyStraw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接