Автоматизация

Вид материалаДокументы

Содержание


Addm: mov (r1)+,r2
Return pc
Таблица адресов аргументов, Рис. 5.9
Half: inc r5
Half: mov (r5)+,ro
Subroutine prnt(k,l,m)
Psect a .psect а
Psect a, ovr .psect a, ovr
Macro push а, в, с
Push #44, (r0)+, label
Macro cl, ad
Регистры внешних устройств
Программное управление внешними устройствами
Wait: tstb @# 177554
Text: .ascii
Start: mov #5,r0
Управление внешними устройствами в режиме прерываний.
Buffer: .blkb 80.
Buffer: .blkb 80.
Е: .ascii/e/
...
Полное содержание
Подобный материал:
1   ...   10   11   12   13   14   15   16   17   ...   25
§ 5.5. СТЕКИ И ПОДПРОГРАММЫ


Стек

Стеком называют область оперативной памяти, в которой ор­ганизуется временное хранение некоторых элементов информации. Отличительной особенностью стека является своеобразный поря­док обслуживания содержащихся в нём элементов: в любой момент времени доступен только верхний элемент, т. е. элемент, загружен­ный в область стека последним. Выгрузка из стека верхнего эле­мента делает доступным следующий элемент.

Элементами стека могут быть любые данные: числа, коды символов, адреса ячеек или регистров и др. В зависимости от характера информации, хранящейся в стеке, он может состоять из слов или байтов. Элементы стека располагаются в области памяти, отведенной под стек, начиная со дна стека по последова­тельно уменьшающимся адресам.Адрес верхнего, доступного элемента хранится в одном из общих регистров, чаще всего в аппа­ратном указателе стека R6 (другое обозначение этого регистра - SP). Аппаратный стек широко используется операционной системой в некоторых типичных ситуациях: переход на подпрограмму, обработка прерывания, выполнение системных макрокоманд и т. д. Удобно пользоваться им и в прикладных программах. Исходное состояние аппаратного указателя стека задает операционная сис­тема, загружая в SP установленный адрес дна стека, например 10008.

Загрузка стека (проталкивание в стек) осуществляется коман­дой

MOV op, -(SP)

Здесь ор — операнд с любым способом адресации. Выполнение команды пересылки с автодекрементной адресацией через указа­тель стека приводит сначала к его смещению на одно слово вверх, а затем к засылке операнда-источника по установленному адресу. Вторичное выполнение аналогичной команды смещает SP еще на одно слово вверх и заносит по этому адресу следующий операнд. Таким образом, в SP всегда находится адрес последнего введен­ного элемента.

Выгрузка из стека (выталкивание) осуществляется командой

MOV (SP) + , ор

Операнд из ячейки, адрес которой содержится в SP, пересылается по адресу операнда-приемника, а затем SP смещается на одно слово вниз, автоматически указывая на следующий элемент стека. Заметим, что при выгрузке из стека операнд физически не уничто­жается, а остается в памяти. В принципе, к нему можно обратиться повторно, если соответствующим образом установить указатель стека.

Стек используется операционной системой для временного хра­нения адресов и других параметров взаимодействующих программ. Например, при переходе из основной программы в подпрограмму в стеке автоматически запоминается адрес возврата. Это дает возможность организовывать вложенные подпрограммы с несколь­кими уровнями вложенности — по мере перехода от подпрограммы к подпрограмме в стеке последовательно запоминаются адреса возврата, так что в любой момент верхний элемент стека содержит адрес возврата в «предыдущую» подпрограмму. Такая же процедура характерна для системы прерываний.

В прикладных программах с помощью стека можно в начале некоторого фрагмента программы сохранить содержимое опреде­ленных ячеек или регистров (с целью загрузки их новым содержи­мым), а в конце данного фрагмента — восстановить прежнее со­держимое. Такая ситуация возникает, например, при переходе на подпрограмму, если и основная программа и подпрограмма ис­пользуют для вычислений одни и те же ячейки или регистры.

Задача 5.14 Сохранить содержимое регистров R0,R1 и R2 при входе в подпрограмму и восстановить прежнее содержимое при выходе из неё


MOV RO,- (SP) ; первая строка подпрограммы

MOV R1,-(SP)

MOV R2,- (SP)

MOV (SP) + , R2 ;текст подпрограммы, в которой могут . . . ; спользоваться регистры R0,R1 и R2

MOV (SP)+, Rl

MOV (SP)+, RO

;переход на основную программу

Подпрограммы

В алгоритмах задач, программируемых на АССЕМБЛЕРе, точно так же, как и в задачах, программируемых на языках вы­сокого уровня, встречаются типовые участки, которые требуется выполнять несколько раз по ходу программы. Такой повторяющий­ся участок целесообразно выделить из общей программы, оформить в виде подпрограммы и обращаться к нему каждый раз, когда в основной программе появится необходимость его выполнения. Подпрограмма может быть органической частью общей программы и не существовать вне ее, однако наиболее типичные для данного круга задач вычисления целесообразно запрограммировать и от­ладить отдельно и записать в оттранслированном виде в библиотеку подпрограмм. Это дает возможность обращаться к этим подпро­граммам из любых программ пользователя.

Подпрограммы, в зависимости от выполняемых ими функций, могут требовать передачи из вызывающей программы определен­ных исходных данных (их называют аргументами или .параметра­ми подпрограммы), возвращать в вызывающую программу резуль­таты вычислений или обходиться и без того, и без другого.

В качестве примера программ, работающих без аргументов, можно привести подпрограммы перевода строки на терминале или АЦПУ, вывода некоторого символа или стандартного текста («вы­числения закончены», «вводите исходные данные» и т. д.). Пример подпрограммы, требующей получения аргументов из вызывающей программы,— подпрограмма печати произвольного текста. В ка­честве аргументов здесь выступает адрес буфера с текстом и, возможно, количество символов в тексте. Наконец, подпрограммой, требующей «двухсторонней» передачи аргументов, является под­программа поиска максимального элемента в некотором массиве. Входным аргументом здесь может быть адрес массива, выходным — номер максимального элемента либо его значение.

Для перехода на подпрограмму существует специальная коман­да JSR (jump to subroutine — переход на подпрограмму), имеющая следующий формат:

JSR Rn, SUB


Здесь Rn — так называемый регистр связи, в качестве которого можно использовать любой из РОН, кроме R6; SUB — входная метка подпрограммы.

Для возвращения из подпрограммы в основную программу используется команда RTS (return from subroutine — возврат из подпрограммы) со следующим форматом:


RTS Rn

Здесь Rn — тот же регистр связи, который фигурировал в ко­манде JSR.

Рассмотрим процедуру вызова подпрограммы в простейшем случае, когда не требуется передачи аргументов.

Пусть в основной программе встретилась строка

JSR R5, SUB

Эта команда приведет к выполнению трех последовательных опе­раций, смысл которых можно описать с помощью трех команд АССЕМБЛЕРа:

1) MOV R5, —(SP)

Содержимое R5 проталкивается в стек. В дальнейшем регистр R5 будет использован для хранения адреса возврата в основную программу; упрятывание в стек его исходного содержимого позво­ляет сохранить его до выхода из подпрограммы.

2) MOV PC, R5

