我的第一个问题是
调整堆栈空间时,为什么选择数字8?我假设它意味着8个字节,但是如何确定需要调整8个字节?我知道我们应该为所有参数分配足够的空间(在这种情况下,一个参数),我也猜测返回地址,但我们怎么知道每个需要多少字节?
我正在尝试阅读代码以了解会发生什么,但我对此感到困惑
beq $ t0,$ zero,L1。
我从这里知道我们分支到它所说的L1,其中n减1,但后来我很困惑。
jal fact
意味着我们立即回到顶部所说的事实,但这次参数是n = 1而不是n = 2? [假设n = 2是我们最初的论点]在什么时候我们到达代码所说的乘以$ a0和$ v0?
老实说,我真的很难把所有这些包裹起来。如果我理解了它,每次调用阶乘函数时,都会在堆栈中添加一个新的“堆栈帧”...每个帧将8个字节分配到堆栈中?并且每个新框架都包含一个返回地址,以返回调用它的过程。如果我理解正确,我很难在代码中看到它。
答案 0 :(得分:1)
答案1在您的代码评论中:
这个“8”取决于你的代码,它是图片中的“n”。
8个字节,因为您需要放置两个值。每个整数值有4个字节...
值是一个参数和返回地址
(调用者和被调用函数有两个单独的返回地址,
但是在寄存器中只有一个地方
所以调用者暂时将他的地址保存在堆栈中
关于beq
:
正确。如果$t0
和$zero
相等(即。$t0
的值为0),则跳转到L1
。
关于jal
...
好吧,用一两句话说:这是一个函数调用,没有跳转。
如果您没有函数调用或跳转,则会自上而下处理您的代码,每个指令
想象一下,你在计算机上有东西指向你现在就是这样
因此,如果要处理jal,则指向jal指令
那里发生了什么:
你得到另一个指向事实的第一条指令的指令,
第一个仍然在jal
然后,第二个指针将自上而下的功能,
而第一个仍然保持原样
直到第二个指针到达他的结尾:jr
在那里,第二个指针再次被移除,
并且第一个将在之前停止的地方继续
...
关于递归的“魔力”是,第二个指针可以产生第三个
并等待他等等......