| Аппаратное обеспечение IBM PC© Александр Фролов, Григорий ФроловТом 2, книга 1, М.: Диалог-МИФИ, 1992. 
 11.5. Дополнительные функции EMMДополнительные функции используются резидентными программами, драйверами и мультизадачными приложениями. Кроме того, с помощью этих функций можно выполнять пересылку массивов в дополнительной и стандартной памяти, а также организовать подкачку и выполнение программных модулей в дополнительной памяти. Обратите внимание, что использование расширенной памяти в спецификации XMS позволяет выполнять программные модули (с ограничениями) только в области HMA размером примерно 64 килобайта. Остальная расширенная память может быть использована только для хранения данных. Специальные функции с номерами 47h - 4Eh поддерживаются EMM версии 3.2, функции с номерами 4Fh - 58h - только EMM версии 4.0. 11.5.1. Сохранить контекст отображения
На входе:       AX = 4700h;
                DX = индекс EMM.
На выходе:      AH = байт состояния EMM.
Эта функция предназначена для использования драйверами и резидентными программами. Прежде чем работать с дополнительной памятью, такие программы должны сохранить текущий контекст отображения логических страниц. Перед возвратом управления прикладной программе контекст должен быть восстановлен с помощью функции 48h. 11.5.2. Восстановить контекст отображения
На входе:       AX = 4800h;
                DX = индекс EMM.
На выходе:      AH = байт состояния EMM.
Функция позволяет восстановить контекст отображения логических страниц пула, сохраненный предыдущей функцией. 11.5.3. Определить количество страниц в пуле
На входе:       AX = 4B00h;
                DX = индекс EMM.
На выходе:      AH = байт состояния EMM;
                BX = количество логических страниц в пуле.
Функция возвращает количество логических страниц дополнительной памяти для выбранного пула. 11.5.4. Определить количество активных пулов
На входе:       AX = 4C00h;
                DX = индекс EMM.
На выходе:      AH = байт состояния EMM;
                BX = количество активных пулов дополнительной
                памяти.
Функция предназначена для определения количества текущих активных пулов и может вызываться перед использованием следующей функции (с номером 4Dh). 11.5.5. Получить информацию о пулах
На входе:       AX = 4D00h;
                ES:DI = адрес буфера для информации.
На выходе:      AH = байт состояния EMM;
                BX = количество активных пулов дополнительной
                памяти.
После вызова функции буфер заполняется как массив структур, содержащих два 16-битовых слова. Первое слово содержит индекс пула, второе - количество логических страниц в этом пуле. 11.5.6. Получить/установить отображение всех страниц
На входе:       AH = 4Eh;
                AL = код подфункции:
                0 - получить содержимое всех регистров
                         отображения в буфер ES:DI;
                1 - восстановить содержимое всех регистров
                         отображения из буфера ES:DI;
                2 - получить и установить все регистры
                         отображения в буфер ES:DI
                         или восстановить из буфера ES:DI 
                         (т.е. комбинация подфункций 0 и 1);
                3 - Определить размер требуемого буфера;
 
                ES:DI = адрес буфера для информации;
На выходе:      AH = байт состояния EMM;
                AL = для подфункции 3 - размер буфера.
Эта функция предназначена для поддержки мультизадачности. Она позволяет быстро изменять контекст дополнительной памяти при переключении с одного процесса на другой. 11.5.7. Получить/установить отображение части страниц
На входе:       AH = 4Fh;
                AL = код подфункции:
                0 - получить содержимое регистров
                         отображения в буфер ES:DI;
                1 - восстановить содержимое регистров
                         отображения из буфера ES:DI;
                2 - определить размер требуемого буфера;
                ES:DI = адрес буфера для информации;
                DS:SI = адрес массива 16-битовых слов,
                        содержащих сегментные адреса страниц,
                        для которых необходимо сохранить
                        контекст отображения; самое первое
                        слово массива - это размер массива
                        в словах.
На выходе:      AH = байт состояния EMM;
                AL = для подфункции 2 - размер буфера.
Функция работает аналогично предыдущей, но позволяет сохранять контексты только для некоторых страниц. Это экономит время, необходимое для сохранения/восстановления. 11.5.8. Отображение/запрещение группы страниц
На входе:       AH = 50h;
                AL = код подфункции:
                0 - разрешить или запретить отображение
                         страниц, используя номера страниц;
                1 - аналогично подфункции 0, но
                         используются не номера страниц, а
                         адреса сегментов;
                DS:SI = адрес массива структур, состоящий из
                        двух слов, первое слово - номер
                        логической страницы, второе -
                        номер физической страницы;
                        указание логической страницы 0FFFFh
                        запрещает отображение страницы;
                CX = размер массива DS:SI в количестве
                структур.
На выходе:      AH = байт состояния EMM.
Функция позволяет за один вызов разрешить и запретить использование нескольких страниц. 11.5.9. Изменение размера пула
На входе:       AX = 5100h;
                BX = новый размер пула в логических страницах;
                DX = индекс EMM.
На выходе:      AH = байт состояния EMM.
С помощью этой функции программа может изменить размер уже заказанного ранее пула страниц дополнительной памяти. 11.5.10. Получить/установить атрибуты пула
На входе:       AH = 52h;
                AL = код подфункции:
                0 - получить атрибуты пула;
                1 - установить атрибуты пула;
                2 - определить возможность использования
                         атрибута неразрушаемой памяти;
                BL = новые атрибуты;
 
                DX = индекс EMM.
