有人可以和我一起浏览这个MIPS代码吗?

时间:2014-02-08 09:25:00

标签: c assembly mips

enter image description here

enter image description here

我的第一个问题是

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

  2. 我正在尝试阅读代码以了解会发生什么,但我对此感到困惑

  3. beq $ t0,$ zero,L1。

    我从这里知道我们分支到它所说的L1,其中n减1,但后来我很困惑。

    jal fact

    意味着我们立即回到顶部所说的事实,但这次参数是n = 1而不是n = 2? [假设n = 2是我们最初的论点]在什么时候我们到达代码所说的乘以$ a0和$ v0?

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

1 个答案:

答案 0 :(得分:1)

enter image description here

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

8个字节,因为您需要放置两个值。每个整数值有4个字节...
值是一个参数和返回地址 (调用者和被调用函数有两个单独的返回地址,
但是在寄存器中只有一个地方 所以调用者暂时将他的地址保存在堆栈中

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

关于jal ...
好吧,用一两句话说:这是一个函数调用,没有跳转。

如果您没有函数调用或跳转,则会自上而下处理您的代码,每个指令 想象一下,你在计算机上有东西指向你现在就是这样 因此,如果要处理jal,则指向jal指令 那里发生了什么:
你得到另一个指向事实的第一条指令的指令,
第一个仍然在jal 然后,第二个指针将自上而下的功能,
而第一个仍然保持原样 直到第二个指针到达他的结尾:jr 在那里,第二个指针再次被移除,
并且第一个将在之前停止的地方继续 ...
关于递归的“魔力”是,第二个指针可以产生第三个 并等待他等等......