Прежде чем приступить к рассмотрению того, каким образом
поддерживается работа с различными структурами данных на ассемблере,
необходимо определиться с тем, как будет решаться проблема распределения
памяти. Это важный момент, так как фон-неймановская архитектура
современных машин предполагает, что любые данные, обрабатываемые
программой, располагаются в памяти. Традиционно в любом языке
программирования высокого уровня существуют два способа распределения
памяти для переменных и постоянных данных — статический и динамический.
Соответственно данные будем называть статическими и динамическими
объектами данных. В ассемблере в силу его специфики явно присутствует
возможность только статического распределения памяти с помощью директив
резервирования и инициализации памяти в сегменте данных. Статические
объекты данных занимают отведенную им память на все время работы
программы. До сих пор при написании ассемблерных программ мы
использовали именно статическое распределение памяти. Недостаток этого
типа памяти очевиден — если объект данных занимает большую область
памяти и имеет малый период жизни, то выделять память на все время
работы программы неразумно. Гораздо эффективнее в таких случаях иметь
возможность для временного выделения памяти объекту данных на время его
жизни. В этом разделе мы уделим все внимание проблеме динамического
распределения памяти в программах на ассемблере.
Динамическими объектами данных называются объекты данных, обладающие двумя особенностями:
- распределение/освобождение памяти для объекта данных производится по явному запросу программы;
- доступ к динамическим объектам данных производится не по их именам, а посредством указателей, содержащих ссылку (адрес) на созданный динамический объект.
Существует и третья особенность, о которой, возможно, не
подозревают программирующие на языках высокого уровня, — технология
выделения памяти для динамических объектов данных. Эта технология
напрямую зависит от операционной среды, для которой разрабатывается
программа. Так, в MS DOS динамическое выделение памяти во время работы
приложения осуществляется с помощью двух функций прерывания int 21h-48h
(выделение блока памяти) и 49h (освобождение блока памяти). Единицей
выделения памяти при этом является параграф (16-байтный блок памяти). С
точки зрения современного программирования — это примитивно и не очень
интересно. Гораздо большими возможностями обладает наиболее
распространенная в настоящее время операционная система Windows.
В Windows существует несколько механизмов динамического выделения памяти:
- виртуальная память;
- кучи;
- отображаемые в память файлы.
Пример использования последнего из перечисленных механизмов был приведен в уроке 20 «ММХ-технология микропроцессоров Intel» учебника. Также отображаемые в память файлы рассматриваются в главе 7 этой книги, посвященной работе с файлами. Для нашего изложения представляют интерес, хотя и в разной степени, первые два механизма.