Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.orgfree.com

emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.


Учебные модели компьютера



Модели (software):

"Е14" (parallel !!!)
"S9PU" (parallel)

Модели (hardware):






Награды сайта
Награды сайта 2005

Как работает команда MARK микропроцессора К1801

Публикуемая в "ИНФО" серия статей Ю.Зальцмана по ассемблеру "БК-0010" является хорошим пособием для работников нашего образования, которые чаще всего не имеют специальной подготовки в этой области. Учитывая, что поставляемая с классами КУВТ документация обычно обходит стороной "всем известные" подробности работы процессора, материалы статей являются одновременно и доступным для рядового учителя справочником по системе инструкций процессора К1801. Поэтому досадно, что в такой нужной и квалифицированной статье содержится ошибочное описание одной из машинных операций: речь идет о команде MARK. Эта команда, действительно, "применяется крайне редко" и в популярной литературе "нигде не описана достаточно понятно" [1]. Но в то же время она "входит составной частью в стандартное соглашение ЭВМ PDP-11 о возврате из подпрограммы" и заметно "облегчает выполнение очистки стека при выходе из подпрограммы" [2]. Так что рассматривать команду MARK все-таки стоит, но делать это надо внимательно и не спеша.

В [1] при изучении инструкции MARK обсуждается стандартный вариант ее применения (почти в том же виде он дается в [2]), поэтому приводимый ассемблерный фрагмент безусловно правилен и будет работать. К сожалению, описание к нему не всегда соответствует действительности, а выполнение рекомендаций статьи по использованию команды MARK может вызвать непредсказуемые последствия при работе программы.

Как же реализуется команда MARK?

Рассмотрение будем вести на основе приведенного в [1] примера. Для удобства читателей воспроизведем его с незначительными изменениями обозначений и комментариев.

;ПОДГОТОВИТЕЛЬНЫЕ ОПЕРАЦИИ
                        ;  Записать в стек:
       MOV   R5, -(SP)  ;текущее значение R5,
       MOV  #101, -(SP) ;параметры
       MOV  #102, -(SP) ;для подпрограммы
       MOV  #103, -(SP) ;SBR,
       MOV  #6403,-(SP) ;код команды MARK 3.
       MOV   SP, R5     ;Адрес команды MARK занести в R5
                        ;для обеспечения перехода к ней.
;ВЫЗОВ ПОДПРОГРАММЫ
       JSR PC, SBR
       ;...........      Текст дальнейшей
       ;...........      программы.

;ПОДПРОГРАММА SBR
 SBR:  ;...........      Текст
       ;...........      подпрограммы.
       RTS R5           ;Выход из SBR на команду MARK.

Предположим, что начальное значение указателя стека SP0 (см. рис.1) уже определено. Прежде чем использовать команду MARK, необходимо провести некоторые подготовительные операции: запомнить в стеке значение регистра R5 (этот РОН аппаратно использует команда MARK); занести в стек параметры для подпрограммы SBR и метку конца для случая трех параметров MARK 3; текущее положение SP (оно совпадает с адресом команды MARK и на рис.1 обозначено PCM) скопировать в R5.

Рис.1

Теперь из основной программы следует вызов подпрограммы SBR (см. рис.2). При этом текущее содержимое PC, т.е. адрес следующей за JSR PC команды, автоматически попадет в стек. Указатель принимает значение SP1 (рис.1).

Рис.2

Выполнение подпрограммы завершается командой RTS R5, (а не RTS PC!), по которой процессор переписывает R5 в R7, а затем в R5 заносит из стека очередное значение. В рассматриваемом примере в PC попадет подготовленный заранее в R5 адрес команды MARK, а в R5 - адрес возврата из подпрограммы. Новое положение указателя стека на рис.1 обозначено SP2.

Теперь выполняется команда MARK 3, расположенная в стеке (не забывайте заглядывать на рис.2). Это происходит следующим образом.

  1. Вычисляется новое значение указателя стека SP3 по формуле (PCM+2)+2*N , где PCM+2 - текущее содержимое PC после выборки команды MARK, N - число параметров для подпрограммы. В результате стек освобождается от параметров, и его указатель перемещается на исходное значение R5 (рис.1). Обратите внимание на то, что величина SP3 вычисляется не через R6, а через программный счетчик R7. Из этого следует, что команда-метка MARK ВСЕГДА должна быть расположена именно В СТЕКЕ, а не внутри программы!
  2. Содержимое R5 (в нашем случае адрес возврата) помещается в регистр PC.
  3. В R5 выталкивается из стека первоначальное значение этого РОНа, указатель возвращается в исходное положение SP0.

Итак, в 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).




Л И Т Е Р А Т У Р А
  1. Зальцман Ю. Ассемблер БК. Информатика и образование. 1991. N2. с.60-61.
  2. Лин В. PDP-11 - VAX-11. Архитектура ЭВМ и программирование на языке ассемблера. М.: Радио и связь. 1989. 320 с.


© Е.А.Еремин, 1991
Статья:
Еремин Е.А. Как работает команда MARK. Информатика и образование, 1991, N6, с.75-76.


Автор сайта - Евгений Александрович Еремин (Пермский государственный педагогический университет). e_eremin@yahoo.com


Free Web Hosting