Несколько блоков в расширенной памяти
Несколько блоков в расширенной памяти
При работе с обычной памятью каждому блоку соответствует свой уникальный код сегмента. В отличие от обычной, при работе с расширенной памятью доступ ко всем зарезервированным задачей блокам осуществляется через один и тот же сегмент EMS. В таком случае по коду сегмента невозможно определить блок, к которому происходит обращение. Для этой цели можно использовать только смещение (адрес), по которому выбираются или записываются данные. Для того чтобы понять, к чему это приводит, рассмотрим простой вариант работы с двумя блоками.
Предположим, что доступны два блока, и надо переписать данные из одного в другой. Если один из блоков расположен в видео или в обычной памяти, а другой в расширенной, то размер пересылаемой порции данных ограничен адресным пространством сегмента, т. е. величиной 65 536 байтов. В этом вы могли убедиться на примере Б.7.
Если же оба блока расположены в расширенной памяти, то пространство сегмента EMS придется разделить пополам и использовать младшие адреса для работы с одним из блоков, а старшие — с другим. В результате этого в каждом блоке будет доступно пространство размером 32 768 байтов. Никаких других ограничений нет.
В таком случае перед копированием порции данных придется дважды обратиться к подпрограмме отображения страниц, описанной в примере Б.6, через точку входа mapip. Сначала отображаются две очередные логические страницы блока 1 на физические страницы 0 и 1, затем две очередные логические страницы блока 2 на физические страницы 2 и 3. Блок 1 начинается с нулевого адреса сегмента EMS, а блок 2 с адреса soooh того же сегмента. Предельный размер доступного пространства в обоих блоках составляет soooh или 32 768 байтов. После этого можно использовать любые команды для работы с отображенным пространством, например, строковую операцию movs, выполняющую перемещение данных из блока в блок.
Если особенности алгоритма требуют одновременной работы с тремя или четырьмя блоками, то доступное пространство будет ограничено размером одной страницы, т. е. величиной 16 384 байта.
Здесь уместно отметить, что в набор Advanced Functions драйвера EMM включена специальная функция, предназначенная для перемещения или обмена содержимого (перестановки) двух блоков данных размером до 1 Мбайт, ее код 57h. Блоки могут располагаться в обычной или расширенной памяти. Перед вызовом функции 57h в регистре ai указывается 0 для пересылки или 1 для перестановки блоков. Кроме того, в регистрах ds:si указывается адрес начала специальной структуры данных, содержащей размер блока и данные об источнике и приемнике. Описание этой функции вы можете найти, например, в Tech Help, нам важно было напомнить о ее существовании.