Оперативная память

         

Адрес свободного пространства



Адрес свободного пространства

Для определения адреса свободного пространства надо знать, где заканчивается последний сегмент задачи. Для этого, в свою очередь, необходимо выяснить, какой из сегментов, описанных в исходном тексте программы, окажется последним в теле задачи.

Иногда рекомендуют включать в исходный текст задачи пустой сегмент, имя которого начинается на букву z, например:

Zero Segment ; начало сегмента Zero Zero Ends ; конец сегмента Zero

Если при этом задана директива .Alpha, т. е. надежда, что сегмент zero будет расположен в теле задачи последним. В таком случае он и является началом свободного пространства в блоке задачи.

Несмотря на очевидную простоту, этот способ не универсален, поскольку сегмент zero не всегда оказывается последним. Напомним, что имена могут состоять не только из букв. Например, если кодовый сегмент имеет имя _text, то сегмент Zero будет расположен перед ним. Поэтому нужен более надежный способ определения последнего сегмента.

Если указана директива Dosseg, то последним в теле задачи будет расположен стековый сегмент. Тот же результат получается при использовании специальных директив, показанных в примере Б.2. Учитывая, что они рекомендованы разработчиками в качестве основных, имеет смысл исходить из допущения, что последним в теле задачи расположен стековый сегмент.

Стековый сегмент имеет определенный размер, который надо учесть при вычислении первого свободного сегмента в блоке задачи. При входе в задачу регистр SP содержит адрес верхушки, который равен размеру стека, выраженному в байтах. Его надо преобразовать в параграфы (разделить на 16) и сложить с кодом стекового сегмента, хранящимся в регистре ss. Таким образом, адрес начала свободного пространства (код свободного сегмента) вычисляется по формуле:

freeseg = [ss] + ([sp] /16) + 1

В этой формуле квадратные скобки указывают на то, что используется содержимое регистров ss и sp. При программировании деление [sp] на 16 заменяется сдвигом на 4 разряда вправо. Для того чтобы не потерять один параграф, размер стека должен быть кратен 16-ти, в противном случае его надо округлить в сторону увеличения. Прибавление 1 нужно потому, что свободный сегмент должен начинаться после стекового, не перекрывая его.

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



Содержание раздела