Содержимое счетчика команд, т. е. адрес команды, следующей за командой JSR, передается в R5. Таким образом, в R5 теперь находится адрес возврата, т. е. адрес команды основной программы, которую надо выполнить после возврата из подпрограммы.

3) MOV #SUB, RC

Значение входной метки подпрограммы, т. е. адрес ее первой выполнимой строки, заносится в счетчик команд, чем и обеспе­чивается переход на подпрограмму.

Последней строкой подпрограммы должна быть команда RTS R5, которая выполняет две следующие операции:

1) MOV R5, PC

Содержимое R5, т. е. адрес возврата, загружается в счетчик команд.

2) MOV (SP)+, R5

Из стека выталкивается в R5 его исходное содержимое. В ре­зультате основная программа продолжается с той строки, на ко­торой она приостановилась на время выполнения подпрограммы.

Легко видеть, что описанная процедура позволяет иметь вло­женные подпрограммы с неограниченной глубиной вложения. Команда JSR R5, SUB1, встретившаяся в подпрограмме SUB, проталкивает содержимое R5 в стек, загружает в R5 новый адрес возврата из PC и передает управление на метку SUB1. Команда RTS R5, которой оканчивается вложенная подпрограмма SUB1, загружает из R5 в PC адрес возврата в подпрограмму SUB и восстанавливает прежнее содержимое R5, в котором теперь опять находится адрес возврата в основную программу.

Рассмотрим теперь возможности передачи аргументов в под­программу и получения из нее результата. Распространенным спо­собом связи основной программы с подпрограммой является раз­мещение аргументов либо их адресов в тексте основной программы непосредственно за командой JSR. Рассмотрим в качестве простого примера подпрограмму, осуществляющую сложение двух чисел. Фрагмент основной программы, содержащей обращение к под­программе, будет выглядеть следующим образом:

JSR R5, SUM ; вызов подпрограм-

; мы

A: .WORD 0 ; поле первого аргумента

А2: .WORD 0 ;поле второго аргумента

К моменту обращения к подпрограмме слова с метками А1 и А2 должны быть уже заполнены значениями аргументов. После вызова подпрограммы в регистре связи R5 находится адрес слова с меткой А1, только в данном случае это не адрес возврата, а адрес первого аргумента.

Текст подпрограммы будет выглядеть следующим образом:


SUM: MOV(R5)+, Rl ;в Rl — первый аргумент

;в R5 — адрес второго

;аргумента

ADD(R5)+, Rl ;в Rl—искомая сумма

;в R5 — адрес следу-

;ющей команды

;т. е. адрес возврата

;возврат в основную про-

;грамму


Результат вычислений находиться в R1 и может быть получен в процессе дальнейшей работы основной программы.

Иногда удобнее размещать после команды не сами аргументы, а их адреса.

Пусть в предыдущем примере аргументы расположены в поле данных основной прогроаммы в словах B1 и B2. Строки вызова подпрограммы и текст самой подпрограммы будут выглядеть следующим образом:


JSR R5, SUM

.WORD Bl

.WORD B2

.

.

.

SUM: MOV @(R5)+,R1

ADD @(R5)+,R1

RTS R5

В случае большого количества аргументов (например, аргумен­тами являются элементы массива) можно передать в подпрограмму только начальный адрес списка аргументов так, как это было показано в предыдущем примере, либо поместив этот адрес в один из РОН. Пусть, например, в подпрограмме ADDM нужно сложить несколько элементов массива, адрес которого находится в R1. Тогда первые строки подпрограммы будут выглядеть следующим образом:


ADDM: MOV (R1)+,R2

ADD (R1)+,R2

ADD (R1)+,R2


В тех случаях, когда подпрограмма не требует аргументов или аргументы передаются через РОН, как это было показано в пре­дыдущем примере, регистр связи используется только для хранения адреса возврата. В этих случаях регистром связи может быть счет­чик команд PC:

JSR PC.SUB

.

.

.

SUB:

. подпрограмма

.

.

RETURN PC


При этом транслятор допускает более наглядные символические обозначения CALL и RETURN:

CALL SUB

.

.

.

SUB:

. подпрограмма

.

.

RETURN


Взаимодействие программ, написанных на разных языках про­граммирования. Программное обеспечение физического эксперимента обычно включает в себя управляющие программы и программы вычислительного характера. Первые пишутся на АССЕМБЛЕРе, вторые — на ФОРТРАНе. Часто эти программы связываются в еди­ный программный модуль, в котором одна программа — основная, а остальные выступают в качестве подпрограмм. В этом случае возникает задача связи программ, написанных на разных языках.

Рассмотрим сначала случай, когда основная программа написа­на на ФОРТРАНе, а подпрограмма — на АССЕМБЛЕРе. Для того чтобы организовать правильное взаимодействие этих программ, надо рассмотреть механизм вызова подпрограммы фортрановской программой.

Пусть в программе на ФОРТРАНе имеется оператор перехода на подпрограмму SUB с аргументами:

CALL SUB (ARG1, ARG2, .... ARGn)


В процессе обработки этой строки транслятор размещает в поле данных программы специальную таблицу с информацией об аргу­ментах" (рис. 5.8), в первом байте которой указывается количество аргументов данной подпрограммы, а остальные строки содержат адреса аргументов, расположенные в порядке указания аргументов в операторе CALL. Адрес таблицы загружается в регистр R5. Сам же оператор CALL преобразуется в команду АССЕМБЛЕРа


JSR PC, SUB


Таким образом, подпрограмма, написанная на АССЕМБЛЕРе, должна иметь входную метку SUB, а доступ к аргументам осу­ществляется через регистр R5 с использованием косвенной авто­инкрементной адресации.

Рассмотрим в качестве простого примера подпрограмму деления целого четного числа на 2. Пусть в фортрановской программе это число обозначено М. Тогда оператор вызова подпрограммы под названием HALF запишется следующим образом:

CALL HALF (M)


При трансляции этой строки построится таблица адресов аргу­ментов (рис. 5.9), адрес которой будет помещен в R5, а сам опе­ратор CALL преобразуется в строку


JSR PC, HALF




Рис 5.8 Таблица адресов аргументов, Рис. 5.9 Таблица адресов аргументов для

образуемая фортрановской программой. конкретного случая.


Передача в подпрограмму с помощью первого байта таблицы количества аргументов позволяет составлять более или менее универсальные подпрограммы, обрабатывающие произвольное коли­чество исходных данных. Применительно к рассматриваемому при­меру можно составить программу HALF таким образом, чтобы она находила половинные значения любого количества чисел, указанных в поле аргументов оператора CALL. Информацию о количестве ар­гументов в конкретном вызове подпрограмма извлекает из пер­вого байта таблицы. Если же подпрограмма рассчитана на об­работку фиксированного количества аргументов, этот байт (и все слово) подпрограммой не используются.

Текст подпрограммы для одного аргумента выглядит следую­щим образом:


HALF: INC R5

INC R5 ; смещение R5 к адресу аргумента

ASR @(R5)+ ; деление аргумента на 2

RTS PC


Задача 5.15. Написать подпрограмму нахождения половинного значения произвольного количества аргументов.

HALF: MOV (R5)+,RO

GO: ASR @ (R5) +

DEC RO

BNE GO

RTS PC

Рассмотрим теперь обратный случай, когда основная программа написана на АССЕМБЛЕРе, а подпрограмма — на ФОРТРАНе. Если программный модуль на ФОРТРАНе начинается оператором


