На главную
Подписка
Новости










Главная / MS-DOS / MS-DOS. РУКОВОДСТВО РАЗРАБОТЧИКА / Глава 12 / Общие рекомендации по совместимости Сделать домашней страницей Добавить в избранное Написать писмо

НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Общие рекомендации по совместимости

Со времени появления первой версии операционной системы MS-DOS в 1981 году разработка операционных систем продолжалась в сторону расширения ее возможностей по подключению новых аппаратных сред, решения проблем исправления ошибок и общего улучшения ее работы.


Несмотря на то, что многие из этих улучшений привели к повышению производительности вычислительных средств, они одновременно оказались причиной нескольких осложнений, поскольку не все новые функции были совместимы со старыми версиями операционной системы MS-DOS. Для того, чтобы сохранить на будущее все улучшения, в этой главе собрана информация, призванная помочь вам определить совместимость разных версий операционной системы MS-DOS между собой. Особенно полезна информация, содержащаяся в этой главе, для тех, кто занимается разработкой собственных программ на языке Ассемблер.


За исключением тех команд, которые по своей природе являются инструментами программистов (такие команды, как команда отладчика DEBUG и команда редактора связей LINK), новые и расширенные команды операционной системы MS-DOS сравнительно редко используются программистами. Изменения, представляющие собой особенный интерес для программистов, включают в себя прерывания MS-DOS, вызов функций, коды ошибок, форматы гибких и жестких дисков и управление файлами. Понять все указанные изменения довольно легко, поскольку обращения к функциям присутствуют во всех реализациях любой из версий операционной системы MS-DOS.


Что касается некоторых других моментов (таких, как управление памятью), то общей схемы работы с ними быть не может, поскольку они часто меняются в зависимости от среды аппаратных средств, для которой предназначена именно эта реализация операционной системы MS-DOS. Именно этот случай имеет место с персональным компьютером фирмы "ИБМ" IBM PC и совместимыми с ним компьютерами. Системы, имеющие коренным образом отличные от указанной архитектуры аппаратных средств, имеют и другие схемы управления памятью, чем в реализациях операционной системы MS-DOS. Даже в таких, казалось бы, "стандартных" механизмах, как прерывания, существуют коренные различия в их работе.


Следовательно, при разработке прикладных программ программисту необходимо быть знакомым с особенностями используемой версии. Знание различий между разными версиями персональных компьютеров особенно важно в тех случаях, когда программист разрабатывает программу с целью ее широкого применения на разных вычислительных средствах. Следует помнить, что существуют разные версии операционной системы MS-DOS, зависящие от конкретной вычислительной машины, и что существует множество вычислительных машин с разными архитектурами аппаратных средств и разными реализациями операционной системы MS-DOS. Простое следование указаниям технического руководства по операционной системе MS-DOS может оказаться дезориентирующим, если вы разрабатываете программу, предназначенную для работы под всеми реализациями операционной системы MS-DOS.


Эта глава не предназначена заменить техническое руководство по операционной системе MS-DOS. Настоящая глава просто представляет собой обзор различий в версиях операционной системы MS-DOS и, следовательно, является дополнением к техническим руководствам по всем версиям операционной системы MS-DOS.


Сведения в этой главе поделены на четыре темы, для которых представлены различия между всеми версиями (начиная с версии 1.0 и кончая версией 4.0). Там, где авторы сочли нужным, в эту главу включена специальная техническая информация и советы, касающиеся предлагаемых процедур или нежелательных действий, зависящих от характера разрабатываемой вами прикладной программы.


Разные уровни совместимости программных средств могут быть предоставлены программисту. В большинстве случаев наиболее желательно иметь полную совместимость. Но поскольку обычно мы любим разрабатывать "блестящие" программы, мы часто используем "новейшие и улучшенные" функции, имеющиеся в нашей реализации операционной системы MS-DOS (какие-нибудь замысловатые функции экрана или прерывания специального назначения), забывая о последствиях их несовместимости с другими версиями. Выбор уровня совместимости часто представляет собой компромиссный вариант. В тех случаях, когда мы намереваемся достичь полной совместимости, нужно следовать предложенным ниже правилам.


1. Ни при каких обстоятельствах не следует пользоваться ни одной из команд прерываний (команды INT) семейства макропроцессоров 8086, за исключением тех, которые специально предназначены для выполнения прерываний в операционной системе MS-DOS.


2. Никогда не следует записывать данные в абсолютные адреса памяти, расположенные за пределами вашей программы. Предоставьте операционной системе MS-DOS самой управлять процессом использования памяти.


3. Никогда не следует пользоваться командами INT и OUT семейства микропроцессоров 8086.


