|
Сопрограмма, использующая эту
структуру, должна осуществлять выход только через функцию с ко-
дом 4Ch "Завершить программу" так, чтобы MS-DOS смогла правильно
завершить программу, независимо от состояния стека.
Если параметры передаются из одной программы в другую и каж-
дая программа поддерживает свой собственный стек, то для доступа
к параметрам в стеке нельзя использовать регистр BP. Вместо это-
го программисту необходимо извлечь значение стекового сегмента
вызывающей программы и переслать его в любой из регистров сег-
- 3-60 -
мента DS или ES и выполнять доступ к памяти относительно этого
регистра. |
asplinux |
|
|
Параметры затем можно прочитать из стека вызывающей
программы, даже если вызываемая программа использует свой собс-
твенный стек.
Введение в резидентную часть оперативной памяти
В некоторых случаях MS-DOS сама реализуется как резидентная
программа. Взгляните снова на рис.3-15, и Вы увидите схему памя-
ти для типичной MS-DOS версии 2.0 или выше. |
panda antivirus |
|
|
(Заметим, что это
исполнение необязательно применять для версий MS-DOS, выше чем
версия 3.1). Все части MS-DOS, за исключением нерезидентной час-
ти файла COMMAND.COM, располагаются в оперативной памяти все
время. |
резервное копирование |
|
|
norton, winrar, ad aware, asplinux, перевод с русского на английский, .
asplinux
|
При изменении
стекового сегмента, но не указателя стека, или, когда возникает
авария, должно бы произойти прерывание. В семействе микропроцес-
соров 8086 это предотвращается путем изменения указателя стека
сразу же после инструкции, которая загружает стековый сегмент.
Когда один из процессоров семейства микропроцессоров 8086 загру-
жает регистр сегмента (с помощью инструкции MOV или инструкции
POP), прерывание задерживается до тех пор, пока не будет выпол-
нена следующая инструкция. Эта особенность позволяет благополуч-
но обновлять регистр стекового сегмента и регистр указателя сте-
ка. Это также объясняет то, почему отладчик DEBUG пропускает
одну инструкцию при отслеживании инструкции MOV для регистра
сегмента. Отладчик DEBUG выполняет программу в пошаговом режиме
благодаря установке флажка прерывания, который генерирует преры-
вание #1, следующее после большинства инструкций. Т.к. при вы-
полнении инструкции, следующей за инструкцией переслать (MOV) в
регистр сегмента, прерывания запрещаются, то отладчик DEBUG не
получает управление до тех пор, пока не выполнит две инструкции,
следующие за инструкцией MOV.
В некоторых случаях не всегда нужно обращаться к длинному
переходу при переключении стеков, демонстрируемому в листинге
3-11. Некоторые регистры могут помещаться в стек вызывающей
программы много раз, позволяя регистрам использоваться в прог-
рамме или, по крайней мере, передавать новые значения в регистр
стека. Конкретный программист должен сам решать вопрос о том,
как много текущего контекста сохранять в отдельной программе.
Если переключение контекста используется с сопрограммами, то
каждая подпрограмма заканчивается сохранением контекста другой
подпрограммы. Хотя это и излишне, потому что только одной под-
программе необходимо сохранять контекст другой подпрограммы, но
в действительности не вредно.
|
|
|