<<
>>

Работа со стеком

Стек — это область памяти, специально выделяемая для временного хранения дан- ных программы. Важность стека определяется тем, что для него в структуре про- граммы предусмотрен отдельный сегмент.
На тот случай, если программист забыл описать сегмент стека в своей программе, компоновщик tliпk выдаст предупрежда- ющее сообщение. Для работы со стеком предназначены три регистра: И SS — регистр сегмента стека; * SP/ESP — регистр указателя стека; * ВР/ЕВР — регистр указателя базы кадра стека. Размер стека зависит от режима работы процессора и ограничивается значени- ем 64 Кбайт (или 4 Гбайт в защищенном режиме). В каждый момент времени дос- тупен только один стек, адрес сегмента которого содержится в регистре SS. Этот стек называется текущим. Для того чтобы обратиться к другому стеку («переклю- чить стек»), необходимо загрузить в регистр SS другой адрес. Регистр SS автомати- чески используется процессором для выполнения всех команд, работающих со сте- ком. Перечислим еще некоторые особенности работы со стеком.
* Запись и чтение данных в стеке осуществляются в соответствии с принципом LIFO (Last In First Out — «последним пришел, первым ушел»). * По мере записи данных в стек последний растет в сторону младших адресов. Эта особенность заложена в алгоритм команд работы со стеком. и При использовании регистров ESP/SP и ЕВР/ВР для адресации памяти ассемб- лер автоматически считает, что содержащиеся в нем значения представляют собой смещения относительно сегментного регистра SS.

В общем случае стек организован так, как показано на рис. 7.3. Регистры SS, ESP/SP и ЕВР/ВР1 используются комплексно, и каждый из них име- ет свое функциональное назначение.

Регистр ESP/SP всегда указывает на вершину стека, то есть содержит смещение, по которому в стек был занесен последний эле- мент. Команды работы со стеком неявно изменяют этот регистр так, чтобы он ука- зывал всегда на последний записанный в стек элемент. Если стек пуст, то значение ESP равно адресу последнего байта сегмента, выделенного под стек. При занесении элемента в стек процессор уменьшает значение регистра ESP, а затем записывает элемент по адресу новой вершины. При извлечении данных из стека процессор копирует элемент, расположенный по адресу вершины, а затем увеличивает значе- ние регистра указателя стека ESP. Таким образом, получается, что стек растет вниз, в сторону уменьшения адресов. Что нужно сделать для получения доступа к элементам не на вершине, а внутри стека? Для этого применяют регистр ЕВР. Регистр ЕВР — регистр указателя базы кадра стека. Например, типичным приемом при входе в подпрограмму является передача нужных параметров путем записи их в стек. Если подпрограмма тоже активно работает со стеком, то доступ к этим параметрам становится проблема- тичным. Выход в том, чтобы после записи нужных данных в стек сохранить адрес вершины стека в указателе базы кадра стека — регистре ЕВР. Значение в ЕВР в даль- нейшем можно использовать для доступа к переданным параметрам. Начало стека расположено в старших адресах памяти. На рис. 7.3 этот адрес обозначен парой SS:ffff.Смещение ffffприведено здесь условно. Реально это значе- ние определяется величиной, которую программист задает при описании сегмента стека в своей программе. К примеру, для программы из листинга 7.1 началу стека будет соответствовать пара SS:ОЮОh. Адресная пара SS:ffff— это максимальное для реального режима значение адреса начала стека, так как размер сегмента в нем ограничен величиной 64 Кбайт (Оffffh). ,. [6] Для организации работы со стеком существуют специальные команды записи и чтения. . Команда PUSH выполняет запись значения в вершину стека: push Интерес представляет алгоритм работы этой команды, который включает два действия (рис.
7.4): 1. Значение SP уменьшается на 2: (SP) = (SP) - 2 2. Значение источника записывается по адресу, указываемому парой SS:SP.
Рис. 7.4. Принцип работы команды PUSH

