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


28

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


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.не совсем понятно, что это значит
заданье
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.