SUBROUTINE SUB(ARGl,ARG2,...,ARGn)


то после трансляции этого модуля образуется программа, работаю­щая по правилам, изложенным выше: предполагается, что сущест­вует таблица с адресами аргументов и что в регистр R5 загру­жен ее адрес (см. рис. 5.8). Таким образом, в основной программе надо создать соответствующую таблицу и загрузить ее адрес в регистр R5 («настроить» регистр R5).

Рассмотрим в качестве примера программу на АССЕМБЛЕРе, обрабатывающую некоторые целые числа, и подпрограмму на ФОРТРАНе, выводящую эти числа на экран терминала (в АССЕМБЛЕРе СМ-4 нет простых средств вывода цифровой инфор­мации на внешние устройства).

Подпрограмма печати трех чисел имеет следующий вид:


SUBROUTINE PRNT(K,L,M)

PRINT 1,(K,L,M)

FORMAT (16)

RETURN

END


В основной программе необходимо создать таблицу адресов аргументов:

TARG: .WORD 3 ; количество аргу­ментов

.WORD A ; адрес первого аргу­мента

.WORD В ; адрес второго аргу­мента

.WORD С ; адрес третьего ар­гумента

Настройка регистра R5 и вызов подпрограммы реализуются следующими строками:


MOV #TARG, R5

JSR PC.PRNT


§ 5.6. НЕКОТОРЫЕ СПЕЦИАЛЬНЫЕ СРЕДСТВА АССЕМБЛЕРА


Секционирование программ

Любая программа, написанная на АССЕМБЛЕРе, состоит из одной или нескольких програмных секций. Каждая секция начинается директивой секционирования .PSECT, а заканчивается очередной директивой .PSECT, начинающей следующую секцию, или дирек­тивой .END. В поле директивы .PSECT могут стоять аргументы, первым из которых является имя секции, а следующие придают данной секции определенные характеристики.

С помощью аргументов директивы .PSECT можно Объявить секцию абсолютной или перемещаемой, глобальной или локаль­ной, последовательной или оверлейной, допускающей только чтение полей данных или также их модификацию и т. д. Все эти харак­теристики носят специальный характер и используются в основном при создании сложных программных комплексов.

Директива .PSECT позволяет управлять процессом выделения памяти подпрограмму на этапе ее компоновки. С помощью этой директивы, например, создаются общие блоки данных для несколь­ких программных модулей, выделяются области программы, пред­назначенные для коллективного использования, организуются поля данных, служащие для расширения адресного пространства про­граммы за пределы 32К слов и т. д.

В последующих главах даны примеры использования директивы .PSECT при написании системных и прикладных программ. В на­стоящем разделе описываются только основные свойства этой ди­рективы.

Рассмотрим действие атрибута OVR (оверлей, перекрытие), ко­торый позволяет накладывать одноименные секции разных про­граммных модулей друг на друга, создавая общие для нескольких программ области данных. Противоположное значение аргумента CON (конкатенация, сцепление), действующее по умолчанию, тоже объединяет одноименные секции в одну, но секции из разных мо­дулей не накладываются друг на друга, а входят в состав загру­зочного модуля последовательно, друг за другом. Рассмотрим ис­пользование атрибутов OVR/CON на примере.

Пусть в программных модулях Р1 и Р2 (рис. 5.10) имеются на­ряду с разноименными программными секциями PR1 и PR2 также секции данных с одинаковым именем А, объявленные последова­тельными с помощью атрибута CON, который можно не указывать, так как это значение атрибута действует по умолчанию:


; модуль Р1 ; модуль Р2

.PSECT A .PSECT А

X1: .BLKW 1000. Х2: .BLKW 1000.

.PSECT PR1 .PSECT PR2

; программные строки ; программные строки

; работы с данными ; работы с данными

; из массива XI ; из массива Х2

.END .END


Полученный в результате компоновки загрузочный модуль включает две секции А. Первая секция А начинается с метки XI. С данными из этой секции работает программа, расположенная в секции PR1. Вторая секция А начинается с метки Х2. Данные этой секции относятся к программному модулю Р2 и программной секции PR2. Таким образом, одинаковые имена у последователь­ных секций влияют фактически только на порядок их расположения в загрузочном модуле (например, компоновщик ОС РВ распола­гает секции в алфавитном порядке их имен). Сами секции оста­ются независимыми.

Пусть теперь те же секции объявлены оверлейными с помощью атрибута OVR (рис. 5.11):

; модуль Р1 ; модуль Р2

.PSECT A, OVR .PSECT A, OVR

XI: .BLKW 1000. Х2: .BLKW 1000.

.PSECT PR1 .PSECT PR2

; программные стро ; программные стро-

; ки ; ки

; работы с данными ; работы с данными

; из массива X1 ; из массива Х2

.END .END

Секции А из модулей Р1 и Р2 наложились друг на друга, так что метки XI и Х2 относятся фактически к одному массиву данных. Обе программные секции PR1 и PR2 работают с одними и теми же данными, хотя из одной программы обращение к ним происходит с помощью метки XI, а из другой — с помощью метки Х2. Таким о.бразом, атрибут OVR позволяет создавать общие для нескольких программ области данных. Заметим, что программные модули Р1 и Р2 могли создаваться независимо друг от друга, без всякого согласования относительно используемых обозначе­ний (кроме имени секции). Общее поле данных создается только на этапе Компоновки, внутри же каждого программного модуля обращение к данным осуществляется с помощью независимой системы обозначений (например, метки XI и Х2 в рассмотренном примере).

Секции с атрибутом OVR широко используются для создания общих полей данных, предназначенных для связи программ, вхо­дящих в единый программный комплекс. Пусть, например, в про­граммный комплекс входят наряду с описанными выше модуля­ми Р1 и Р2 также модули РЗ и Р4, исходные тексты которых написаны на ФОРТРАНе и имеют операторы:

COMMON /А/ N (1000) в модуле'РЗ COMMON /А/ М (1000) в модуле Р4

Оператор COMMON /А/ эквивалентен директиве .PSECT A, OVR. Можно считать, что в процессе трансляции фортрановских 'модулей создаются следующие строки:

.PSECT A, OVR; в модуле РЗ

.PSECT A, OVR; в модуле Р4

N: .BLKW 1000.

М: .BLKW 1000.

После компоновки образуется (за счет наложения всех четырех секций друг на друга) общий блок данных размером 1000 слов, доступный для записи и чтения всем четырем программам. Обра­щение к нему из модулей Р1 и Р2 выполняется по меткам XI и Х2, а из модулей РЗ и Р4 — с помощью переменных N(i) и М (j).

Директива .PSECT позволяет управлять расположением про­граммных строк в загрузочном модуле. Когда транслятор встречает .в исходном тексте программы в первый раз директиву .PSECT с некоторым именем, он начинает отсчет относительных адресов строк секции с нуля. Появление в тексте программы директивы .PSECT с другим именем приводит к сбросу счетчика текущего адреса с предварительным запоминанием его значения и определе­нию относительных адресов новой секции опять начиная с нулевого адреса. Таким образом, для каждой секции транслятор ведет отсчет относительных адресов отдельно, фактически образуя для каждой секции свой счетчик текущего адреса. При компоновке программы все строки каждой секции будут собраны вместе.





