Исторически сложилось так, что стек «растет» от верхних адресов к нижним. Это соглашение означает, что вы проталкиваете значения в стек, отнимая значение от указателя стека.
Добавление значения к указателю стека сокращает стек, выталкивая тем самым значения из стека.
В предыдущем примере мы использовали временные регистры, при этом пред. іагая, что их прежние значения должны быть сохранены и восстановлены. Чтобы к «жать сохранения и восстановления регистра, чье значение никогда не используется. что может иметь место в случае с временным регистром, программное обеспечение MIPS делит 18 из имеющихся регистров на две группы:
• St0-$t9: десять временных регистров, которые не сохраняются вызываемой программой при вызове процедуры
• SsO- $s7: восемь сохраняемых регистров, которые должны быть сохранены при вызове процедуры
Это простое соглашение сокращает сброс регистров. Поскольку в показанном примере вызывающая программа не предполагает, что регистры StO и Stl V будут сохранены в процессе вызова процедуры, из кода можно выбросить два соотношения и две загрузки. Но мы по-прежнему должны сохранить и восстановить регистр JsO, поскольку вызываемая программа должна предположить, что вызывающая программа нуждается в его значении.
Процедуры, не вызывающие других процедур, называются конечны.чи. Если бы все процедуры были конечными, то жизнь стала бы проще, но, к сожалению, это не так. Точно так же как шпион для выполнения части своей миссии может нанять других шпионов, которые в свою очередь могут воспользоваться услугами еще большего количества шпионов, процедуры вызывают другие процедуры. Более того, рекурсивные процедуры даже вызывают «клонов», то есть самих себя. Поскольку мы должны быть внимательными при использовании регистров в процедурах, еще больше внимания нужно уделять вызовам неконечных процедур.
Предположим, к примеру, что основная программа вызывает процедуру А с аргументом 3, помещая значение 3 в регистр SaO, а затем используя инструкцию jal А. Затем предположим, что процедура А вызывает процедуру В, используя инструкцию jal Вс аргументом 7, также помещаемым в регистр SaO. Поскольку процедура А еще не завершила свою задачу, использование регистра $а0 вызывает конфликтную ситуацию. Точно так же возникает конфликт и с адресом возврата в регистре Sra. поскольку теперь в нем находится адрес возврата для процедуры В. Если мы что- нибудь не предпримем для предупреждения этой проблемы, возникший конфликт не позволит процедуре А вернуть управление вызывавшей ее программе
Одним из решений будет проталкивание всех остальных регистров, которые должны быть сохранены, в стек, точно гак же, как мы это делали с сохраняемыми регистрами. Вызывающая программа проталкивает в стек все регистры аргументов или временные регистры -tt9), которые понадобятся ей после вызова. Вызываемая процедура проталкивает в стек регистр адреса возврата $га и все сохраняемые регистры, используемые ею. Указатель стека настраивается в соответствии с числом регистров, помещаемых в стек. По возвращении регистры восстанавливаются из памяти и указатель стека соответствующим образом корректируется.
В языке С имеется два класса памяти: автоматический и статический. Автоматические переменные являются локальными по отношению к процедуре и аннулируются после выхода из процедуры. Статические переменные существуют независимо от входов в процедуры и выходов из них. Переменные в языке С, объявленные за пределами всех процедур, считаются статическими, так же как и все переменные, объявленные с использованием ключевого слова static. Все остальные переменные считаются автоматическими. Чтобы упростить доступ к статическим данным, программное обеспечение MIPS выделило другой регистр, названный глобальным указателем, или
Ранее представлены сведения о том, что сохраняется в процессе вызова процедуры. Учтите, что ряд схем сохраняет сам стек, гарантируя, что вызывающая программа получит те же самые данные обратно путем загрузки их из стека, поскольку они в нем сохранены. Стек выше Ssp сохраняется просто тем, что принимаются меры, не позволяющие вызываемой программе вести запись выше адреса, хранящегося в Ssp; а значение самого Ssp сохраняется вызываемой программой путем добавления к нему точно такого же значения, которое было из него вычтено; а все остальные регистры сохраняются за счет сохранения их в стеке и восстановления их оттуда.
Опубликовал katy
June 26 2015 07:08:56 ·
0 Комментариев ·
2737 Прочтений ·
• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •
Комментарии
Нет комментариев.
Добавить комментарий
Рейтинги
Рейтинг доступен только для пользователей.
Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.
Нет данных для оценки.
Гость
Вы не зарегистрированны? Нажмите здесь для регистрации.