【问题标题】:The purpose of function call prologue value $ra in MIPSMIPS中函数调用序言值$ra的目的
【发布时间】: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 中的值与堆栈上的值匹配?

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    为什么首先需要将 $ra 存储在堆栈中?以及为什么 如果它从未改变,我需要恢复它吗?

    在您的特定情况下, $ra 永远不会改变。但是如果一个函数调用另一个函数会发生什么呢?在那种情况下,$ra 确实会改变。实际上,您的函数序言缺少保存 $sX 寄存器(基于 MIPS ABI)应该由被调用者保存。

    处理器是否在查看堆栈以匹配里面的值 $ra 堆栈上有一个吗?

    不,在 MIPS 中,处理器不了解“堆栈”是什么。堆栈是一个软件结构,硬件不关心它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 1970-01-01
      • 2016-01-27
      • 2016-08-27
      相关资源
      最近更新 更多