Рис 5.10 План загрузочного модуля с Рис. 5.11 План загрузочного модуля

последовательно расположенными секциями с наложенными секциями.


Макросредства АССЕМБЛЕРа

Программы, написанные на АССЕМБЛЕРе, часто содержат повторяющиеся участки текста с одинаковой структурой. Такой участок текста можно оформить в виде макроопределения, харак­теризующегося произвольным именем и списком формальных аргументов. После того как такое определение сделано, появление в программе строки, содержащей имя макроопределения и список фактических аргументов, приводит к генерации всего требуемого текста, называемого макрорасширением. Варьируя фактические аргументы, можно, сохраняя неизменной структуру макрорасши­рения, изменять отдельные его элементы.

Макроопределение должно начинаться директивой .MACRO, в поле аргументов которой указывается имя макроопределения и список формальных аргументов. Заканчивается макроопределение директивой .ENDM, в поле аргументов которой может указываться имя заканчиваемого макроопределения.

Пусть в программе требуется неоднократно сохранять в стеке содержимое трех регистров, но в каждом конкретном случае но­мера регистров и их порядок различаются. Оформим эти действия в виде макроопределения:


.MACRO PUSH А, В, С

MOV A, — (SP)

MOV В, — (SP)

MOV С, — (SP)

.ENDM PUSH

Появление в исходном тексте программы строки


PUSH RO, Rl, R2


приводит к генерации следующего фрагмента текста:

MOV RO,—(SP)

MOV Rl,—(SP)

MOV R2,—(SP)


Если же в исходном тексте имеется строка


PUSH R4, RO, Rl


то соответствующее макрорасширение имеет вид:


MOV R4,—(SP)

MOV RO,—(SP)

MOV Rl,—(SP)

В качестве фактических аргументов могут выступать любые обозначения АССЕМБЛЕРа. В частности, макровызов


PUSH #44, (R0)+, LABEL


приводит к следующему макрорасширению:


MOV #44,—(SP)

MOV (R0) + ,— (SP)

MOV LABEL,—(SP)


Задача 5.16 Написать макрокоманду, очищающую три ячейки памяти, начиная с заданного адреса:


.MACRO CL, AD

CLR AD

CLR AD+2

CLR AD+4

.ENDM


§ 5.7 ПРИНЦИПЫ ПРОГРАММНОГО УПРАВЛЕНИЯ ВНЕШНИМИ УСТРОЙСТВАМИ.


Интерфейс «Общая шина»

Архитектура и соответственно возможности и характеристики мини-ЗВМ в значительной степени определяются системным интер­фейсом ввода—вывода или процессорным интерфейсом, обеспечи­вающим связь процессора, оперативной памяти и внешних уст­ройств.

Вычислительные комплексы СМ-4 и микро-ЭВМ «Электроника-60» относятся к машинам с магистральной структурой систем­ного интерфейса. В этих машинах все устройства ЭВМ подсо­единяются к единой магистрали связи, состоящей из информаци­онных и вспомогательных линий. По информационным линиям передается вся необходимая для функционирования комплекса информация: адреса, данные, сигналы синхронизации, управления и контроля. Кроме собственно магистрали связи в системный интерфейс входят также алгоритмы обмена информацией, стан­дарты на передаваемые сигналы и унифицированные электронные схемы, управляющие обменом.

Магистраль СМ ЭВМ состоит из 56 информационных и ряда вспомогательных линий и носит название «Общая шина» (ОШ). Магистраль ЭВМ «Электроника-60» содержит 38 линий связи и называется каналом.

Отличительной особенностью магистрального интерфейса явля­ется то, что все устройства ЭВМ подсоединяются к магистрали единым образом. Это определяет общий для всех устройств ал­горитм связи и единый принцип программного управления. Элект­ронные схемы, управляющие работой внешних (периферийных) устройств (контроллеры или интерфейсы внешних устройств) имеют в своем составе регистры, через которые и происходит передача информации. Каждому регистру внешнего устройства присваивается определенный адрес, эквивалентный адресу ячейки оперативной памяти. Свои адреса имеют и служебные регистры процессора. В результате программное обращение ко всем эле­ментам ЭВМ выполняется единообразно:

CLR LABEL ; очистка ячейки оперативной памяти с меткой LABEL

CLR @ # 1000 ; очистка ячейки оперативной памяти с

; абсолютным адресом 1000

CLR RO ;очистка РОН RO

CLR @ # 177776 ; очистка регистра ССП

CLR @ # 177554 ; очистка регистра управления перфоратором


Приравнивание регистров внешних устройств в программном отношении к ячейкам оперативной памяти, во-первых, устраняет необходимость иметь в системе команд специальные команды ввода—вывода, а во-вторых, позволяет процессору оперировать данными непосредственно в регистрах внешних устройств, без пере­сылки их в оперативную память или регистры процессора. Более того, обмен данными между внешними устройствами также про­исходит непосредственно, минуя оперативную память, с помощью обычных команд пересылки. Так, передача кода нажатой клавиши клавиатуры консольного терминала в регистр данных экрана (с целью высвечивания введенного с клавиатуры символа) выполня­ется одной командой пересылки:


MOV @# 177562, @#177566


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

Все доступное программе поле адресов от 000000 до 177776, т. е. 32К слов разбито на области с четко разграниченными функциями. Адреса от 000000 до 157776 (28К слов) принадлежат оперативной памяти. В этой области располагаются элементы операционной системы, а также программ и данные пользователей. Адреса от 160000 до 177776 (4К слов) присвоены регистрам внеш­них устройств и процессора. При этом регистрам стандартных устройств, таких, как консольный терминал, перфоратор, перфо­считыватель, АЦПУ, НМД и НМЛ, заранее назначены вполне определенные адреса. Так, контроллер консольного терминала (он содержит четыре регистра) во всех машинах занимает адреса с 177560 по 177566; контроллер АЦПУ (в нем имеется всего два регистра) занимает адреса 177514 и 177616. Регистры процессора также имеют определенные адреса. Например, регистр слова состо­яния процессора размещается по адресу 177776; регистры общего назначения имеют адреса от 177700 до 177707. Всего под регистры стандартных, т. е. предусмотренных разработчиком ЭВМ, устройств, отводится 2К слов (от 170000 до 177776). Еще 2К слов (от 160000 до 167776) отдается возможным устройствам пользователя. Таким образом, имеется возможность подключения к ЭВМ практически неограниченного количества дополнительных внешних устройств: алфавитно-цифровых дисплеев, накопителей на магнитных дисках и лентах, графических средств ввода—вывода, контроллеров КАМАК, специализированных контроллеров связи с физическими установками, средств связи с другими ЭВМ и т. д. Это обсто­ятельство вместе с относительной простотой и единообразием программного управления внешними устройствами делает ЭВМ типа СМ-4 чрезвычайно перспективной машиной для организации крупных управляющих вычислительных комплексов, систем сбора и обработки информации, автоматизированных систем управления физическими экспериментами или технологическими процессами и т. д.

