Реализация двухстековой модели размещения данных
У процессора x86, к сожалению, всего один стек.
Как тогда заставить работать двухстековую модель?
Один стек в программе уже имеется, это аппаратный стек процессора, с которым работают через регистры ESP и EBP.
Чтобы пользоваться вторым стеком, надо однократно зарезервировать под него память.
Указатель на эту область памяти запишем в глобальную переменную «другой стек».
Перед вызовом функции, которая возвращает объект переменной длины, пишем:
XCHG ESP, другой стек
Далее вызывается, к примеру, такая функция:
Таблица БД* поставщики = Конструктор таблицы БД (список поставщиков);
которая будет выглядеть на ассемблере так:
PUSH <параметр 1>
. . .
PUSH <параметр N>
CALL Конструктор таблицы БД
Внутри вызванной функции уменьшаем указатель вершины другого стека на длину объекта:
mov EAX, длина объекта
sub другой стек, EAX
После вызова функции для восстановления актуального значения ESP опять делаем обмен значений:
XCHG ESP, другой стек
В качестве послесловия стоит упомянуть о двухстековой модели языка Forth.
В нём один стек используется для данных, а другой — для хранения адресов возвратов.
Слова языка Forth (термин «слово» этого языка подразумевает функции, процедуры, операции)
могут как брать из стека произвольное количество данных, так и класть в него (т.е. возвращать) произвольное количество данных.
При всём достоинстве такого подхода сам язык не пользуется успехом по ряду причин.
Одна из них такова, что такая работа со стеком исключает совместимость
программ на Forth с программами на C, Pascal и проч.
Редактор связей может собрать исполняемый модуль из объектных файлов,
полученных компиляцией программ на разных языках типа C, C++, Pascal, Ada.
Forth же придерживается иной, не совместимой архитектуры вызовов.
Рассмотренная выше организация работы с двумя стеками отличается от фортовской и
реализует её меньшим количеством машинных команд и совместима с программами на самых распространённых языках.
Читаем далее следующую статью:
Двухстековая модель: тесты на скорость.
Почитайте ещё:
Опубликовано: 2014.07.27, последняя правка: 2018.10.29 16:03
Отзывы
2015/02/11 12:35, Павел #
А как же адрес возврата?
2015/02/11 17:09, Автор сайта #
Адрес возврата лежит в стеке, ячейка с адресом возврата адресуется регистром EBP — всё как обычно. Добавить свой отзыв
Написать автору можно на электронную почту mail(аt)compiler.su
|