На выходе:      AH = байт состояния EMM;
                AL = для подфункции 0: атрибуты пула;
                для подфункции 2:
                        0 - атрибут неразрушаемой памяти
                                недоступен;
                        1 - атрибут неразрушаемой памяти
                                доступен.
Функция дает возможность установить для некоторых пулов атрибут неразрушаемой памяти. Содержимое таких пулов не исчезает при теплой перезагрузке операционной системы (после нажатии комбинации клавиш Ctrl-Alt-Del). 11.5.11. Установить/прочитать имя пула
На входе:       AH = 53h;
                AL = код подфункции:
                0 - получить имя пула;
                1 - установить имя пула;
                ES:DI = адрес буфера имени пула, длина
                        этого буфера должна быть 8 байтов;
                DX = индекс EMM.
На выходе:      AH = байт состояния EMM.
Функция предназначена для использования в мультизадачной среде. Она позволяет нескольким процессам, работающим одновременно, использовать одни и те же именованные пулы дополнительной памяти. 11.5.12. Найти имя пула
На входе:       AH = 54h;
                AL = код подфункции:
                0 - получить каталог пулов;
                1 - найти пул по имени;
                2 - определить количество открытых пулов;
                DS:SI = адрес буфера имени пула для
                        подфункции 1, длина
                        этого буфера должна быть 8 байтов;
                ES:DI = адрес массива 10-байтовых элементов;
                        в первое слово элемента будет
                        записан индекс пула, в остальные 8 -
                        имя пула.
На выходе:      AH = байт состояния EMM;
                AL = количество элементов в  массиве
                  (подфункция 0);
                DX = индекс найденного пула (для 
                  подфункции 1);
                BX = количество открытых пулов (для
                  подфункции 2).
Эта функция позволяет определить индекс пула по его имени или получить каталог всех именованных пулов. 11.5.13. Отобразить страницу и перейти по адресу
На входе:       AH = 55h;
                AL = код подфункции:
                0 - использовать массив номеров
                         физических страниц;
                1 - использовать массив сегментных
                         адресов;
                DS:SI = адрес структуры MapAndJump длиной
                        9 байтов.
На выходе:      AH = байт состояния EMM.
Эта функция предназначена для перекачки страниц исполняемого кода в память и последующего выполнения этого кода. Первые четыре байта структуры MapAndJump содержат смещение и сегментный адрес, по которым должен быть выполнен переход. Следующий байт - количество элементов в таблице отображения. Последние 4 байта содержат FAR-адрес таблицы отображения, состоящей из 4-байтовых элементов. Первое слово элемента таблицы отображения - номер логической страницы, второе - номер физической страницы. 11.5.14. Отобразить страницу и вызвать процедуру
На входе:       AH = 56h;
                AL = код подфункции:
                0 - использовать массив номеров
                         физических страниц;
                1 - использовать массив сегментных
                         адресов;
                2 - получить размер стека, необходимого
                         для использования подфункций 0 и 1;
                DS:SI = адрес структуры MapAndCall длиной
                        22 байта.
На выходе:      AH = байт состояния EMM;
                BX = требуемый размер стека (заполняется при
                  выполнении подфункции 2).
Функция работает аналогично предыдущей, но не передает управление исполняемому коду, а вызывает его как процедуру. Первые 9 байтов структуры MapAndCall соответствуют структуре MapAndJump. Далее идет еще один байт длины таблицы отображения и 4 байта адреса другой таблицы отображения. Вторая таблица описывает отображение страниц, которое будет установлено после вызова процедуры. Последние 8 байтов структуры зарезервированы для дальнейшего использования. 11.5.15. Переслать/обменять область памяти
На входе:       AH = 57h;
                AL = код подфункции:
                0 - переслать область памяти;
                1 - обменять область памяти;
                DS:SI = адрес структуры MoveInfo длиной
                        18 байтов.
На выходе:      AH = байт состояния EMM.
Функция предназначена для выполнения перемещения или обмена содержимого областей стандартной или дополнительной памяти. Возможно перекрытие исходной и результирующей областей памяти. Максимальный размер блоков, над которыми эта функция может выполнять операции - 1 мегабайт. Структура MoveInfo содержит всю необходимую информацию о расположении блоков памяти: 
Смещение  Размер   Описание
(+0)      4        Размер блока в байтах
(+4)      1        Тип исходной памяти:
                     0 - стандартная, 1 - EMS
(+5)      2        Индекс исходной памяти:
                     0 для стандартной памяти,
                     индекс пула для EMS
(+7)      2        Смещение для исходной памяти (внутри
                     сегмента или страницы)
(+9)      2        Адрес исходного сегмента или номер
                     для исходной страницы
(+11)     1        Тип результирующей памяти:
                     0 - стандартная, 1 - EMS
(+12)     2        Индекс результирующей памяти:
                     0 для стандартной памяти,
                     индекс пула для EMS
(+14)     2        Смещение для результирующей памяти
                   (внутри сегмента или страницы)
(+16)     2        Адрес результирующего сегмента или
                     номер для исходной страницы
Получить массив адресов отображения 
На входе:       AH = 58h;
                AL = код подфункции:
                0 - получить массив отображения;
                1 - получить размер массива отображения;
                ES:DI = адрес буфера для массива отображения.
На выходе:      AH = байт состояния EMM;
                CX = количество элементов в массиве
                отображения (для подфункции 1)
Массив отображения, получаемый при помощи этой функции, состоит из 4-байтовых элементов. Первое слово элемента содержит адрес сегмента, второе - номер физической страницы, соответствующей этому адресу. 
 | 


![[Назад]](../../prev.gif)
![[Содеожание]](../../sod.gif)
![[Дальше]](../../next.gif)