"Роберт Джордайн. Справочное пособие программиста - 2 (ассемблер, операционная система MS DOS)" - читать интересную книгу автораший) микросхемы информации о конфигурации говорят сколько памяти
установлено на системной плате (возможны три значения: 0100H - для 256K, 0200H - для 512K и 0280H для 512K плюс 128K на плате расширения). Память канала ввода/вывода для AT сообщается регист- рами 17H и 18H (с инкрементом 512K). Память сверх 1 мегабайта доступна через регистры 30H и 31H (опять с инкрементом 512K, вплоть до 15 мегабайт). Если AT имеет 128K на плате расширения, то установлен бит 7 регистра 33. Во всех случаях надо сначала послать номер регистра в порт 70H, а затем прочитать значение из порта 71H. Легко написать программу, которая прямо тестирует наличие памяти через определенные интервалы адресного пространства. Пос- кольку минимальная порция памяти 16 килобайт, то достаточно про- верить одну ячейку памяти в каждом 16-килобайтном сегменте, чтобы убедиться, что все 16K присутствуют. Когда данная ячейка памяти отсутствует, то при чтении из нее получаем значение 233. Для проверки можно записать в ячейку произвольное число, отличное от 233 и сразу же считать его. Если вместо посланного числа возвра- щается 233, то соответствующий банк памяти отсутствует. Не приме- няйте этот способ на AT, где при попытке писать в несуществующую память вступает в действие встроенная обработка несуществующей памяти. Диагностика AT настолько хороша, что Вы можете целиком положиться на системную информацию о конфигурации. Память постоянно занимается частями операционной системы, драйверами устройств, резидентными программами обработки прерыва- не должны вносить необратимых изменений в содержимое памяти. Сначала надо сохранить значение, хранящееся в тестируемой ячейке, затем проверить ее и восстановить первоначальное значение. Имеется еще одна проблема. Если Ваша процедура хотя бы времен- но модифицирует свой код, то это может привести к краху. Поэтому для проверки надо выбирать такую ячейку из блока 64K, которая не будет занята текстом Вашей процедуры. Для этого поместите проце- дуру тестирования впереди программы, а для тестирования выберите ячейку со смещением равным смещению для кодового сегмента. Напри- мер, если регистр кодового сегмента содержит 13E2, то сегмент начинается со смещения 13E2 во втором 64K-байтном блоке памяти. Поскольку Ваша подпрограмма проверки не может находиться по этому адресу, то Вы можете безопасно проверять значение 3E2 в каждом блоке. Запрет прерываний [1.2.2] позволяет не беспокоиться о модификации кода из-за аппаратных прерываний, которые могут происходить во время проверки. Определение количества памяти реально доступной операционной системе также требует некоторого фокуса. Когда программа первый раз получает управление, то DOS отводит ей всю доступную память, включая верхнюю область памяти, содержащую нерезидентную часть DOS (которая автоматически перезагружается, если она была модифи- цирована). Для запуска другой программы из текущей или для того, чтобы сделать программу подходящей для многопользовательсой сис- темы, необходимо урезать программу до требуемого размера. В пунк- |
|
|