Описанное выше распределение адресов относится, строго гово­ря, к ЭВМ СМ-3 и Электроника-60. У этих машин длина машинного слова (16 разрядов) соответствует числу адресных линий в ОШ. Максимальный четный адрес, который может быть записан в ма­шинном слове, равно как и максимальный адрес, который может быть передан по линиям ОШ, составляет 177776. Не так обстоит дело в ЭВМ СМ-4, где процессор имеет аппаратные средства для адресации 128К слов. Для этого в составе ОШ предусмотрены 18 адресных линий. Из всего доступного процессору поля адресов от 000000 до 777776 для регистров внешних устройств по-прежнему отводятся последние 4К слов, которые здесь имеют адреса от 760000 до 777776. Остальные 124К слов принадлежат оперативной памяти. Такой объем оперативной памяти позволяет при наличии соответствующей операционной системы работать в мультипрограмм­ном режиме, когда одновременно в оперативной памяти находится несколько программ, принадлежащих разным пользователям. Если, однако, конкретная конфигурация СМ-4 содержит память объемом лишь 32К слов со старшим адресом 177776, регистрам внешних устройств присваиваются те же физические адреса от 760000 до 777776. Однако в программе под область внешних устройств отводятся адреса от 160000 до 177776. Аппаратура процессора (конкретно — диспетчер памяти) преобразует эти виртуальные адреса в программе в физические адреса реальных внешних устройств так, что программная строка


MOV #340, @# 177776


фактически выполняется как


MOV #340, @#777776


Это обеспечивает программную совместимость машин СМ-3 или Электроника-60 с машиной СМ-4.


Регистры внешних устройств

Как уже отмечалось, управление внешними устройствами, а также обмен информацией осуществляются через регистры внеш­них устройств. Количество таких регистров у конкретного устрой­ства зависит от его сложности и колеблется от двух (перфоратор, АЦПУ и т. д.) до 16—20 (НМД и НМЛ). В настоящем параграфе рассмотрим вопросы программирования относительно простых стандартных устройств — терминала, АЦПУ и пр. Хотя физику чаще приходится иметь дело с программированием более специ­альных и сложных устройств, таких, как аппаратура КАМАК, рассмотрение предлагаемых простых примеров поможет уяснить принципы управления работой периферийного оборудования ЭВМ, технику составления программ управления, особенности работы ЭВМ на линии с физическими установками и другие важные и общие вопросы взаимодействия ЭВМ с внешними устройствами.

Простые внешние устройства содержат всего два регистра — регистр данных РД и регистр команд и состояний РКС (рис. 5.12).

Регистр данных (рис. 5.12,а) служит для временного хранения байта данных, передаваемых через внешнее устройство в ЭВМ или из нее. Передаваемые данные помещаются в младший байт РД. Старший байт не используется. Если устройство служит для вво­да—вывода символьной информации (дисплей, АЦПУ), то в ре­гистр данных записывается код ASCII передаваемого символа. Через регистр данных перфоленточного устройства ввода—вывода может передаваться любое восьмиразрядное двоичное число. Будет ли эта информация восприниматься именно как число или как код символа, определяется способом его обработки в програм­ме пользователя.

Регистр команд и состояний (рис. 5.12,6) служит для управле­ния работой ВУ и для получения информации о его состоянии.

Установка разряда 0 (устанавливается программой пользова­теля) запускает ВУ для выполнения очередной операции передачи байта данных. Из рассматриваемых в настоящей главе устройств такого запуска требует только перфосчитыватель. Другие ВУ, например АЦПУ или перфоратор, запускаются автоматически, как только в РД вводится очередной байт данных. Разряд 0 сбрасыва­ется устройством после ввода очередного байта данных.



Рис 5.12 Регистры внешних устройств:

а) – регистр данных

б) – регистр команд и состояний


Разряд 6 (устанавливается и сбрасывается программой) раз­решает или запрещает внешнему устройству посылать в процессор сигнал прерывания (см. далее). Таким образом, если ВУ пред­полагается использовать в режиме прерываний, необходимо в нача­ле программы установить разряд 6; если же разряд 6 сброшен, то ВУ само не может инициировать обмен данными.

Разряд 7 устанавливается устройством после завершения выполнения предыдущей операции. Для устройств вывода (АЦПУ, экран дисплея, перфоратор) наличие 1 в разряде 7 свидетельствует о том, что ВУ закончило вывод на внешний носитель символа из РД и готово к приему в РД следующего кода. Для устройств ввода (клавиатура дисплея, перфосчитыватель) разряд 7 устанав­ливается, как только в РД появляется код вводимого символа (в результате нажатия клавиши или считывания очередной строки с перфоленты).

Разряд 15 устанавливается устройством в случае нарушения нормальных условий его функционирования: отсутствует бумага или перфолента, выключено питание и т. д.

Установка разрядов 7 и 15 приводит к посылке в процессор сигнала прерывания в том случае, если прерывание разрешено, т. е. установлен разряд 6. Таким образом, ВУ может сообщить процессору как о своей готовности к передаче очередного символа, так и о возникновении в нем аварийной ситуации.

Как уже отмечалось ранее, за каждым регистром ВУ закрепля­ется определенный адрес на ОШ, что позволяет обращаться к этим регистрам так же, как и к регистрам процессора или к ячейкам оперативной памяти. В табл. П. 10 приложения приведены адреса регистров некоторых стандартных внешних устройств.


Программное управление внешними устройствами

Существуют два принципиально различающихся режима работы внешних устройств (ВУ). Первый режим называют режимом про­граммного управления или программирования по готовности, и он характеризуется пассивной ролью ВУ. В этом режиме момент передачи данных определяется выполняемой программой. Передача очередного байта данных произойдет, лишь когда в программе встретится строка пересылки байта данных в РД ВУ, либо приема байта данных из РД ВУ. Само ВУ независимо от своего состо­яния не может инициировать передачу данных.

Второй режим носит название режима прерываний. Здесь актив­ная роль отводится ВУ. Как только ВУ оказывается готовым к передаче очередной порции информации и соответственно уста­навливается разряд 7 РКС, ВУ посылает сигнал в процессор, что приводит к прерыванию выполняемой программы и переда'че управления на программу обслуживания ВУ. После завершения этой программы управление возвращается в прерванную программу. Такой режим позволяет, во-первых, одновременно обслужи­вать несколько ВУ, а во-вторых, работать с устройствами, запускающимися в неопределенные моменты времени. Последнее ха­рактерно для физических установок, работающих на линии с ЭВМ. Контроллеры устройств, предназначенных для вывода инфор­мации,— экрана дисплея, АЦПУ, перфоратора — устроены таким образом, что для вывода очередного символа не требуется ни­каких специальных команд или сигналов. Как только в регистр данных ВУ пересылается код символа, автоматически начинается его вывод на внешний носитель. Таким образом, вывод, например, двоичного эквивалента восьмеричного числа 045 на перфоленту осуществляется командой


MOV #45, @# 177556


Использование в этой команде адреса РД экрана терминала (177566) приводит к выводу на экран символа %, поскольку контроллер терминала воспринимает информацию в РД как код ASCII, а число 45 как раз и соответствует коду символа %.

Внешние устройства работают относительно медленно. За вре­мя, пока перфорируется одна строка перфоленты (t~\Q~2 с), процессор успевает выполнить несколько тысяч команд. Поэтому вывод последовательности символов на ВУ требует обязательного согласования скорости работы программы со скоростью работы самого ВУ. Это достигается путем включения в программу цикла ожидания готовности устройства. Индикатором готовности ВУ к приему следующего кода является разряд 7 РКС. Поскольку этот разряд можно расценивать как знаковый разряд младшего байта РКС, а единицу в нем — как признак отрицательного числа, цикл ожидания можно построить следующим образом:

