В сборке MIPS есть регистр для указателя стека и другой регистр для указателя кадра. Что такое указатель кадра и какова его цель? Чем он отличается от указателя стека?
В сборке MIPS есть регистр для указателя стека и другой регистр для указателя кадра. Что такое указатель кадра и какова его цель? Чем он отличается от указателя стека?
Ответы:
В сборке MIPS указатель стека указывает на вершину стека. Когда вы выделяете пространство в стеке, указатель стека ($ sp) перемещается, чтобы указывать на свободную память.
При вызове подпрограммы в сборке MIPS (в те дни регистры были дороже - параметры на основе регистров были нестандартными), каждый записывает параметры в стек, а затем перемещает указатель стека.
Когда метод запускается, параметр может иметь смещение 16($sp)
. Однако, поскольку переменные помещаются в стек, указатель стека перемещается, и теперь вместо этого может быть расположен тот же параметр24($sp)
. Это может сделать код немного запутанным.
Указатель кадра ($ fp) указывает на начало кадра стека и не перемещается во время вызова подпрограммы. Это указывает на основание стекового фрейма, а параметры, которые передаются подпрограмме, остаются в постоянном месте относительно указателя фрейма.
Поймите, что указатель кадра должен быть сохранен и восстановлен с помощью подпрограммных вызовов, которые его модифицируют.
Дальнейшее чтение:
%ebp
'base pointer' в соглашении о вызовах x86? (Я новичок во всем этом, но это звучит так же, как использование sth like MOV 8(%ebp), %eax
или что-то подобное?)
Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.
не совсем понятно, что это значит