4. Следует избегать использования таких команд, выполняемых только микропроцессорами моделей 80188, 80186, 80286 и 80386, как:


        PUSH   непосредственное (непосредственное проталкивание)
        PUSHA  (проталкивание  всех  регистров)
        POPA   (выталкивание всех регистров)
        SHR>1  (сдвиг вправо при непосредственном значении боль-
      шем 1)
        SHL>1  (сдвиг влево при непосредственном  значении большем
      1)
        IMUL   регистр назначения,  источник, непосредственное зна-
      чение (умножение непосредственное целого значения со
      знаком)
        INS    исходная строка, порт (в строку)
        OUTS   порт, строка назначения (из строки)
        ENTER  (процедура ввода)
        LEAVE  (процедура выхода)
        BOUND  (обнаружение значений,  выходящих за пределы диапа-
      зона)

Следует избегать использования команды POP CS, поскольку она работает правильно только в микропроцессорах моделей 8088 и 8086. Вам следует также знать о существовании всех других различий в работе разных процессоров семейства 8086.


Следует избегать использования всех команд микропро- цессоров 80286/80386:


LGDT,LIDT, и LLDT (загрузка таблицы дескрипторов)
INSB (ввод через порт,  работающий с байтами)
OUTSB (вывод строки в  порт,  работающий  с  байтами)
ARPL (настройка требуемого привилегированного уровня
      режим защиты)
CLTS (сброс  флага переключения задач - режим защиты)
LAR (загрузка прав доступа -  режим  защиты)
LMSW  (загрузка слова состояния машины - режим защиты)
LSL (загрузка границ сегмента - режим защиты)
LTR (загрузка регистра задачи - режим защиты)
SGDT, SIDT, и SLDT ( сохранение таблицы дескрипторов -
      режим защиты)
        SMSW (сохранение слова состояния машины - режим защиты)
        STR (сохранение  регистра  задачи  - режим защиты) VERR и
        VERW (проверка считывания или записи - режим
      защиты)

Следует избегать использования команд, работающих только в микропроцессоре 80386:


        MOV специальные регистры (перейти к/от специальных регис-
   тров)
        MOVSX   (переход с расширением на знак)
        MOVZX   (переход с расширением на нуль)
        OUTSW (вывод строки в порт,  работающий со словами)
        BSF и BSR (сканирование битов)
        BT,  BTC,  BTR,  и BTS (проверки битов)
        CWDE (преобразование слова в расширенное двойное)
        INSW (ввод из порта,  работающего со словами)
        LFS, LGS, и LSS (загрузка заднего указателя)
        POPAD (выталкивание всего содержимого в 32-битовые
       регистры)
        POPFD (выталкивание флага в 32-битовый регистр флагов)
        PUSHAD (проталкивание  всех  32-битовых регистров)
        PUSHFD (проталкивание 32-битового регистра флагов)
        SET  условие (установка  по  условию)
        SHLD  и SHRD (сдвиг с удвоенной точностью)

5. Если вычислительная машина, которую вы используете для разработки своей программы, имеет хранящиеся в памяти ПЗУ рутины, никогда не обращайтесь к ним. Даже не пытайтесь их считывать.


6. Для обеспечения полной совместимости никогда не пользуйтесь системным вызовом функций, поддерживаемым версиями операционной системы MS-DOS только старше версии 1.0. Но поскольку более ранние версии операционной системы MS-DOS, чем версия 2.0 уже не поддерживаются программным обеспечением фирм "Майкрософт" и "ИБМ", задание версии 2.0, как минимально-допустимой, предоставит вам больше гибкости и удобств.


7. Во время работы всегда убеждайтесь в том, что информация, выведенная на экран, состоит только из стандартных символов ASCII* (шестнадцатиричные значения от 00 до 7F). Избегайте использования любых других символов, таких, например, которые содержатся в расширенном наборе символов для персональных компьютеров фирмы "ИБМ" и совместимых с ними.


Если во время работы вы понимаете, что вынуждены нарушить одно из первых правил памяти, вы можете нарушить и шестое правило, т.к. первым вашим действием будет написание драйвера устройства, предназначенного для работы с какой-то машиной, которая в противном случае окажется несовместимой. И поскольку устанавливаемые драйверы устройств поддерживаются только версиями операционной системы MS-DOS, начиная с 2.0 и выше, вам придется использовать обращение к функциям, не поддерживаемыми операционной системой MS-DOS версий 1.0 и 1.1. Если вам необходимо (или если вы хотите) нарушить правило 7, напишите драйвер устройства для нужной машины или "универсальную" программу установки, которая могла бы использоваться для настройки прикладной программы на работу с различными терминалами и мониторами. Программа установки, конечно, должна следовать хотя бы правилу 7.


