|
|
|
|
Важное предупреждение
Механизм функции загрузки и выполнения программ в версии 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 ; стек теперь повторно выровнен
...
<восстановление общих регистров>
...
----------------------------------------------------------------
|
|
|