Команда POP выполняет запись значения из вершины стека по месту, указанно- му операндом (значение при этом «снимается» с вершины стека): pop Алгоритм работы команды POP обратен алгоритму команды PUSH (рис. 7.5). 1. Запись содержимого вершины стека по месту, указанному операндом . 2. Увеличение значения SP: (SP) = (SP) + 2 Команда PUSHA предназначена для групповой записи в стек. По этой команде в стек последовательно записывается содержимое регистров АХ, СХ, DX, BX, SP, BP, SI, DI. Заметим, что записывается оригинальное содержимое SP, то есть то, которое было до выдачи команды PUSHA (рис. 7.6). Команда PUSHAW почти идентична команде PUSHA. В чем разница? В главе 5 мы обсуждали один из атрибутов сегмента — атрибут размера сегмента. Он может принимать знадения usеlб или usеЗ2: Ж usеlб — алгоритм работы PUSHAW аналогичен алгоритму PUSHA; * use32 — алгоритм работы команды PUSHAW не меняется (то есть она нечувстви- тельна к разрядности сегмента и всегда работает с регистрами размером в сло- во — АХ, СХ, DX, BX, SP, BP, SI, DI), а команда PUSHA чувствительна к разрядности

Старшие адреса ОП Старшие адреса ОП Стек до команды Стек после команды PUSHA PUSHA Рис. 7.6. Принцип работы команды PUSHA сегмента и при указании 32-разрядного сегмента работает с соответствующими 32-разрядными регистрами (то есть ЕАХ, ЕСХ, ЕDХ, ЕВХ, ESP, EBP, ESI, EDI). Команда PUSHAD — выполняется аналогично команде PUSHA, но есть некоторые особенности, которые вы можете найти в приложении.

Следующие три команды выполняют действия, обратные действиям описан- ных ранее команд: * РОРА; Ш РОРАW; т POPAD. Представленная далее группа команд позволяет сохранить в стеке регистр фла- гов и записать слово или двойное слово. Отметим, что перечисленные команды — единственные в системе команд процессора, которые позволяют получить доступ (и которые нуждаются в этом доступе) ко всему содержимому регистра флагов. Команда PUSH F сохраняет регистр флагов в стеке. Работа этой команды зависит от атрибута размера сегмента: * use 16 — в стек записывается регистр FLAGS размером два байта; * usеЗ 2 — в стек записывается регистр Е FLAGS размером четыре байта. Команда РUSНFWсохраняет в стеке регистр флагов размером в слово. С атрибу- том usеlб всегда работает так же, как команда РUSНF. Команда PUSHFD сохраняет в стеке регистр флагов FLAGS или EFLAGS в зависимо- сти от атрибута размера сегмента (то есть то же, что и РUSНF). Следующие три команды также выполняют действия, обратные действиям рас- смотренных выше команд: Ш РОРF; * POPFW; и POPFD. Работать со стеком приходится постоянно, поэтому к этому вопросу мы будем возвращаться еще не раз. Отметим основные виды операций, когда использование стека практически неизбежно: ш вызов подпрограмм; II временное сохранение значений регистров; * определение локальных переменных в процедуре.
<< | >>
Источник: В. И. Юров. Assembler. Учебник для вузов. 2-е изд. 2003

Еще по теме Работа со стеком:

  1. Рэйки – это, прежде всего работа, ежедневная работа над собой.
  2. § 5. Особенности обязательств по производству эвристических работ (на примере научно-исследовательских, опытно-конструкторских и технологических работ — НИР и ОКТР) (п. 2137-2143)
  3. 1 . Узнайте как можно больше о своей работе и о том, как она вписывается в работу всей фирмы.
  4. Очерк 1: Эмили «Лучшая работа для меня та, которой я сама довольна. Мне нравится, когда мои работы говорят о том, о чем я сама хочу сказать»
  5. РАБОТА ПОСЛЕ РАБОТЫ
  6. 2. ИСТОЧНИКИ ИНФОРМАЦИИ. СПЕЦИФИКА И АЛГОРИТМЫ РАБОТЫ С ИСТОЧНИКАМИ ИНФОРМАЦИИ. ДОСТУП К ИСТОЧНИКАМ ИНФОРМАЦИИ. ПРАВОВЫЕ И ЭТИЧЕСКИЕ НОРМЫ РАБОТЫ С ИСТОЧНИКАМИ ИНФОРМАЦИИ.
  7. Работа.
  8. Работа.
  9. О работе
  10. О работе
  11. 1.2.1.3. Работы сменами
  12. КУРСОВЫЕ РАБОТЫ
  13. § 5. Работы. Услуги
  14. Статья 56. Общественные работы
  15. Утверждения о работе
  16. 1.2.1.4. Сверхурочные работы
  17. 10. Работа со словом
  18. Глава 34 РАБОТА