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










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

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

Важное предупреждение

Механизм функции загрузки и выполнения программ в версии 2.0 MS-DOS имеет серьезный технический недостаток. При выполнении функции "захламляются" все регистры сегментов (за исключением кодового сегмента), разрушается указатель стека и разрушается большинство общих регистров. Если эта функция используется с любой подверсией MS-DOS версии 2.0 (т.е. 2.00 или 2.10), то перед вызовом функции необходимо сохранять в памяти указатель стека и любые общие регистры, необходимые для дальнейшего использования; и восстанавливать из памяти регистры сегментов, указатель стека и необходимые общие регистры после выполнения функции. Пример последовательности программных кодов, предназначенный для выполнения этих действий для программного файла типа .COM, показан в листинге 3-9.


Для программных файлов типа .EXE можно восстановить надлежащие значения сегмента из значений, установленных компоновщиком LINK (например, mov ss,stack), или из памяти, размещаемой внутри программного сегмента. Для защиты стека необходимо помнить о том, что последовательность восстановления стекового сегмента и указателя стека должна быть такой, что сначала указывается указатель стека, а затем стековый сегмент.


Начиная с версии MS-DOS 3.0, этот недостаток устранен. Функция загрузки и выполнения программы возвращает все регистры "нетронутыми".



         Листинг 3-9. Восстановление необходимых элементов при выполнении
                      функции загрузки и выполнения программы для прог-
                      раммного файла типа .COM в MS-DOS версии 2.XX
        -----------------------------------------------------------------
             ...
             <установка параметров вызывающей программой>
             ...
             mov    spoint,sp   ; сохранение указателя стека в памяти
             mov    ax,4B00h    ; функция загрузки и выполнения пр-мы
             int    21h         ; вызов MS-DOS
         ; регистры не изменятся, если произойдет сбой при загрузке --
         ; восстановление не выполнять
             jc     error       ; переход при ошибке
             mov    ax,cs       ; получение общего сегмента
             mov    ds,cx       ; для сегмента данных
             mov    es,cx       ; для внешнего сегмента
             mov    ss,ax       ; и для стекового сегмента
             mov    sp,spoint   ; стек теперь повторно выровнен
             ...
             <восстановление общих регистров>
             ...
         ----------------------------------------------------------------

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

Hosted by uCoz