Пояснение указателя кадра

28

В сборке MIPS есть регистр для указателя стека и другой регистр для указателя кадра. Что такое указатель кадра и какова его цель? Чем он отличается от указателя стека?

qwaserdftyghuijkiii
источник
1
Какие исследования вы уже провели - и как вы знакомы с условиями? Для какой системы это (разные системы имеют разную терминологию)?
Я просто хочу ознакомиться с указателем кадра (сборка MIPS). Я не понимаю, как это помогает, зачем нам это нужно? Большое спасибо
qwaserdftyghuijkiii

Ответы:

44

В сборке MIPS указатель стека указывает на вершину стека. Когда вы выделяете пространство в стеке, указатель стека ($ sp) перемещается, чтобы указывать на свободную память.

При вызове подпрограммы в сборке MIPS (в те дни регистры были дороже - параметры на основе регистров были нестандартными), каждый записывает параметры в стек, а затем перемещает указатель стека.

Когда метод запускается, параметр может иметь смещение 16($sp). Однако, поскольку переменные помещаются в стек, указатель стека перемещается, и теперь вместо этого может быть расположен тот же параметр24($sp) . Это может сделать код немного запутанным.

Указатель кадра ($ fp) указывает на начало кадра стека и не перемещается во время вызова подпрограммы. Это указывает на основание стекового фрейма, а параметры, которые передаются подпрограмме, остаются в постоянном месте относительно указателя фрейма.

Поймите, что указатель кадра должен быть сохранен и восстановлен с помощью подпрограммных вызовов, которые его модифицируют.

Дальнейшее чтение:


источник
Я не знаю, что имеется в виду под «регистрами, которые в те дни были дороже - параметры, основанные на регистрах, где нетрадиционные», но параметры также могут быть помещены в стек, когда число регистров ограничено. Например, если у вас 35 параметров (я полагаю, в MIPS 32 регистра), вам нужно будет поместить последние 3 параметра в стек. Более конкретно, для реализации, FP будет находиться по адресу в памяти, где находится адрес возврата.
Джонатан
1
@Jonathan MIPS Из этих 32 регистров $ 0 равнялся 0. $ at был зарезервирован, $ v0 и $ v1 были для возвращаемых значений вызовов функций, $ a0 - $ a3 были параметрами функции, $ t0 - $ t9 были временными (сохраняющие функции) $ s0 - $ s7 были сохранены, а $ gp, $ sp, $ fp и $ ra использовались самой системой. В целом, было только 24 регистра общего назначения и некоторые из них, если вы захотите их использовать. Обычно вы используете только регистры $ t (10). Сравните это с Itanium, который имеет 128 регистров. Вызывая функцию в MIPS с 35 параметрами, вы, скорее всего, поместите их все в стек.
@Jonathan Я также укажу на этот комментарий : «AMD Bulldozer: 96 физических GPR, Intel Sandy Bridge: 160 физических GPR, Intel Haswell: 168 физических GPR». Вещи становятся смешными с несколькими основными машинами. SPARC имел 160 регистров . Я также рекомендую вам зарегистрировать окно, которое вошло в философию дизайна MIPS, имея вдвое меньше регистров, чем его современники.
Итак, это то же самое, что и обычное использование регистра %ebp'base pointer' в соглашении о вызовах x86? (Я новичок во всем этом, но это звучит так же, как использование sth like MOV 8(%ebp), %eaxили что-то подобное?)
ELLIOTTCABLE
В строке Realize that the frame pointer will need to be stored and restored with subroutine calls that modify it.не совсем понятно, что это значит
заданье