我的第一个问题是

  • 调整堆栈空间时,为什么选择数字8?我假设这意味着8个字节,但是如何确定需要调整8个字节呢?我知道我们应该为所有参数(在本例中为一个参数)分配足够的空间,而且我还在猜测返回地址,但是我们如何知道每个参数需要多少字节呢?
  • 我试图通读代码以了解发生了什么,但是我对
  • 感到困惑

    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
    在那里,第二个指针再次被删除,
    并且第一个将在之前停止的地方继续。
    ...
    关于递归的“魔术”是,第二个指针可以产生第三个指针
    等他等等

    10-07 19:17
    查看更多