Переслать блок расширенной памяти
Регистры на входе: AH 87h CX Размер пересылаемого блока в словах. ES:SI Адрес таблицы GDT, подготовленной специальным образом. Регистры на выходе: CARRY = 0 Функция выполнилась без ошибки. AX 00h В случае ошибки: CARRY = 1 Произошла ошибка при пересылке блока. AH Код ошибки: 01h - ошибка чётности; 02h - произошло исключение; 03h - сбой адресной линии A20.
Перед вызовом этой функции необходимо подготовить GDT, состоящую из 6 дескрипторов. Два первых и два последних дескриптора должны содержать нули. Третий дескриптор должен указывать на начало области памяти, из которой будет выполняться копирование. Четвёртый дескриптор должен указывать на область памяти, в которую будет выполняться копирование блока данных.
В третьем и четвёртом дескрипторе необходимо заполнить поля предела для копируемого блока памяти (в них должно быть записано значение CX*2 - 1), и поле доступа (значение 93):
Таблица 6. GDT для пересылки блока памяти средствами BIOS.
Смещение байта | Содержимое |
00h - 0Fh | Это поле должно содержать нули. |
10h - 11h | Предел сегмента (CX*2 -1). |
12h - 14h | 24-разрядный физический адрес исходного блока памяти. |
15h | Байт доступа, должен быть равен 93h. |
16h - 17h | Это поле должно содержать нули. |
18h - 19h | Предел сегмента (CX*2 -1). |
1Ah - 1Ch | 24-разрядный физический адрес результирующего блока памяти. |
1Dh | Байт доступа, должен быть равен 93h. |
1Eh - 2Fh | Это поле должно содержать нули. |
Для пересылки блока функция 87h переводит процессор в защищённый режим, используя подготовленную таблицу GDT. Так как указываются 24-разрядные физические адреса исходного и результирующего блоков, возможна пересылка блоков из любого места памяти в любое место памяти. Размер блока, очевидно, ограничен 64 килобайтами.
Пересылка блока выполняется в защищённом режиме обычной командой MOVS, причём во время пересылки прерывания запрещены. Перед возвратом функция выполняет сброс процессора и установку реального режима.
Вся процедура пересылки оказывается достаточно длительной, так как необходимо выполнить сброс процессора. Из-за того, что во время пересылки прерывания запрещены, возможен конфликт с устройствами ввода/вывода (потеря прерываний).