我的第一个问题是
beq $ t0,$零,L1。
我从这里知道分支到L1,n递减1,但是我很困惑。是否
事实
是说我们立即返回顶部说事实的地方,但是这次参数是n = 1而不是n = 2? [假设n = 2是我们的原始参数]在什么时候到达代码中说$ a0和$ v0相乘的代码?
老实说,我很难把所有的事情都包起来。如果我了解这一点,每次调用阶乘函数时,都会向堆栈中添加一个新的“堆栈帧” ...每个帧将8个字节分配给堆栈?每个新框架都包含一个返回地址,以返回到调用它的过程。如果我正确理解了这一点,则很难在代码中看到它。
最佳答案
答案1在您的代码注释中:
这个“8”取决于您的代码,它是图片中的“n”。
8字节,因为您需要放置两个值。每个整数值都有4个字节...
这些值是一个参数和返回地址。
(调用方和被调用函数有两个单独的返回地址,
但在寄存器中只能存放一个。
因此,调用方将其地址临时保存在堆栈中)
关于beq
:
正确。如果$t0
和$zero
相等(即$t0
的值为0),则跳转到L1
。
关于jal
...
好吧,用一两个词来表示:这是一个函数调用,没有跳转。
如果没有函数调用或跳转,则会在每次指导时自上而下地处理代码。
想象一下,您的计算机上有东西指向您现在所在的位置。
因此,如果要处理jal,则指向jal指令。
那里发生了什么:
您将获得另一个指令指针,它指向事实的第一条指令,
而第一个仍然是jal
。
然后,第二个指针将在该函数的顶部向下移动,
而第一个仍然保持原状。
直到第二个指针到达终点为止:jr
。
在那里,第二个指针再次被删除,
并且第一个将在之前停止的地方继续。
...
关于递归的“魔术”是,第二个指针可以产生第三个指针
等他等等