WAIT: TSTB @# 177554

BPL WAIT


В этом примере происходит проверка младшего байта РКС перфоратора. Если перфоратор не готов к приему следующего кода, разряд 7 сброшен и содержимое байта можно рассматривать как положительное число. В этом случае происходит переход по метке WAIT на ту же строку проверки. Как только разряд 7 установится, команда BPL не сработает и процессор перейдет на выполнение следующей строки программы.

Задача 5.17 Вывести на экран терминала текст READY с новой строки:


TEXT: .ASCII <12>/READY/

START: CLR RO

WAIT TSTB @# 177564

BPL WAIT

MOVB TEXT, (RO), @#177566

INC RO

CMP RO, #6

BNE WAIT

Задача 5.18 Вывести на перфоленту пять строк заполненных еденицами.

При этом анализировать разряд ошибки РКС и в случае кой-либо ненормальности в работе перфоратора перейти на метку ERROR:

START: MOV #5,R0

ERR: TST @#177554

BMI ERROR

WAIT TSTB @#177554

BPL

MOVB #337,@#177556

SOB R0, ERR


Контроллер устройства ввода устанавливает разряд 7 РКС, как только регистр данных заполняется кодом введенного символа. Таким образом, готовность устройства в данном случае обозначает завершение ввода очередного символа, который, очевидно, может быть извлечен из РД и обработан программой пользователя.


Задача 5.19 Ввести символ с клавиатуры в регистр R3:


S: TSTB @#177560

BPL S

MOVB @#177562, R3


Задача 2.20 Организовать высвечивание на экран символов, вводимых с клавиатуры терминала (Операция "Эхо"):


S: TSTB @#177560

BPL S

MOVB @#177562, @#177566

BR S


Рассмотрим временные характеристики программного управ­ления внешними устройствами.

Серьезный недостаток этого режима — крайне низкая эффек­тивность использования ресурсов ЭВМ. Если, например, выполня­ется программа ввода с клавиатуры, то передача каждого байта данных, которая требует всего нескольких микросекунд, будет происходить только после нажатия оператором очередной клавиши. Пока оператор думает, какую клавишу нажать или какое сооб­щение ввести, процессор занят опросом разряда готовности РКС клавиатуры. Никакой другой работу ни процессор, ни другое устройство ЭВМ в это время выполнять не могут. Связь с другим ВУ может быть организована лишь после окончания обмена ин­формацией с данным ВУ.

С другой стороны, обслуживание ВУ может происходить с ";максимальной для устройства скоростью. Действительно, передав, например, в РД экрана дисплея очередной байт, процессор на­чинает опрашивать разряд готовности. Как тоЛько завершится вывод на экран переданного байта и контроллер дисплея установит разряд готовности, процессор почти мгновенно (с интервалом в несколько микросекунд, требуемых для выполнения команд TST и MOV) передаст очередной байт данных. Быстрая реакция ЭВМ на готовность ВУ в некоторых случаях может оказаться решающим доводом в пользу рассмотренного режима.


Прерывания

Режим прерываний существенно отличается от рассмотренного выше режима программного управления. Если ВУ работает в ре­жиме прерываний, то в оперативной памяти ЭВМ находятся две программы: фоновая, которая может и не иметь отношения к внешним устройствам, и программа обработки прерываний (ПОП), основной задачей которой обычно является передача очередной порции информации между ВУ и процессором или оперативной памятью (рис. 5.13,а). Процессор постоянно занят выполнением фоновой программы. Если ВУ готово к передаче или приему ин­формации, оно посылает в ЭВМ по соответствующим электриче­ским линиям сигнал запроса прерывания. Процессор прерывает фоновую программу и переходит на выполнение ПОП. После завершения ПОП управление передается назад в фоновую програм­му, которая продолжается с того места, на котором была прервана сигналом от ВУ.

