在此函数的第一个迭代中,我们可以执行recur:
并执行以下行:sw $ra, 0($sp)
,这是在任何jal
语句之前完成的。据我了解,jal
(跳转和链接)语句将输入到$ra
寄存器中,即直接位于jal
之后的位置。那么,如果$ra
中还没有存储任何内容,示例中会发生什么呢?
这是一个功能;在条目$ra
上保留呼叫者希望您跳回的回信地址。
寄存器不能保存“ nothing”,它始终是32位值。
[如果某些代码将$ra
设置为0或某个无效的地址,并使用j
而不是jal
跳转到此函数,则返回时它将崩溃,这将是调用者的错误。您的函数可以简单地假设$ra
在函数入口上拥有有效的返回地址,无论是来自递归调用还是来自其他调用者。
(这是递归函数的要点,实际上您只是在对该函数进行函数调用,而从哪里调用都没有关系。)