【问题标题】:Can somebody please walk through this MIPS code with me?有人可以和我一起浏览这个 MIPS 代码吗?
【发布时间】:2014-03-05 20:10:10
【问题描述】:

我的第一个问题是

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

    李>
  2. 我正在尝试通读代码以了解发生了什么,但我感到困惑

beq $t0, $zero, L1。

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

日本事实

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

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

【问题讨论】:

  • 在这里放文字,而不是超大的图片怎么样?

标签: c assembly mips


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 你描述得真好,真的很有帮助。
猜你喜欢
  • 2023-03-06
  • 1970-01-01
  • 2016-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-29
相关资源
最近更新 更多