Почему указатель стека и указатель фрейма имеют один и тот же адрес?

У меня сложилось впечатление, что указатель фрейма $fp установлен на первое слово стека в соответствии с компьютерной организацией и дизайном MIPS, 5-е изд., стр. 103.

      int func(int g) {
    int f = 9;
    return g+f;
}

mips gcc 12.2.0 сгенерировал ассемблерный код.

      func:
        addiu   $sp,$sp,-24
        sw      $fp,20($sp)
        move    $fp,$sp
        sw      $4,24($fp)
        li      $2,9                        # 0x9
        sw      $2,8($fp)
        lw      $3,24($fp)
        lw      $2,8($fp)
        nop
        addu    $2,$3,$2
        move    $sp,$fp
        lw      $fp,20($sp)
        addiu   $sp,$sp,24
        jr      $31
        nop

Действительно ли $fp (указатель кадра) и $sp (указатель стека) содержат один и тот же адрес? Я бы подумал, что $fp будет указывать на первое слово в стеке, т.е.

      func:
        addiu   $sp,$sp,-24
        sw      $fp,20($sp)
        addiu   $fp,$sp,20          #let $fp point to the first word on the stack

Существуют ли какие-либо правила, на которые должна указывать часть стека $fp, или все зависит от разрешения разработчика/компилятора программного обеспечения?

0 ответов

Другие вопросы по тегам