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










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

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

Дополнительные соображения по переключению стеков

При переключении стеков, или, наоборот, при манипуляции стековым сегментом программа уязвима для прерываний. При изменении стекового сегмента, но не указателя стека, или, когда возникает авария, должно бы произойти прерывание. В семействе микропроцессоров 8086 это предотвращается путем изменения указателя стека сразу же после инструкции, которая загружает стековый сегмент. Когда один из процессоров семейства микропроцессоров 8086 загружает регистр сегмента (с помощью инструкции MOV или инструкции POP), прерывание задерживается до тех пор, пока не будет выполнена следующая инструкция. Эта особенность позволяет благополучно обновлять регистр стекового сегмента и регистр указателя стека. Это также объясняет то, почему отладчик DEBUG пропускает одну инструкцию при отслеживании инструкции MOV для регистра сегмента. Отладчик DEBUG выполняет программу в пошаговом режиме благодаря установке флажка прерывания, который генерирует прерывание #1, следующее после большинства инструкций. Т.к. при выполнении инструкции, следующей за инструкцией переслать (MOV) в регистр сегмента, прерывания запрещаются, то отладчик DEBUG не получает управление до тех пор, пока не выполнит две инструкции, следующие за инструкцией MOV.


В некоторых случаях не всегда нужно обращаться к длинному переходу при переключении стеков, демонстрируемому в листинге 3-11. Некоторые регистры могут помещаться в стек вызывающей программы много раз, позволяя регистрам использоваться в программе или, по крайней мере, передавать новые значения в регистр стека. Конкретный программист должен сам решать вопрос о том, как много текущего контекста сохранять в отдельной программе.


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


Если параметры передаются из одной программы в другую и каждая программа поддерживает свой собственный стек, то для доступа к параметрам в стеке нельзя использовать регистр BP. Вместо этого программисту необходимо извлечь значение стекового сегмента вызывающей программы и переслать его в любой из регистров сегмента DS или ES и выполнять доступ к памяти относительно этого регистра. Параметры затем можно прочитать из стека вызывающей программы, даже если вызываемая программа использует свой собственный стек.


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

Hosted by uCoz