Assembly MIPS编程作业-根据说明更新位置

Assembly MIPS编程作业-根据说明更新位置,assembly,mips,Assembly,Mips,对于我的汇编语言课程,我被要求填写图1中的汇编代码表MIPS汇编代码,如图2所示 在这段代码中,我的讲师试图实现一个递归函数调用,以完成数字的阶乘。使用图2中的参数,我已经填写了以下内容 参数和我的进度 我知道初始堆栈指针从位置100开始,然后在函数continue的第一条指令中每减少12。帧指针在位置96处更新为112,返回地址将在位置92处更新,n将在位置88处更新为2。这将重复进行,直到n达到1 不过,我对一些事情感到困惑。我的第一个问题是关于回信地址。在将更新回信地址的位置(92、8

对于我的汇编语言课程,我被要求填写图1中的汇编代码表MIPS汇编代码,如图2所示

在这段代码中,我的讲师试图实现一个递归函数调用,以完成数字的阶乘。使用图2中的参数,我已经填写了以下内容

参数和我的进度

我知道初始堆栈指针从位置100开始,然后在函数continue的第一条指令中每减少12。帧指针在位置96处更新为112,返回地址将在位置92处更新,n将在位置88处更新为2。这将重复进行,直到n达到1

不过,我对一些事情感到困惑。我的第一个问题是关于回信地址。在将更新回信地址的位置(92、80和68),回信地址是每次5000还是自动更新为其他地址?我对返回地址的更新方式感到困惑,因为它没有像循环每次迭代时的帧指针那样显式更新

我的第二个问题是关于代码行后面的下一条指令:

jal fact # recursive call to fact(n-1) 
完成此操作后,将列出以下说明

lw $4, 0 ($29) # restore n 
这会发生在60号位置吗?然后

mult $2, $4 # fact (n-1) * n
这会发生在56号位置吗

我的最后一个问题是恢复每个登记册。在代码行中:

lw $4, 0 ($29) # restore n
lw $31, 4 ($29) # restore return address
lw $30, 8 ($29) # restore frame pointer 
n、返回地址和帧指针的值具体恢复到哪里?它们会分别加载到其原始值88、92和96上吗


这是我第一次使用汇编语言,如果我说的话没有意义或没有进行适当的研究,我会道歉。我的导师没有给我提供任何类似的例子,所以这是我在做一些研究后发现的。

你知道
jal
lw
sw
是如何工作的吗?如果没有,您需要阅读他们的参考资料。如果是,请按照说明进行操作。现在还不清楚“发生在某地”应该是什么意思。一个重要的提示:我们不喜欢以图片形式发布代码的问题,也不喜欢每篇文章都有多个问题。修好它。有了参考手册、一张纸、一支铅笔和一块橡皮,你应该能够做到这一点:)如果“呼叫”是从地址xyz完成的,那么返回地址是xyz+字号。。。总是。不管递归有多深。但是递归函数的最顶层是从外部调用的,因此一个返回地址将完全不同。内部返回地址将属于内部调用(如果它有多个,如果只做一个内部递归调用,那么返回地址将是相同的)。也考虑使用MIPS模拟器之一,如SPIM/MARS,在这里您可以单步执行每个指令并在每一步之后观察寄存器和存储器如何变化。与描述特定说明的参考指南相比,它可能会让您比其他任何东西更快地步入正轨(如询问)。现在我看到您的图片,该堆栈已被合理填充,但返回地址仅为
5000
第一次,其他时间
jal fact
$31
设置为指向
lw$4,0($29)
(在
jal
之后的下一条指令。事实上,我认为在真正的MIPS上,它甚至会晚一条指令,因为
lw
会在跳转到
fact
之前执行,但判断代码是如何编写的,延迟跳转并不考虑在您的课程中(我不是MIPS程序员,因此我可能错误地理解了该部分,可能它不适用于
jal
…在SPIM/MARS中,我认为它默认关闭)。