Автоматизация
Вид материала | Документы |
- В. И. Харитонов > К. И. Меша Одобрено методической > С. С. Драгунов комиссией факультета, 321.05kb.
- Темы курсовых проектов Автоматизация учета налогоплательщиков (НП) физических и юридических, 19.54kb.
- Автоматизация бухгалтерского учета нужна ли она?, 216.55kb.
- Программа вступительного экзамена по приему в магистратуру по специальности 6М070200, 225.94kb.
- Автоматизация работы программ расчета, 29.26kb.
- Автоматизация и моделирование работы предприятий по строительству промышленных объектов, 445.96kb.
- Автоматизация процессов мониторинга объектов железнодорожной инфраструктуры на основе, 315.84kb.
- К рабочей программе учебной дисциплины «Интегрированные системы проектирования и управления»», 31.58kb.
- Автоматизация процесса формирования индивидуальных учебных планов в системе переподготовки, 256.55kb.
- Темы курсовых работ По дисциплине «Бухгалтерские информационные системы» Автоматизация, 14.74kb.
Стек
Стеком называют область оперативной памяти, в которой организуется временное хранение некоторых элементов информации. Отличительной особенностью стека является своеобразный порядок обслуживания содержащихся в нём элементов: в любой момент времени доступен только верхний элемент, т. е. элемент, загруженный в область стека последним. Выгрузка из стека верхнего элемента делает доступным следующий элемент.
Элементами стека могут быть любые данные: числа, коды символов, адреса ячеек или регистров и др. В зависимости от характера информации, хранящейся в стеке, он может состоять из слов или байтов. Элементы стека располагаются в области памяти, отведенной под стек, начиная со дна стека по последовательно уменьшающимся адресам.Адрес верхнего, доступного элемента хранится в одном из общих регистров, чаще всего в аппаратном указателе стека 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.Каким образом разрешаются и запрещаются прерывания от ВУ:
а)изменением содержимого слова состояния процессора;
б)изменением содержимого регистра управления ВУ;
в) изменением содержимого вектора прерывания ВУ?
12>