【发布时间】:2016-12-10 02:50:36
【问题描述】:
以下是我在学校被教导在 MIPS 中调用函数的方式。我只是被告知要“记住”“序言”和“尾声”,但从未解释过它的概念。这里是:
首先,初始化堆栈指针$sp。然后拨打jal f:
li $sp, 0x7ffffffc
jal f # call function f
在函数内部,先做“序言”:
sub $sp, $sp, 8 # set new stack pointer
sw $ra, 8($sp) # save return address in stack
sw $fp, 4($sp) # save old frame pointer in stack
add $fp, $sp, 8 # set new frame pointer
返回时,做“结语”:
lw $ra, 8($sp) # load return address from stack
lw $fp, 4($sp) # restore old frame pointer from stack
add $sp, $sp, 8 # reset stack pointer
jr $ra # return to caller using saved return address
问题:
$ra 中存储的值从未改变(除非我的函数使用它,但我不应该首先使用$ra)。序言只是将它保存在堆栈中,并在返回时将 same 值恢复为$ra。 jr 作用于同一件事,那么为什么首先需要将$ra 存储在堆栈中呢?如果它从未改变,为什么我需要恢复它?
将$fp 存储在堆栈中是有意义的,因为$fp 已更改。但是$ra 只是相同的返回地址。处理器是否正在查看堆栈以将 $ra 中的值与堆栈上的值匹配?
【问题讨论】: