Каким должен быть язык программирования? Анализ и критика Описание языка Компилятор
Отечественные разработки Cтатьи на компьютерные темы Компьютерный юмор Прочее

Реализация двухстековой модели размещения данных

У процессора 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 же придерживается иной, не совместимой архитектуры вызовов. Рассмотренная выше организация работы с двумя стеками отличается от фортовской и реализует её меньшим количеством машинных команд и совместима с программами на самых распространённых языках.

            Читаем далее следующую статью: Двухстековая модель: тесты на скорость.

Почитайте ещё:

Последняя правка: 2016-03-18    09:43

Оцените

Отзывы

     2015/02/11 12:35, Павел

А как же адрес возврата?

     2015/02/11 17:09, Автор сайта

Адрес возврата лежит в стеке, ячейка с адресом возврата адресуется регистром EBP – всё как обычно.

Написать отзыв

Написать автору можно на электронную почту mail(аt)compiler.su

Авторизация

Регистрация

Выслать пароль

Карта сайта


Каким должен быть язык программирования?

Анализ и критика

Устарел ли текст как форма представления программы

Русский язык и программирование

Многоязыковое программирование

Синтаксис языков программирования

Синтаксический сахар

Некоторые «вкусности» Алгол-68

«Двухмерный» синтаксис Python

Почему языки с синтаксисом Си популярнее языков с синтаксисом Паскаля?

Должна ли программа быть удобочитаемой?

Стиль языка программирования

Тексто-графическое представление программы

●  Разделители

●  Строки программы

●  Слева направо или справа налево?

Комментарии

●  Длинные комментарии

●  Короткие комментарии

●  Комментарии автоматической генерации документации

●  Нерабочий код

Нужны ли беззнаковые целые?

Шестнадцатиричные и двоичные константы

Условные операторы

Переключатель

Циклы

●  Продолжение цикла и выход из него

Некошерный «goto»

Операции присвоения и проверки на равенство. Возможно ли однаковое обозначение?

Так ли нужны операции «&&», «||» и «^^»?

Постфиксные инкремент и декремент

Почему в PHP для конкатенации строк используется «.»?

Указатели и ссылки в C++

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

Почему динамическое распределение памяти – это плохо

Как обеспечить возврат функциями объектов переменной длины?

●  Типы переменного размера (dynamically sized types, DST) в языке Rust

●  Массивы переменной длины в C/C++

●  Размещение объектов в стеке, традиционный подход

●  Размещение объектов переменной длины с использованием множества стеков

●  Размещение объектов переменной длины с использованием двух стеков

●  Реализация двухстековой модели размещения данных

●  Двухстековая модель: тесты на скорость

●  Размещение объектов переменной длины с использованием одного стека

Можно ли забыть о «куче», если объекты переменной длины хранить в стеке

Безопасность и размещение объектов переменной длины в стеке

Массивы, структуры, типы, классы переменной длины

О хранении данных в стеке, вместо заключения

Описание языка

Компилятор

Отечественные разработки

Cтатьи на компьютерные темы

Компьютерный юмор

Прочее

Последние комментарии

2018/10/11 22:29, Автор сайта
Формула расчета точности для умножения

2018/10/08 14:00, Неслучайный читатель
Сколько проходов должно быть у транслятора?

2018/10/06 12:19, Автор сайта
Тексто-графическое представление программы

2018/10/04 17:39, Автор сайта
Об исключенных командах или за что «списали» инструкцию INTO?

2018/09/29 16:52, Автор сайта
Как отличить унарный минус от бинарного

2018/09/22 20:13, Д.Ю.Караваев
Идеальный транслятор

2018/09/22 12:32, Автор сайта
Типы в инженерных задачах

2018/09/22 12:20, Д.Ю.Караваев
О русском языке в программировании