Режим прерываний обеспечивает высокую эффективность ис­пользования времени центрального процессора: если ВУ не готово к обмену данными, процессор выполняет фоновую программу, т. е. занят полезной работой. В режиме прерываний ЭВМ может об­служивать параллельно любое количество ВУ. Каждому ВУ соот­ветствует своя программа обработки прерываний (рис. 5.13,6). Если запрос на прерывание приходит от ВУ2, управление передает­ся на ПОШ, а после ее завершения выполнение прерванной про­граммы продолжается. При этом возможны вложенные прерывания: если запрос на прерывание от ВУ2 придет в тот момент, когда выполняется ПОПи то ПОП] прерывается (при условии, что приоритет ВУ2 выше приоритета ВУО и управление передается ПОП2. После завершения обработки прерывания от ВУ2 продолжа ется обработка прерывания от ВУ. По завершении ПОП управ­ление передается в фоновую программу.



Рис 5.13 Процесс прерываний


Важной особенностью режима прерываний является возмож­ность обработки случайных во времени событий, что характерно для физического эксперимента. Процессор может выполнять любую работу по контролю, управлению, обработке данных и т. д., но как только ВУ затребовало обслуживания, текущая программа прерывается и начинается обработка прерывания от ВУ. Система приоритетов (см. ниже) позволяет организовать обслуживание ВУ в порядке важности. В первую очередь обслуживаются ВУ с мак­симальным приоритетом; если запросов от этих ВУ не поступило или если они уже обслужены, обрабатываются прерывания от менее приоритетных ВУ. Наконец, в промежутках между обработ­кой прерываний выполняется фоновая программа.

Рассмотрим процесс передачи управления от программы к программе. Переход на выполнение ПОП осуществляется очень просто: для этого достаточно загрузить в счетчик команд адрес первой выполняемой строки ПОП, т. е. значение метки, относя­щейся к этой строке, а в регистр ССП — значение приоритета ПОП. Однако при этом надо обеспечить возможность возврата в преры­ваемую программу и продолжения ее выполнения так, как будто никакого прерывания не было. С этой целью надо сохранить в какой-то области памяти следующую информацию:

адрес очередной команды прерываемой программы, т. е. со­держимое счетчика команд СК в момент прерывания;

содержимое регистра ССП на момент прерывания. В разрядах кодов условий ССП может храниться информация, необходимая для выполнения следующей команды, если она представляет собой, например, команду условного перехода;

содержимое РОН, если, они будут использоваться в ПОП.

Для возвращения в прерванную программу надо восстановить содержимое СК, ССП и РОН.

Система прерываний обеспечивает при получении сигнала пре­рывания автоматическое сохранение в стеке содержимого СК и ССП, загрузку новых значений СК и ССП, относящихся к ПОП, а после завершения ПОП — выгрузку из стека содержимого СК и ССП, относящихся к прерванной программе. Содержимое РОН автоматически не сохраняется. Если в ПОП предусматривается использование РОН, сохранение их содержимого в начале ПОП и восстановление в конце должен предусмотреть программист.

Значения СК и ССП, относящиеся к каждой программе об­работки прерываний, а их может быть столько, сколько внешних устройств подсоединено к ЭВМ, должны быть заранее помещены в какую-то область памяти, доступную процессору. Для этого в схеме распределения адресов предусматривается область памяти для векторов прерываний. Вектор прерывания — это два слова оперативной памяти, закрепленные за определенным внешним устройством. В слове с меньшим адресом хранится адрес ПОП для данного ВУ, в слове с большим адресом — ССП для ПОП. Для векторов прерывания выделено самое начало памяти с адресами от 000 до 776.

В табл. П10 показано располо­жение векторов прерываний неко­торых стандартных внешних уст­ройств.

В состав операционных систем всегда включаются готовые универ­сальные программы работы со стандартными ВУ — драйверы. Их адреса как раз и хранятся в векто­рах прерывания, закрепленных за этими ВУ. Если системный драйвер почему-либо не удовлетво­ряет пользователя, он должен напи­сать свою программу обработки прерывания и ее адрес загрузить в первое слово соответствующего вектора прерывания. Для не­стандартных ВУ, таких, как физические установки, для которых системные драйверы отсутствуют, программы обработки прерыва­ний создаются пользователем.

Рассмотрим теперь аппаратные средства организации преры ваний в ЭВМ типа СМ-4 (рис. 5.14). В составе ОШ имеюто четыре пары линий запроса передачи (ЗП) и разрешения передач! (РП), различающиеся уровнем приоритета. Всего имеются четыре уровня приоритета ВУ с значениями от 4 до 7. Устройство получа ет тот или иной приоритет в зависимости от того, к какому уровнк прерываний оно подсоединено. На одном уровне может находиться любое количество устройств. При этом если к линиям ЗП все BУ подсоединяются параллельно, то каждая линия РП проходит последовательно через все устройства, находящиеся на этом уровне. Это нужно для того, чтобы реализовать приоритетность устройств принадлежащих к одному уровню. Чем дальше от процессора под­соединено к линии РП устройство, тем меньшим относительным приоритетом среди устройств этого уровня оно обладает.

Система прерываний работает следующим образом.

Как только в РКС ВУ устанавливаются разряды 7 или 15, устройство выставляет запрос на соответствующую линию ЗП т. е. устанавливает на этой линии уровень логической единицы. Специальный узел процессора — арбитр — сравнивает номер возбуж­денной линии ЗП с приоритетом текущей программы, хранящимся в битах 5—7 ССП. Если приоритет линии запроса ниже или равен приоритету выполняемой программы, прерывания не происхо-дит. Линия запроса при этом остается возбужденной, т. е. прерывание как бы ждет своей очереди. Когда приоритет процессора станет ниже приоритета возбужденной линии (в результате пере­хода на программу с меньшим приоритетом или появления коман­ды, устанавливающей более низкий приоритет в выполняемой про грамме), арбитр немедленно инициирует процедуру прерывания. Как только ВУ получает по шине РП сигнал разрешения передачи, оно выставляет на линии данных ОШ адрес своего вектора прерывания, а на специальную линию Прерывание — сигнал, ин­формирующий процессор о начале процедуры прерывания. Полу­пив этот сигнал, процессор проталкивает в стек текущее ССП и содержимое СК (т. е. адрес возврата в прерванную программу) .и загружает СК и ССП из вектора прерывания, чем и реализу­ется переход на программу обработки прерывания.




Рис 5.14 Система прерываний ЭВМ СМ – 4


Программа обработки прерывания обычно заканчивается спе­циальной командой RTI (return from interrupt — возврат из пре­рывания) , которая выталкивает из стека ССП и адрес возврата в прерванную программу и загружает их соответственно в регистр ССП и СК. На этом обработка прерывания заканчивается, и процессор переходит на продолжение выполнения прерванной про­граммы.

Рассмотрим временные характеристики системы прерывания. Процедура прерываний занимает в ЭВМ СМ-4 около 10 икс. Одна­ко сигнал разрешения передачи выдается не раньше, чем закончит­ся текущая команда, на что может потребоваться в зависимости от вида команды и использованного способа адресации от 1,5 до 10 икс. Таким образом, общее время перехода на ПОП составля­ет 10—20 икс, что заметно выше времени реакции на сигнал готов­ности ВУ, работающего в режиме программного управления (3— 4 мкс).

При высокой скорости поступления событий, обрабатыва­емых по прерываниям, процессор ЭВМ работает неэффективно, так как значительная часть процессорного времени расходуется на процедуры перехода на ПОП- и возврата в прерванную про­грамму. Поэтому в системах реального времени всегда стремятся уменьшить частоту прерываний, например, включением в состав аппаратной части установки буферных запоминающих устройств для предварительного накопления информации о приходящих событиях.

Следует заметить, что приведенное выше значение времени реакции на прерывание определяется аппаратной частью ЭВМ и составляет аппаратное время реакции. Реально, однако, процедура перехода на ПОП включает в себя определенные программные действия, состав которых зависит от используемой операционной системы. Выполнение процедуры прерываний по правилам ОС гарантирует правильное взаимодействие программ реального вре­мени в случае наложения прерываний от нескольких источников, в том числе и от тех, которые обслуживаются автоматически средствами операционной системы (например, прерывания от сис­темного таймера или от НМД). Программная составляющая вре­мени реакции на прерывания может в несколько раз превышать аппаратную составляющую.

Для ЭВМ Электроника-60 длительность процедуры прерывания составляет 18,8 мкс. С учетом времени, требуемого на завершение текущей команды, аппаратное время реакции на прерывание сос­тавляет 20 — 40 икс. Если, однако, оперативное запоминающее устройство ЭВМ Электроника-60 выполнено на динамических эле­ментах, некоторая доля процессорного времени уходит на регене­рацию памяти. Регенерация осуществляется каждые 2 мс и длится около 120 мкс. Сигнал прерывания от ВУ не обрабатывается до завершения регенерации. Таким образом, аппаратное время реак­ции может доходить до 150 мкс. Все сказанное выше о программной составляющей времени реакции на прерывание, связанной с ал­горитмами ОС, в полной мере справедливо и для ЭВМ Электро­ника-60.

Поскольку время выполнения команд в этой ЭВМ приблизи­тельно в 2 раза больше, чем в ЭВМ СМ-4, общее время реакции также увеличивается приблизительно в 2 раза.

Система прерываний допускает обработку вложенных преры­ваний. Действительно, если в процессе выполнения программы обработки прерывания придет запрос на прерывание по линии с более высоким приоритетом, вся процедура прерывания повторится: ССП и СК текущей программы (в данном случае ПОП) про­толкнутся в стек, из вектора прерывания будет получена инфор-мация о ПОП более приоритетного устройства и начнется обслужи­вание этого ВУ. По команде RTI произойдет возврат в ПОП ВУ с более низким приоритетом, а по команде RTI, заканчивающей эту программу, процессор перейдет на продолжение выполнения основной прерванной программы.

Устройства, подключенные к одному уровню, не могут преры­вать друг друга, поскольку они обладают одинаковым приоритетом по отношению к процессору. Их относительный приоритет, опреде­ляемый порядком подключения к линии РП. Влияет на последовательность их обслуживания в том случае, когда несколько уст­ройств, находящихся на одном уровне, выставили запрос на пре­рывание. Ближайшее к процессору ВУ, приняв сигнал разрешения передачи, блокирует его дальнейшее прохождение (см. рис. 5.14). Таким образом, ВУ, находящиеся на одном уровне, обслуживаются в порядке их расположения на линии РП.

Кроме четырех уровней программных прерываний с приорите­тами от 4 до 7 в ЭВМ СМ-4 существует еще так называемый уро­вень внепроцессорного прерывания (прямого доступа в память). К этому уровню подсоединяются быстрые устройства (НМД и НМЛ), которые могут осуществлять обмен данными непосредствен­но с оперативной памятью без участия процессора. Устройства, подсоединенные к уровню внепроцессорного прерывания, имеют наибольший абсолютный приоритет и могут прерывать выполне­ние любой программы. Работа канала прямого доступа в целом совпадает с описанной системой прерываний, хотя имеет некото­рые специфические отличия. Поскольку прикладному программисту обычно не приходится программировать на физическом уровне НМД и НМЛ (для работы с ними используются средства опера­ционной системы), этот вопрос здесь не рассматривается.


Управление внешними устройствами в режиме прерываний.

Программирование ВУ в режиме прерываний требует про­ведения некоторых подготовительных операций: загрузки вектора прерывания обслуживаемого устройства, разрешения прерываний с помощью установки разряда 6 РКС, установки начального зна­чения регистров общего назначения, если они будут использоваться в программе обработки прерываний, например, с целью счета числа переданных байтов. Если предполагается обслуживать одновременно несколько устройств, указанные операции следует выполнить для каждого ВУ в отдельности. Эти подготовительные операции следует выполнить в начале фоновой программы, которая затем может перейти к выполнению запланированных для нее действий. Однако такое совмещение в одной программе функций инициализации прерываний и выполнения «фоновой» работы не­удобно. Чаще после инициализации прерываний программа с по­мощью соответствующих средств операционной системы блокиру­ется, т. е. прекращает выполнение в ожидании прерываний. Прихо­дящие от ВУ запросы прерывают состояние блокировки, управление передается ПОП, а после ее завершения процессор возвращает управление назад в заблокированную программу, которая ожида­ет следующего прерывания. После того как все прерывания об­работаны, блокировка программы снимается (опять же с помощью соответствующих средств операционной системы) и программа может приступить к обработке накопленной информации либо просто завершиться. Таким образом, используемый иногда термин «фоновая программа» по отношению к программе инициализации прерываний и обработки накопленной информации следует признать неудачным. В дальнейшем эту программу будем называть «основ­ной».

Как уже отмечалось, обработка прерываний должна выполнять­ся по правилам, определяемым используемой операционной сис­темой. Однако рассматриваемые ниже задачи предполагают для простоты, что ОС отсутствует. Это дает возможность проиллюст­рировать обработку прерываний «в чистом виде», не усложняя ее алгоритмами обращения к средствам ОС. При этом надо иметь в виду, что если ЭВМ работает под управлением ОС (а ЭВМ практически всегда работает под управлением ОС), приведенные ниже решения, вообще говоря, неправильны. Обработка преры­вания в рамках ОС рассмотрена в гл. 7 и 8.

Задача 5.21 Одновременно с выполнением основной программы организовать ввод строки текста с клавиатуры терминала в буфер. Терминал на линии с приоритетом 4


BUFFER: .BLKB 80.

START: MOV #KEYBRD, @#60

MOV #200, @#62

MOV #100, @# 177560

CLR R0

EXIT.

KEYBRD: MOVB @#177560,BUFFER(R0)

INC R0

RTI

Задача 5.22 Тоже что и в предыдущей задаче, но вводимые символы высвечивать на экране терминала. Вывод на экран по готовности.


BUFFER: .BLKB 80.

START: MOV #KEYBRD, @#60

MOV #200, @#62

MOV #100, @# 177560

CLR RO

; продолжение основной программы

.EXIT

KEYBRD: MOVB @# 177562, BUFFER (RO)

WAIT: TSTB @#177564

; ожидание готовности экрана

BPL WAIT ;высвечивание символа

MOV @#177562,@#177566

RTI


Как уже отмечалось, программа обработки прерываний может идти на фоне основной программы, куда управление возвращает­ся каждый раз после окончания ПОП. Однако иногда необходимо после отработки ПОП завершить выполнение также и фоновой про­граммы. В этом случае команду RTI в конце ПОП следует за­менить системной макрокомандой завершения программы .EXIT, которая передает управление операционной системе. Но в этом слу­чае нарушится нормальная работа указателя стека, так как в про­цессе перехода на ПОП указатель стека смещается на два слова, в которые были записаны ССП и СК основной программы. Поэтому перед выходом из ПОП в операционную систему следует восста­новить указатель стека. Для этого можно воспользоваться коман­дой


ADD #4, SP


или последовательностью «безобидных» команд


TST (SP) +

TST (SP) +


которые не производят никаких операций, но смещают указатель Стека в силу используемого способа адресации.


Задача 5.23. Организовать выход из основной программы при нажатии клавиши Е. Нажатие других клавиш не фиксировать.

Е: .ASCII/E/

.EVEN

START: MOV #DISP, @#60

MOV #200, @#62

BIS #100, @# 177560

; продолжение

; основной

; программы

.EXIT

DISP: CMP E,@#177562 ; символ Е?

BEQ FIN ; да

RTI ; нет, возврат в основную

FIN: CLR @# 177560 ; запрет прерывания

ADD #4, SP ; возврат указателя стека

.EXIT ; выход из программы в

; операционную систему


КОНТРОЛЬНЫЕ ВОПРОСЫ К ГЛАВЕ 5


1. Зачем исполизуются регистры общего назначения:

а) для связи с внешними устройствами,

