Стек вызовов

Поделись знанием:
Перейти к: навигация, поиск

Стек вызовов (применительно к процессорам — просто «стек») — хранит информацию для возврата управления из процедур в программу (или подпрограмму, при вложенных или рекурсивных вызовах) и/или для возврата в программу из обработчика прерывания. В том числе при переключении задач в многозадачной среде.

При вызове подпрограммы или возникновении прерывания в стек заносится адрес возврата — адрес в памяти следующей инструкции приостановленной программы. В этот момент управление передается подпрограмме-обработчику. При возникновении вложенного вызова внутри прерывания подпрограммы в стек заносится очередной адрес возврата.

При возврате из подпрограммы или обработчика прерывания, адрес возврата снимается со стека и управление передается на следующую инструкцию приостановленной (под-)программы.





Реализация

Стек вызовов может быть реализован как в виде специализированного стекового регистра ограниченной глубины (или даже обычного регистра адреса возврата, например в некоторых моделях PowerPC), так и в виде указателя вершины стека в оперативную память или регистровый файл процессора.[1]

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

Поддержка

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

Инструкции вызова, возврата и работы со стеком могут отличаться по размеру сохраняемых данных (в этом случае необходимо использовать соответствующие друг другу инструкции или их эквиваленты).

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

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

Использование

Стек вызовов может использоваться для различных нужд, но основное его назначение — отслеживать место, куда каждая из вызванных процедур должна вернуть управление после своего завершения. Для этого при вызове процедуры (командами вызова) в стек заносится адрес команды, следующей за командой вызова («адрес возврата»). По завершении вызванная процедура должна выполнить команду возврата для перехода по адресу из стека.

Кроме адресов возврата в стеке могут сохраняться другие данные, например:

Использование стека в многозадачных системах

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

Нестандартное использование

Стек может быть использован нестандартно, например:

  • вызванная подпрограмма может модифицировать адрес возврата, например при выборке аргументов расположенных следом за инструкцией вызова
  • возврат не в вызывающую подпрограмму, а в предыдущую по стеку (при обработке нештатной ситуации)

Альтернативное использование

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

При альтернативном использовании обработка прерываний невозможна, т. к. во избежание повреждения данных прерывания должны запрещаться.

Замечания

  • Императивные языки программирования высокого уровня, как правило, не имеют возможностей явного оперирования стеком вызовов, но есть и исключения. Например, в Forth есть прямой доступ к системному стеку вызовов (под названием «стека возвратов», в отличие от «стека данных» этого языка).

См. также

Напишите отзыв о статье "Стек вызовов"

Примечания

  1. [www.ngpedia.ru/id388376p1.html Регистр - адрес - возврат - Большая Энциклопедия Нефти и Газа, статья]


Отрывок, характеризующий Стек вызовов

