Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
6_Ассемблер-IA-32.doc
Скачиваний:
9
Добавлен:
03.09.2019
Размер:
594.43 Кб
Скачать

6.6.2. Организация стека

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

Стек — это список элементов данных, обычно слов или байтов, доступ к которым ограничен следующим правилом: элементы этого списка могут добавляться толь­ко в его конец и удаляться только из конца. Конец списка называется вершиной стека, а его начало — дном. Такую структуру иногда называют магазином. Этот механизм хранения и обработки данных хорошо описывается емкой фразой «последним вошел — пер­вым вышел» (Last In First Out, LIFO), означающей, что элемент данных, поме­щенный в стек последним, удаляется из него первым. Операцию помещения но­вого элемента в стек часто называют его проталкиванием (push), а операцию извлечения последнего элемента из стека называют его выталкиванием (pop).

Данные, организованные в виде сте­ка хранятся, так чтобы последовательные элементы располагались друг за другом. Первый элемент хранится по адресу BOTTOM, а когда в стек помеща­ются новые элементы, они располагаются в порядке уменьшения последователь­ных адресов. Таким образом, стек растет в направлении уменьшения адресов. На рис. 6.6 показано, как располагается в памяти компьютера стек, элементы которого занимают по одному 32-разрядному слову. На дне он содержит числовое значение 43, а на вершине -28. Для отслеживания адреса вершины стека используется регистр процессора, называемый указателем стека (Stack Pointer, SP (ESP)).

Так как память адресуется побайтово и слово имеет длину 32 разряда (4 байта), операцию проталкивания в стек можно реализовать так:

SUB ESP,4

MOV NEWITEM,(ESP)

где команда SUB вычитает операнд 4 из результирующего операн­да, содержащегося в регистре ESP, и помещает результат в регистр ESP. Эти две ко­манды помещают слово, хранящееся по адресу NEWITEM, на вершину стека, предварительно уменьшая указатель стека (адрес вершины) на одно слово равное 4 байтам. Операция выталкивания из стека может быть реализована так:

MOV ITEM,(ESP)

ADD ESP,4

Эти две команды перемещают значение, хранившееся на вершине стека, в дру­гое место памяти, по адресу ITEM, а затем уменьшают указатель стека на 4, чтобы он указывал на тот элемент, который теперь располагается на вершине стека.

Рис. 6.6. Стек слов в памяти

Как было уже отмечено, стек процессора удобно применять для выпол­нения операций, связанных с входом в подпрограммы и возвратом из таковых. В архитектуре IA-32 в качестве указателя стека используется регистр ESP, указы­вающий на текущую вершину стека процессора (то есть на его верхний элемент). Ширина стека составляет 32 разряда, а это означает, что его эле­менты являются двойными словами.

Существует четыре команды для проталкивания элементов в стек и выталки­вания их из стека.

Команда

PUSH Source

уменьшает значение ESP на 4, а затем сохраняет двойное слово, находящееся по адресу Source, в па­мяти, который указан в ESP.

Команда POP

POP Destination

выполняет обратную операцию: считывает из памяти двойное слово, на которое указывает ESP, то есть считывает из стека верхний элемент, а затем сохраняет его по адресу Destination и увеличивает значение ESP на 4, удаляя тем самым верхний эле­мент из стека. Регистр ESP используется в этой команде неявно. Исходный и ре­зультирующий операнды задаются в одном из режимов адресации IA-32. Еще две команды предназначены для выталкивания из стека и проталкивания в него сра­зу нескольких элементов.

Команда

PUSHAD

проталкивает в стек содержимое восьми регистров общего назначения, от ЕАХ до EDI, а команда

POPAD

выталкивает их из стека в обратном порядке. При извлечении сохраненного значе­ния ESP команда POPAD удаляет его из стека, не загружая в регистр ESP, и про­должает выталкивать последующие элементы, записывая их в соответствующие регистры. Применение этих двух команд при реализации подпрограмм позволяет более эффективно сохранять и восстанавливать содержимое всех регистров.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]