б) для ускорения вычислений;

в) для хранения служебной информации?

2. Каково назначение счетчика команд?

а) хранение адреса выполняемой команды;

б) хранение адреса адресуемой ячейки памяти;

в) хранение адреса следующей команды?

3) Когда устанавливаются разряды кодов условий в слове состояния процес­сора:

а)при загрузке программы в память;

б)после завершения выполнения программы;

в)после выполнения каждой команды;

4.Зачем используются коды ASCII:

а) для кодирования алфавитно-цифровой информации;

б) для кодирования чисел;

в) для кодирования служебной информации?

5.На какой строке заканчивается выполнение программы:

а) на последней строке программы;

б) на строке с системной директивой .EXIT (EXIT$S);

в)на строке с директивой .END?

6. Зачем используется аппаратный стек:

а) для временного хранения адресов и данных

б) для хранения характеристик выполняемой программы;

в) для хранения операндов выполняемой команды?

7. Отличается ли программное обращение к регистрам ВУ от обращения к

ячейкам оперативной памяти:

а) обращение к perистрам ВУ призводиться с помощью специальныхкоманд ввода вывода:

б) не отличается

в) отличается только значениями адресов?

8. В чём заключается преимущества программного управления ВУ:

а) максимальная скорость работы ВУ;

б) максимальная скорость работы процессора

в) максимальная скорость выполнения программы?

9.В чем заключаются преимущества управления ВУ в режиме прерываний

а)высокая скорость обмена данными;

б)возможность обработки случайных во времени событий;

в)возможность параллельного обмена данными с несколькими ВУ при одновременном выполнении вычислительной работы?

10. В какой момент времени происходит загрузка векторов прерываний нестандартных ВУ:

а)в начале выполнения основной программы

б)при включении ЭВМ;

в)в начале программы обработки прерываний?

11.Каким образом разрешаются и запрещаются прерывания от ВУ:

а)изменением содержимого слова состояния процессора;

б)изменением содержимого регистра управления ВУ;

в) изменением содержимого вектора прерывания ВУ?