Поскольку одним из решений вопроса о несовместимости может быть написание драйвера устройства, мы обнаруживаем, что уже нарушаем правило 6, которое предлагает понятие другого уровня совместимости, тоже требующего рассмотрения. Во многих случаях вам захочется нарушать правило 6 намеренно, потому что не все версии операционной системы MS-DOS предоставляют возможность пользоваться именно теми обращениями к функциям, которые вы хотите или которые вам нужно использовать. Например, если ваша прикладная программа широко пользуется каталогами, имеющими структуру деревьев, вероятно вы захотите пользоваться вызовами функций, имеющими номера с 39 по 3B. В этом случае уровень совместимости будет ограничиваться возможностями версий 2.0 и выше операционной системы MS-DOS и будет исключать возможность использования версий 1.0 и 1.1. Аналогичным образом, если ваша программа должна использовать сетевые функции, поддерживаемые операционной системой MS-DOS версии 3.1, эта программа не будет совместима с версиями операционной системы MS-DOS, начиная с 1.0 по 2.1.


Никогда не забывайте четко указывать ограничения по совместимости для вашей программы либо в исходном коде программы, либо в документации на нее (желательно в обоих местах). Если ваша программа предназначается для коммерческой реализации, убедитесь, что ограничения по совместимости (или отсутствие таких ограничений) явно указны как в программном пакете, так и в рекламных брошюрах.


Если вы разрабатываете программу, предназначенную работать под любой такой версией операционной системы MS-DOS, которая содержит некоторые стандартные программы, которые могут дополнительно выполняться при использовании конкретных версий операционной системы MS-DOS, следует применять функцию 30h (получить номер версии DOS) для контроля за тем выполняются или нет эти определенные стандартные программы. Несмотря на то, что эта функция обеспечивается только версиями 2.0 и выше операционной системы MS-DOS, она может безболезненно выполняться и под версиями 1.0 и 1.1 до тех пор, пока будут соблюдаться предупредительные шаги, описанные в разделе "Вызов DOS-функций" вашего руководства по операционной системе MS-DOS.


Для исполнения этой функции следует загрузить значение 30h в регистр АH. При выполнении прерывания "int 21h" основной номер версии операционной системы помещается в регистр AL, а номер модификации основной версии операционной системы помещается в регистр AH. Если регистр АL содержит 00, вы можете предположить, что вы работаете с операционной системой MS-DOS, версий 1.0 или 1.1. Любое другое число в регистре AL явно указывает номер используемой версии.


Если например, вы используете операционную систему MS-DOS версии 2.00 в регистре Al будет содержаться число 02, а в регистре An будет содержаться число 00. Если вы используете операционную систему MS-DOS версии 3.10, в регистре AL будет содержаться число 03, а в регистре An будет содержаться число 10. Даже тогда, когда вы не должны контролировать выполнение некоторых стандартных программ, эта функция позволяет вам управлять отображением на экране дисплея "дружественного" сообщения, когда пользователь пытается запустить программу под несовместимой версией операционной системы MS-DOS. Программа, представленная листингом 13-1, может использоваться в вашей программе для выполнения этой функции.


    Листинг  13-1. Стандартная программа по определению вер-
        сии операционной системы MS-DOS
----------------------------------------------------------------
;     Стандартная  программа по определению версии операцион-
;  ной системы MS-DOS), под управлением  которой  запускается
;  программа, содержащая эту стандартную программу.
;
;      Примечание:  Убедитесь, что перечисленные ниже команды
;  заданы либо в сегменте данных, либо в области данных  сег-
;  мента кодов в вашей программе.
;
;     majver  db ?  ; основной номер версии операционной
; ; системы (в шестнадцатеричном  виде)
;     minver  db ?  ; номер модификации основной версии
; ; операционной системы (в шестнадцатирич-
  ; ном виде)

     getdosver     proc   near   ; если нужно, изменить версию
;
push   ax; сохранение регистров
push   bx
push   cx
     ;
mov    ah,30h     ; подготовить номер функции
int    21h        ; выполнить вызов функции MS-DOS
     ;
cmp    al,0       ; проверить, используется ли версия
; до 2.0
jnz    dos2plus   ; если нет, значит используется
; версия 2.00 или выше
mov    al,1       ; основной  является версия 1.00
mov    ah,0       ; (поскольку мы знаем,  что  ре-
; гистр  AH, по-прежнему, сожер-
; жит номер функции (30h), мы не
; сможем выяснить номера модифи-
; кации основной версии операци-
; онной  системы.   Поэтому   мы
; предполагаем  наихудший случай
; - версия 1.00)
;
     dos2plus:
mov majver,al     ; сохранение основного номера
; версии операционной системы
mov minver,ah     ; сохранение номера модификации
; основной версии операционной
; системы
     ;
pop    cx; восcтановление регистров
pop    bx
pop    ax
     ;
ret      ; возврат
     ;
     getdosver endp
----------------------------------------------------------------

В представленной выше стандартной подпрограмме вы можете производить несколько операций над номером версии, хранящимся в двух переменных: majver и minver. Каждый номер может быть превращен в десятичное значение кода ASCII для вывода его на экран вместе с каким-нибудь сообщением, или вы можете использовать эти переменные для контроля за выполнением определенных частей программы.


НАЗАД СОДЕРЖАНИЕ ВПЕРЁД

Hosted by uCoz