Билибин, не утративший репутации умнейшего человека и бывший бескорыстным другом Элен, одним из тех друзей, которые бывают всегда у блестящих женщин, друзей мужчин, никогда не могущих перейти в роль влюбленных, Билибин однажды в petit comite [маленьком интимном кружке] высказал своему другу Элен взгляд свой на все это дело.
– Ecoutez, Bilibine (Элен таких друзей, как Билибин, всегда называла по фамилии), – и она дотронулась своей белой в кольцах рукой до рукава его фрака. – Dites moi comme vous diriez a une s?ur, que dois je faire? Lequel des deux? [Послушайте, Билибин: скажите мне, как бы сказали вы сестре, что мне делать? Которого из двух?]
Билибин собрал кожу над бровями и с улыбкой на губах задумался.
– Vous ne me prenez pas en расплох, vous savez, – сказал он. – Comme veritable ami j'ai pense et repense a votre affaire. Voyez vous. Si vous epousez le prince (это был молодой человек), – он загнул палец, – vous perdez pour toujours la chance d'epouser l'autre, et puis vous mecontentez la Cour. (Comme vous savez, il y a une espece de parente.) Mais si vous epousez le vieux comte, vous faites le bonheur de ses derniers jours, et puis comme veuve du grand… le prince ne fait plus de mesalliance en vous epousant, [Вы меня не захватите врасплох, вы знаете. Как истинный друг, я долго обдумывал ваше дело. Вот видите: если выйти за принца, то вы навсегда лишаетесь возможности быть женою другого, и вдобавок двор будет недоволен. (Вы знаете, ведь тут замешано родство.) А если выйти за старого графа, то вы составите счастие последних дней его, и потом… принцу уже не будет унизительно жениться на вдове вельможи.] – и Билибин распустил кожу.
– Voila un veritable ami! – сказала просиявшая Элен, еще раз дотрогиваясь рукой до рукава Билибипа. – Mais c'est que j'aime l'un et l'autre, je ne voudrais pas leur faire de chagrin. Je donnerais ma vie pour leur bonheur a tous deux, [Вот истинный друг! Но ведь я люблю того и другого и не хотела бы огорчать никого. Для счастия обоих я готова бы пожертвовать жизнию.] – сказала она.
Билибин пожал плечами, выражая, что такому горю даже и он пособить уже не может.
«Une maitresse femme! Voila ce qui s'appelle poser carrement la question. Elle voudrait epouser tous les trois a la fois», [«Молодец женщина! Вот что называется твердо поставить вопрос. Она хотела бы быть женою всех троих в одно и то же время».] – подумал Билибин.
– Но скажите, как муж ваш посмотрит на это дело? – сказал он, вследствие твердости своей репутации не боясь уронить себя таким наивным вопросом. – Согласится ли он?
– Ah! Il m'aime tant! – сказала Элен, которой почему то казалось, что Пьер тоже ее любил. – Il fera tout pour moi. [Ах! он меня так любит! Он на все для меня готов.]
Билибин подобрал кожу, чтобы обозначить готовящийся mot.
– Meme le divorce, [Даже и на развод.] – сказал он.
Элен засмеялась.
В числе людей, которые позволяли себе сомневаться в законности предпринимаемого брака, была мать Элен, княгиня Курагина. Она постоянно мучилась завистью к своей дочери, и теперь, когда предмет зависти был самый близкий сердцу княгини, она не могла примириться с этой мыслью. Она советовалась с русским священником о том, в какой мере возможен развод и вступление в брак при живом муже, и священник сказал ей, что это невозможно, и, к радости ее, указал ей на евангельский текст, в котором (священнику казалось) прямо отвергается возможность вступления в брак от живого мужа.
Вооруженная этими аргументами, казавшимися ей неопровержимыми, княгиня рано утром, чтобы застать ее одну, поехала к своей дочери.
Выслушав возражения своей матери, Элен кротко и насмешливо улыбнулась.
– Да ведь прямо сказано: кто женится на разводной жене… – сказала старая княгиня.
– Ah, maman, ne dites pas de betises. Vous ne comprenez rien. Dans ma position j'ai des devoirs, [Ах, маменька, не говорите глупостей. Вы ничего не понимаете. В моем положении есть обязанности.] – заговорилa Элен, переводя разговор на французский с русского языка, на котором ей всегда казалась какая то неясность в ее деле.
– Но, мой друг…
– Ah, maman, comment est ce que vous ne comprenez pas que le Saint Pere, qui a le droit de donner des dispenses… [Ах, маменька, как вы не понимаете, что святой отец, имеющий власть отпущений…]
В это время дама компаньонка, жившая у Элен, вошла к ней доложить, что его высочество в зале и желает ее видеть.
– Non, dites lui que je ne veux pas le voir, que je suis furieuse contre lui, parce qu'il m'a manque parole. [Нет, скажите ему, что я не хочу его видеть, что я взбешена против него, потому что он мне не сдержал слова.]
– Comtesse a tout peche misericorde, [Графиня, милосердие всякому греху.] – сказал, входя, молодой белокурый человек с длинным лицом и носом.
Старая княгиня почтительно встала и присела. Вошедший молодой человек не обратил на нее внимания. Княгиня кивнула головой дочери и поплыла к двери.
«Нет, она права, – думала старая княгиня, все убеждения которой разрушились пред появлением его высочества. – Она права; но как это мы в нашу невозвратную молодость не знали этого? А это так было просто», – думала, садясь в карету, старая княгиня.