Работа со стеком
![]() |
В общем случае стек организован так, как показано на рис. 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.
![]() |
Команда 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 временное сохранение значений регистров; * определение локальных переменных в процедуре.
Еще по теме Работа со стеком:
- Рэйки – это, прежде всего работа, ежедневная работа над собой.
- § 5. Особенности обязательств по производству эвристических работ (на примере научно-исследовательских, опытно-конструкторских и технологических работ — НИР и ОКТР) (п. 2137-2143)
- 1 . Узнайте как можно больше о своей работе и о том, как она вписывается в работу всей фирмы.
- Очерк 1: Эмили «Лучшая работа для меня та, которой я сама довольна. Мне нравится, когда мои работы говорят о том, о чем я сама хочу сказать»
- РАБОТА ПОСЛЕ РАБОТЫ
- 2. ИСТОЧНИКИ ИНФОРМАЦИИ. СПЕЦИФИКА И АЛГОРИТМЫ РАБОТЫ С ИСТОЧНИКАМИ ИНФОРМАЦИИ. ДОСТУП К ИСТОЧНИКАМ ИНФОРМАЦИИ. ПРАВОВЫЕ И ЭТИЧЕСКИЕ НОРМЫ РАБОТЫ С ИСТОЧНИКАМИ ИНФОРМАЦИИ.
- Работа.
- Работа.
- О работе
- О работе
- 1.2.1.3. Работы сменами
- КУРСОВЫЕ РАБОТЫ
- § 5. Работы. Услуги
- Статья 56. Общественные работы
- Утверждения о работе
- 1.2.1.4. Сверхурочные работы
- 10. Работа со словом
- Глава 34 РАБОТА