Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.
|
Как работает команда MARK микропроцессора К1801Публикуемая в "ИНФО" серия статей Ю.Зальцмана по ассемблеру "БК-0010" является хорошим пособием для работников нашего образования, которые чаще всего не имеют специальной подготовки в этой области. Учитывая, что поставляемая с классами КУВТ документация обычно обходит стороной "всем известные" подробности работы процессора, материалы статей являются одновременно и доступным для рядового учителя справочником по системе инструкций процессора К1801. Поэтому досадно, что в такой нужной и квалифицированной статье содержится ошибочное описание одной из машинных операций: речь идет о команде MARK. Эта команда, действительно, "применяется крайне редко" и в популярной литературе "нигде не описана достаточно понятно" [1]. Но в то же время она "входит составной частью в стандартное соглашение ЭВМ PDP-11 о возврате из подпрограммы" и заметно "облегчает выполнение очистки стека при выходе из подпрограммы" [2]. Так что рассматривать команду MARK все-таки стоит, но делать это надо внимательно и не спеша. В [1] при изучении инструкции MARK обсуждается стандартный вариант ее применения (почти в том же виде он дается в [2]), поэтому приводимый ассемблерный фрагмент безусловно правилен и будет работать. К сожалению, описание к нему не всегда соответствует действительности, а выполнение рекомендаций статьи по использованию команды MARK может вызвать непредсказуемые последствия при работе программы. Как же реализуется команда MARK? Рассмотрение будем вести на основе приведенного в [1] примера. Для удобства читателей воспроизведем его с незначительными изменениями обозначений и комментариев.
Предположим, что начальное значение указателя стека SP0 (см. рис.1) уже определено. Прежде чем использовать команду MARK, необходимо провести некоторые подготовительные операции: запомнить в стеке значение регистра R5 (этот РОН аппаратно использует команда MARK); занести в стек параметры для подпрограммы SBR и метку конца для случая трех параметров MARK 3; текущее положение SP (оно совпадает с адресом команды MARK и на рис.1 обозначено PCM) скопировать в R5. Теперь из основной программы следует вызов подпрограммы SBR (см. рис.2). При этом текущее содержимое PC, т.е. адрес следующей за JSR PC команды, автоматически попадет в стек. Указатель принимает значение SP1 (рис.1). Выполнение подпрограммы завершается командой RTS R5, (а не RTS PC!), по которой процессор переписывает R5 в R7, а затем в R5 заносит из стека очередное значение. В рассматриваемом примере в PC попадет подготовленный заранее в R5 адрес команды MARK, а в R5 - адрес возврата из подпрограммы. Новое положение указателя стека на рис.1 обозначено SP2. Теперь выполняется команда MARK 3, расположенная в стеке (не забывайте заглядывать на рис.2). Это происходит следующим образом.
Итак, в PC находится адрес следующей за обращением подпрограмме команды, SP и R5 восстановлены. Возврат из подпрограммы завершен, стек очищен, и продолжается выполнение основной программы (рис.2). Обратим внимание читателя на то, что описанные в п.п.2 и 3 действия эквивалентны опрерации RTS R5, поэтому команду MARK можно рассматривать как сочетание своеобразной подстройки указателя стека (п.1) и RTS R5. Таким образом, описание команды MARK в [1] содержит две существенные неточности, которые в случае применения рекомендаций статьи приведут к потере управления программой. Во-первых, в [1] ошибочно утверждается, что регистр "под буфер адреса возврата" ВЫБИРАЕТСЯ ПРОИЗВОЛЬНО, в то время как процессор аппаратно может использовать для этой цели ТОЛЬКО R5. Если все же попытаться применить для хранения адреса другой РОН, на втором этапе команды MARK произойдет передача управления по неподготовленному для этого содержимому R5. Во-вторых, ни в коем случае нельзя "просто записать в тексте программы MARK X", как рекомендуется в [1]. Последствия этой ошибки будут еще более тяжелыми: помимо перехода по неопределенному адресу из R5, на первом этапе работы команды MARK указатель стека будет установлен на программу (см. формулу для SP3 на рис.1).
© Е.А.Еремин, 1991 Статья: Еремин Е.А. Как работает команда MARK. Информатика и образование, 1991, N6, с.75-76. |