ОПИСАНИЕ ЯЗЫКА СТРУКТУРНО-ПРОЦЕДУРНОГО ПРОГРАММИРОВАНИЯ ARGUS V.0
1. Общие сведения
Язык программирования ARGUS v.0 представляет собой низкоуровневый язык, предназначенный для программирования вычислительной системы.
Язык структурно-процедурного программирования ARGUS v.0 поддерживает реконфигурируемую аппаратную платформу системы как за счет специальных языковых конструкций, так и за счет включения параметров конфигурации в процессе трансляции и генерации исполняемого кода.
Программа на языке ARGUS v.0 представляет собой текстовый файл, содержащий инструкции языка. Программы на языке могут быть многомодульными. В минимальном случае программа может состоять из основного файла программы. В общем случае программа состоит из основного файла программы и нескольких подключенных к нему модулей, содержащих описание структурных компонент программы. Такой подход позволяет сделать процесс написания программ более гибким и простым.
Основная программа содержит описания переменных и последовательности кадров, очередность выполнения которых задается управляющими операторами. Каждый кадр состоит из множества вычислительных команд, которые выполняются параллельно и асинхронно. Текст основной программы на языке ARGUS v.0 ограничен ключевыми словами PROGRAM и ENDPROG.
Подключаемый файл описывает вычислительную структуру кадра и содержит описание макрообращений, специальных прошивок и описание связей между ними. Порядок следования макрообращений и специальных прошивок не регламентирован. Текст подключаемого файла ограничен ключевыми словами UNIT и ENDUNIT.
Введение таких ограничительных конструкций позволяет структурировать программу, выделить библиотеку макрообращений и специальных прошивок в отдельные модули, которые в случае необходимости могут быть подключены к проекту.
Для определения переменных, описанных пользователем, и операторов языка ARGUS v.0 различают постоянные символические имена и символические имена, определяемые пользователем. Постоянные символические имена - это мнемонические обозначения операторов и директив языка. К символическим именам, определяемым пользователем, относятся:
- метки (локальные и глобальные);
- имена макрообращений;
- идентификаторы данных;
- имена базовых модулей.
Символические имена, определяемые пользователем, образуются из буквенно-цифровых символов в соответствии со следующими правилами:
- первый символ не должен быть цифрой;
- нельзя использовать разделительные знаки.
Метка - это символическое обозначение ячейки памяти программ контроллера распределенной памяти, в которую записывается машинный эквивалент оператора контроллера памяти, которому метка предшествует. Определение метки в формате оператора заканчивается символом ':'.
Предложение, написанное на языке ARGUS v.0, может располагаться на нескольких строках. Конец предложения определяется символом ';'.
Обычно предложение состоит из трех полей:
- поле метки;
- поле операции;
- поле операндов.
Существует еще поле комментариев, не имеющее строгой привязки, поэтому комментарий можно расположить в любой точке программы.
Поле комментария и поле метки не обязательны.
Поле операндов может отсутствовать.
Комментарий начинается знаком '/*' и заканчивается знаком '*/'. Допускаются вложенные комментарии.
В ARGUS v.0 предполагаются следующие типы данных:
- Number – целое число;
- Vector – массив из n-элементов;
- Stream – массив из n-элементов;
- Array – многомерный массив;
- ParamAddress – адрес ячейки памяти.
Арифметические выражения в ARGUS v.0 состоят из символических имен, определяемых пользователем, чисел, знаков операций и встроенных функций.
2. Элементы языка
Формат директивы описания переменных имеет следующий вид:
var имя_переменной : тип_переменной;
Директива инициализации значения переменной описывается следующим образом:
Define имя_переменной = выражение;
Для определения значений элементов векторов существуют две основных формы директивы присваивания.
Форма 1:
define имя_переменной = [ выражение ];
Форма 2:
define имя_переменной = [ выражение,…, выражение ];
Если элементов задано менее размерности вектора, остальные компоненты будут заполнены:
- машинными нулями, если значения элементов вектора определяются впервые;
- останутся без изменения, если значения элементов вектора определяются не в первый раз.
Особенности векторной арифметики сводятся к нескольким правилам. Если один операнд - вектор, второй операнд – число и результат – вектор, то для каждого из элементов вектора-операнда выполняется арифметическая операция с этим числом.
2.1. Описание макрообращений
Макрообращения используются для настройки элементарных связей каналов контроллера распределенной памяти с другими компонентами системы. В языке ARGUS v.0 существуют два вида макрообращений: реальное и виртуальное. Реальное макрообращение настраивает два канала связи.
Названия каналов должны начинаться со слова CHAN. Затем должен следовать номер канала. Для реального макрообращения номер канала должен находиться в диапазоне от 0 до 1.
Существует шесть типов команд макрообращения, которые представлены в табл. 1.
Завершать макрообращения должна директива ENDMACROMEMORY, которая сообщает ассемблеру об окончании последовательности команд макрообращения. Она требуется постольку, поскольку команды настройки каналов могут стоять не в порядке возрастания номеров каналов контроллера распределенной памяти, которые они настраивают, а вразброс.
Таблица 1 Типы команд макрообращения
Пример, демонстрирующий настройку каналов контроллера памяти на чтение данных, используя реальную макрооперацию:
RealMacromemory m00(out alpha0,beta0); Virtual;
alpha0<
beta0<
EndMacroMemory;
В этом макрообращении производится настройка двух каналов на чтение данных.
Пример, демонстрирующий использование виртуального макрообращения:
VirtualMacroMemory m00(In : alpha0,beta0; out : alpha1,beta1);
EndMacroMemory;
alpha0, beta0, alpha1, beta1 – логические имена используемых контроллеров распределенной памяти.
2.2. Описание макрообъекта
Макрообъект содержит группу элементарных процессоров и программируемую коммутационную структуру для организации прямых каналов связи между процессорами, а также внутренюю память для хранения команд простых арифметических, логических и коммутационных операций, которые необходимы для выполнения макроопераций.
При программировании макрообъекта в языке ARGUS v.0 пользователь описывает макрооперации, которые в определенном смысле соответствуют макрокомандам для традиционного программирования.
Макрооперация является совокупностью команд всех элементарных процессоров и элементарных коммутаторов (мультиплексоров) макрообъекта, образующих структурно-реализуемую крупную функционально законченную математическую операцию, которая является программно неделимой конструкцией на потоковом, процедурном и управляющем уровнях структурно-процедурного программирования.
В языке ассемблера используются два типа макроопераций: реальная (RealMacroOperation) и виртуальная (VirtualMacroOperation).
Реальная макрооперация требует от пользователя описать макрокоманды для макрообъекта с учетом коммутации между элементарными процессорами, которые жестко определены архитектурой макрообъекта РВС, а также учитывать топологию РВС при программировании нескольких макрообъекта.
Использование реальных макроопераций предполагает точную настройку макрообъекта самим пользователем.
Конструкция для описания реальной макрооперации на языке Argus v.0 выглядит следующим образом:
RealMacroOperation <Имя> (In : <входные параметры>; Out : <выходные параметры>) -> <Кординаты>;
Line <номер линейки> ( E = <Направление> );
<Блок вычислений>
EndLine;
…………………………………………...
Line <номер линейки> ( E = <Направление >);
<Блок вычислений>
EndLine;
EndMacroOperation;
Реальная макрооперация состоит из последовательности вычислительных каскадов макрообъекта. Границы вычислительного каскада определяются директивами Line и EndLine. Вычислительный каскад макрообъекта включает в себя аддитивные и мультипликативные процессоры, транзитные шины и коммутатор. Для описания элементов вычислительного каскада используются следующие обозначения:
-
A0, A1,…,An – аддитивные процессоры, выполняющие суммирование двух операндов;
-
M0, M1,…,Mn – мультипликативные процессоры, выполняющие умножение двух операндов;
-
T0, T1 … Tn – транзитные шины, выполняющие пересылку данных;
-
С0 и С1 – каналы контроллера распределенной памяти.
Каждый каскад соединен с определенными внешними выводами ПЛИС, которые помечаются с помощью конструкции задания направления E = <Направление >. Возможен выбор одного из четырех направлений, которые именуются в соответствии с начальными буквами сторон света (W, N, O, S).
Конструкция <Координаты> описывает расположение макрообъекта на базовом модуле и выглядит следующим образом X.Y.Z, где X – номер базового модуля, Y – номер квадранта, Z – номер микросхемы.
Количество каскадов, элементарных процессоров и транзитных шин в реальной макрооперации зависит от архитектуры макрообъекта. В настоящее время реальная макрооперация включается в себя четыре вычислительных каскада, два аддитивных и два мультипликативных процессора в каждом каскаде, шестнадцать транзитных шин и коммутатор. Транзитные шины имеют ограниченную коммутационную структуру между собой и образуют кольцо.
Ниже приведен пример фрагмента программы с использованием реальной макооперации.
Unit Unit1;
realmacrooperation MO_1_0(in : w0,w2,s1,s3) -> 1.0.0;
Line 0 (E=N)
C0 = PT0;
EndLine;
Line 1 (E=O)
a0 = const + E1;
m0 = const * E3;
EndLine;
Line 2 (E=S)
a0 = const + PA0;
m0 = const * PM0;
EndLine;
Line 3 (E=W)
T0 = pa0;
EndLine;
EndMacroOperation
EndUnit;
Реальная макрооперация MO_1_0 содержит четыре входа w0, w2, s1и s3 и четыре вычислительных каскада. Вычислительные каскады 0 и 3 выполняют пересылку данных с использованием транзитных шин PT0 и T0 в КРП канала C0, а каскады 1 и 2 выполняют обработку потоков данных.
Система команд элементарных процессоров представлена в разделе 7.
Применение реальных макроопераций позволяет пользователю наиболее оптимально использовать ресурсы макрообъектов при описании структуры задачи. Однако использование реальных макроопераций требует от программиста доскональных знаний архитектуры макрообъекта и особенностей программирования макрообъекта.
Виртуальная макрооперация дает возможность пользователю описать информационный граф задачи, не привязываясь к особенностям коммутационной системы базового модуля.
Конструкция виртуальной макрооперации в языке ARGUS v.0 выглядит следующим образом:
VirtualMacroOperation (In : <Список входных параметров>; Out : <Список выходных параметров>; Processors : <Список используемых процессоров>);
<Блок вычислений>
EndMacroOperation;
Блок вычислений в виртуальной макрооперации представляет собой совокупность элементарных арифметических выражений, описывающих информационный граф задачи.
Ниже приведен пример виртуальной макрооперации:
VirtualMacroOperation (In : A,B,C,D; Out : E; Processors : P0, P1);
P0 = (A+B*C)*A + C*D;
P1 = B * A + C;
E = (P0 + P1)*(A+D);
EndMacroOperation;
Программирование с использованием виртуальных макроопераций является менее трудоемким, поскольку программист не привязывается к особенностям коммутационной системы базового модуля, и позволяет увидеть общую картину производимых вычислений, но при этом программисту недоступно для анализа распределение вычислительных структур макрообъекта.
Директива завершения описания макрооперации ENDMACROOPERATON сообщает транслятору ассемблера об окончании последовательности команд элементарных процессоров.
2. Команда чтения данных
Команда чтения данных предназначена для чтения потоков данных из распределенной памяти по вычисленным адресам, начальный адрес определяется вектором начальных адресов оператора read или read_mod. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Приращение адресов задает вектор адресных приращений оператора чтения. Прочитанные данные поступают на выход А канала макропамяти. Формат команд чтения данных рассмотрен в табл. 2.
Таблица 2 Форматы операторов обращения
Окончание табл. 2
|
М-код
|
Формат
|
Действие
|
READ
|
Read ВНА [step ВАП
[repeat ПЦ]];
|
Чтение чисел с инкрементной адресацией
|
WRITE
|
Write ВНА [step ВАП
[repeat ПЦ]];
|
Запись чисел с инкрементной адресацией
|
CONTINUE
|
Continue step ВАП repeat АПЦ
|
Дополнительный оператор чтения(записи)
|
READ_MOD
|
Read_mod ВНА [step ВАП [repeat АПЦ]];
|
Чтение чисел с пороговой адресацией
|
WRITE_MOD
|
Write_mod ВНА [step ВАП [repeat АПЦ]];
|
Запись чисел с пороговой адресацией
|
READ_WHILE
|
Read_while ВНА [step ВАП];
|
Чтение чисел по типу While
|
WRITE_WHILE
|
Write_mod ВНА [step ВАП];
|
Запись чисел по типу While
|
READ
|
Read Extern [repeat АПЦ];
|
Чтение чисел с внешним адресом
|
WRITE
|
Write Extern [repeat АПЦ];
|
Запись чисел с внешним адресом
|
READ
|
Read ВНА step Extern
[repeat АПЦ];
|
Чтение чисел с внешним приращением
|
WRITE
|
Write ВНА step Extern
[repeat АПЦ];
|
Запись чисел с внешним приращением
|
READ_STRING
|
Read_Stirng BHA [size N];
|
Чтение строки
|
WRITE_STRING
|
Write_Stirng BHA [size N];
|
Запись строки
|
READ
|
Read BHA TO имя_устройства
|
Чтение МАОП (МАКОМ) для имя_устройства (МАP0-MAP3)
|
WRITE
|
Write BHA TO имя_устройства
|
Запись МАОП (МАКОМ) для имя_устройства (МАP0-MAP3)
|
MOVE_REG
|
Move_Reg [@]BHA, имя_регистра
|
Чтение регистра
|
MOVE_REG
|
Move_Reg имя_регистра; [@]BHA
|
Запись регистра
|
где ВНА – вектор начального адреса в КРП;
ВАП – вектор адресного приращения;
АПЦ – адрес приращения цикла.
Команда чтения данных по типу while
Команда чтения данных по типу while предназначена для чтения потока данных из распределенной памяти, размер которого не может быть определен на этапе трансляции задачи, а определяется только на этапе выполнения, начальные адреса определены вектором начальных адресов оператора read_while. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Приращение адресов задает вектор адресных приращений оператора чтения. Данные поступают на выход А канала макропамяти. Чтение происходит до тех пор, пока на вход Z канала не поступит логическая единица.
Команда чтения данных по внешнему адресу
Команда чтения данных по внешнему адресу предназначена для чтения потоков данных из распределенной памяти по адресу, две части которого поступают на входы Z1 и Z2 канала макропамяти. Для организации чтения данных по внешнему адресу следует использовать оператор read, у которого вместо имени вектора начальных адресов используется ключевое слово extern. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Данные поступают на выход А канала макропамяти.
Команда чтения данных с внешним приращением
Команда чтения данных с внешним приращением предназначена для чтения данных из распределенной памяти по адресу, который является вектором начальных адресов оператора read. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Для организации чтения данных с внешним приращением следует использовать оператор read, у которого вместо имени вектора адресных приращений используется ключевое слово extern. Значение приращения поступает на входы Z1 и Z2 канала макропамяти. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Данные поступают на выход А канала макропамяти.
2.4. Команда записи данных
Команда записи данных предназначена для записи потока данных в распределенную память по адресам, начальные адреса определены вектором начальных адресов оператора write или write_mod. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Приращение адресов задает вектор адресных приращений оператора записи. Данные поступают на вход А канала макропамяти. Формат команд записи данных рассмотрен в табл. 2.
Команда записи данных по типу while
Команда записи данных по типу while предназначена для записи потоков данных неопределенного разряда в распределенную память, начальный адрес определяется вектором начальных адресов оператора write_while. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Приращение адресов задает вектор адресных приращений оператора записи. Данные поступают на вход А канала макропамяти. Циклы записи происходят до тех пор, пока на вход Z канала не поступит логическая единица.
Команда записи данных по внешнему адресу
Команда записи потоков данных по внешнему адресу предназначена для записи данных в распределенную память по адресу, две части которого поступают на входы Z1 и Z2 канала макропамяти. Для организации записи данных по внешнему адресу следует использовать оператор write, у которого вместо имени вектора начальных адресов используется ключевое слово extern. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Данные поступают на вход А канала макропамяти.
Команда записи данных с внешним приращением
Команда записи потоков данных с внешним приращением предназначена для записи потоков данных в распределенную память, начальный адрес определяется вектором начальных адресов оператора write. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Для организации записи данных с внешним приращением следует использовать оператор write, у которого вместо имени вектора адресных приращений используется ключевое слово extern. Значение приращения поступает на входы Z1 и Z2 канала макропамяти. Этот оператор должен относиться к той же странице распределенной памяти, в которую загружена макропамять. Данные поступают на вход А канала макропамяти.
2.5. Описание структурных компонент
Описание структурного компонента кадра представляет собой следующую конструкцию:
Structure имя_кадра
in список_ формальных_параметров_входов;
out список_формальных_параметров_выходов;
совокупность_обращений_к_структурным_конструкциям:
endstructure;
Директива STRUCTURE отмечает начало структурного компонента кадра, в теле которого могут находиться макрооперации, макрообращения или структурные компоненты кадра. Обращение к макрооперации осуществляется по следующему формату:
Имя_макрооперации(список_фактических_параметров);
В результате подстановки фактических параметров кадра в фактические параметры макрообращения определяются связи между компонентами системы, которые транслятор реализует в пространственно-коммутационной системе. Таким образом, программист может быть освобожден от программирования коммутатора.
2.6. Описание кадров
Кадр - это совокупность программных секций контроллера распределенной памяти, выполнение которых должно происходить одновременно. Обычно программа разбивается на множество кадров, которые последовательно вызываются во время работы программы. В минимальном варианте программа состоит из одного кадра. Отсутствие конструкции «Кадр» в исходном тексте параллельно-конвейерной программы является семантической и синтаксической ошибкой.
Описание кадра представляет собой следующую конструкцию:
CADR имя_кадра
<Список операторов>
ENDCADR;
Директива CADR отмечает начало кадра. Все внутренние операторы контроллера памяти должны находиться только внутри кадра. Все внешние операторы, за исключением оператора STOP, должны располагаться только вне кадра. Директивы присваивания, описание типов данных, директивы общего назначения могут находиться как внутри, так и вне кадра. Заканчивается описание кадра директивой ENDCADR.
Программирование распределенной памяти
Список конструкций программирования контроллера распределенной памяти включает в себя директивы и операторы. Директивы контроллера памяти - это группа конструкций языка ассемблер, которые формируют структуру программ для контроллера на этапе их ассемблирования.
Рассмотрим директивы контроллера распределенной памяти. При решении задачи часть модулей может не использоваться. Директивой MODULE задается тот ресурс, который требуется для решения текущего задания.
Формат директивы MODULE имеет следующий вид:
MODULE БМ0[,БМ1[,...[,БМi]]];
где БМi ::= номер базового модуля.
Число указывает абсолютный номер базового модуля.
Каждый базовый модуль содержит определенное количество модулей распределенной памяти или страниц. При обращении к странице контроллера распределенной памяти вначале указывается номер базового модуля, которому она принадлежит, а затем ее номер. При загрузке данных и программ в распределенную память необходимо указать конкретный номер страницы памяти, для которого эта информация предназначена. В операторе загрузки должен быть указан номер лишь одной страницы контроллера распределенной памяти. Отмена выбора текущей страницы контроллера распределенной памяти происходит автоматически при выборе новой страницы.
Операторы контроллера распределенной памяти подразделяются на внутренние и внешние.
1. Внутренние операторы
Внутренние операторы контроллера распределенной памяти всегда должны быть расположены только в теле кадра. Эти операторы загружаются непосредственно в память той страницы, в которой они используются. Операторы составляют три группы: операторы обращения к памяти данных, операторы пересчета параметров и операторы управления.
Операторы обращения могут быть операторами чтения и операторами записи.
В общем случае любой внутренний оператор контроллера распределенной памяти состоит из директивы, определяющей принадлежность оператора к определенному логическому номеру базового модуля и логическому номеру контроллера распределенной памяти и самого внутреннего оператора.
Cadr Cadr1
DMC[БМ , КРП]#
Read a Step 1 repeat 2;
EndCadr;
где DMC – директива, определяющая принадлежность оператора;
БМ – логический номер базового модуля МВС;
КРП – логический номер контроллера распределенной памяти;
READ – внутренний оператор контроллера распределенной памяти.
Операторы обращения могут быть операторами чтения и операторами записи. По типу адресации операторы делятся на операторы с инкрементной адресацией и операторы с пороговой адресацией. По типу данных различаются операторы чтения/записи чисел и операторы чтения/записи макроопераций и макрокоммутаций.
Формат оператора чтения с инкрементной адресацией имеет вид:
read ВНА [step ВАП [repeat АПЦ]], [чтение чисел].
Чтение потока чисел осуществляется одновременно по всем каналам. Количество циклов чтения определяется параметром цикла. Если читается один вектор, то параметры step и repeat могут отсутствовать. Начальные адреса чисел массива определяет параметр вектора начальных адресов (ВНА). На первой итерации исполнения оператора числа извлекаются из ячеек памяти каналов памяти данных, адреса которых заданы вектором начальных адресов. После выполнения оператора будет осуществлен переход к следующему оператору.
Оператор записи c инкрементной адресацией:
write ВНА [step ВАП [repeat АПЦ]]; [запись чисел].
Запись потока чисел осуществляется одновременно по всем каналам. Количество циклов записи определяется значением расположенным по адресу указанном в параметре АПЦ. Если читается один вектор, то параметры step и repeat могут отсутствовать. Начальные адреса чисел массива определяет параметр ВНА. На первой итерации исполнения оператора числа помещаются в ячейки памяти каналов памяти данных, адреса которых заданы вектором ВНА. После выполнения оператора будет осуществлен переход к следующему оператору.
Оператор чтения c пороговой адресацией:
read_mod ВНА [step ВАП [repeat АПЦ]]; [чтение чисел].
Оператор выполняет чтение чисел с пороговой адресацией. Чтение чисел осуществляется одновременно по всем каналам. Количество циклов чтения/записи определяется параметром цикла. Если во время выполнения оператора чтения с пороговой адресацией текущий адрес данных достиг значения А0, то после этого значению нового адреса присваивается значение регистра BASE.
Оператор записи c пороговой адресацией:
write_mod ВНА [step ВАП [repeat АПЦ]]; [запись чисел].
Оператор выполняет чтение/запись чисел с пороговой адресацией. Запись чисел осуществляется одновременно по всем каналам. Количество циклов записи определяется параметром цикла. Если во время выполнения оператора записи с пороговой адресацией текущий адрес данных достиг значения А0, то после этого значению нового адреса присваивается значение регистра BASE.
Оператор CONTINUE:
continue ВАП [repeat АПЦ ];
Оператор предназначен для организации вложенных циклических обращений к данным. Используется только после операторов чтения (записи) данных.
Оператор чтения по типу WHILE:
read_while ВНА [step ВАП];
Оператор выполняет чтение массива данных до тех пор, пока на управляющий вход не поступит логическая единица.
Оператор записи по типу WHILE:
write_while ВНА [step ВАП];
Оператор выполняет запись массива данных до тех пор, пока на управляющий вход не поступит логическая единица.
Оператор чтения по внешнему адресу:
Read Extern [repeat АПЦ];
Оператор выполняет чтение данных по адресу, пришедшему по внешнему адресному входу.
Оператор записи по внешнему адресу:
Write Extern [repeat АПЦ];
Оператор выполняет запись данных по адресу, пришедшему по внешнему адресному входу.
Оператор чтения с внешним приращением:
Read ВНА Step Extern [repeat АПЦ];
Оператор выполняет чтение данных по заданному адресу с приращением, пришедшим по внешнему адресному входу.
Оператор записи с внешним приращением:
Write ВНА Step Extern [repeat АПЦ];
Оператор выполняет запись данных по заданному адресу с приращением, пришедшим по внешнему адресному входу.
Оператор чтения строк:
Read_String BHA [size N];
Оператор производит чтение данных, начиная с начального адреса, размера N. Эти данные представляют собой неразрывную конструкцию, начало и конец которой помечены начальным и концевым маркерами (соответственно BM и EM), в отличие от чтения чисел, где маркером отмечено каждое число.
Оператор записи строк:
Write_String BHA [size N];
Оператор производит запись данных, начиная с начального адреса, размера N. Эти данные представляют собой неразрывную конструкцию, начало и конец которой помечены начальным и концевым маркерами, соответственно BM и EM, в отличие от записи чисел, где маркером отмечено каждое число. Элементы строки передаются плотным потоком, то есть разрыв между элементами строки недопустим. Строки обрабатываются с помощью специальных прошивок, реализованных на схемотехническом уровне.
Помимо рассмотренных операторов, используемых для программирования контроллера распределенной памяти (см. табл. 2), используются групповые операторы, которые предназначены для работы с массивами адресов, и операторы пересчета параметров и управления. При использовании групповых операторов программист освобождается от указания директивы принадлежности оператора к определенной странице памяти, для которой будет выполняться данный оператор. В табл. 3 приведены форматы групповых операторов обращения.
Поле <Параметр> определяет диапазон работы оператора, в котором указываются начальный индекс в массиве адресов и конечный индекс. В качестве параметра МАС для групповых операторов может выступать переменная типа Vector, Stream или Array. Использование в качестве параметра MAC переменной другого типа является синтаксической ошибкой.
Таблица 3 Форматы групповых операторов обращения
М-код
|
Формат
|
Действие
|
GROUPREAD
|
GroupRead MAC [<Параметры>];
|
Чтение массива чисел с инкрементной адресацией
|
GROUPWRITE
|
GroupWrite MAC [<Параметры>];
|
Запись массива чисел с инкрементной адресацией
|
Групповой оператор чтения:
GroupRead МАС (StartIndex TO EndIndex);
Оператор выполняет чтение данных по адресам, указанным в поле МАС, начиная с позиции, указанной в поле StartIndex, до элемента массива с индексом EndIndex.
Групповой оператор записи:
GroupWrite МАС (StartIndex TO EndIndex);
Оператор выполняет запись данных по адресам, указанным в поле МАС, начиная с позиции, указанной в поле StartIndex, по элемент массива с индексом EndIndex.
2. Операторы пересчета параметров и управления
Операторы пересчета выполняют модификацию данных в сегментах памяти РВС. Операторы пересчета делятся на следующие операторы:
- оператор арифметического сдвига;
- оператор модификации данных сегмента памяти цикла.
Операторы арифметического сдвига
Формат_оператора__Действие'>Формат оператора арифметического сдвига влево:
ShiftL ВНА, vector1;
Оператор выполняет арифметический сдвиг влево содержимого ячейки сегмента памяти параметров, указанной в поле ВНА, на количество бит, указанное в поле vector1.
Формат оператора арифметического сдвига вправо:
ShiftR ВНА, vector1;
Оператор выполняет арифметический сдвиг вправо содержимого ячейки сегмента памяти параметров, указанной в поле ВНА, на количество бит, указанных в поле vector1.
Операторы модификации данных сегмента памяти циклов
Операторы модификации сегмента памяти циклов можно разделить на следующие группы:
- операторы сложения;
- операторы пересылки данных между сегментом памяти циклов и сегментами данных и параметров;
- операторы взаимодействия сегмента памяти цикла с регистрами.
Операторы сложения.
Формат оператора сложения ячеек сегмента памяти цикла выглядит следующим образом:
AddSC ВНА1, ВНА2;
Оператор сложения выполняет сложение содержимого ячейки, адрес которой указан в поле ВНА1, с ячейкой, указанной в поле ВНА2. Результат сложения записывается в сегмент памяти цикла по адресу, указанному в поле ВНА1.
Операторы пересылки данных между сегментом памяти циклов и сегментами данных и параметров
Общий формат операторов перемещения данных выглядит следующим образом:
<Имя оператора> ВНА1, ВНА2;
Операторы пересылки данных между сегментами памяти РВС выполняют замещение содержимого ячейки, расположенной по адресу, указанному в поле ВНА1, на содержимое ячейки, указанной в поле ВНА2. Направление пересылки данных определяется типом оператора.
В табл. 4 представлен список операторов перемещения данных с указанием направления при перемещении данных.
Таблица 4 Операторы пересылки данных
Формат оператора
|
Действие
|
MoveCP ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти цикла на ячейку из сегмента памяти параметров
|
MoveDP ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти данных на ячейку из сегмента памяти параметров
|
MovePP ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти параметров на ячейку из сегмента памяти параметров
|
MoveCD ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти цикла на ячейку из сегмента памяти данных
|
MoveDD ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти данных на ячейку из сегмента памяти данных
|
MovePD ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти параметров на ячейку из сегмента памяти данных
|
MoveCC ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти цикла на ячейку из сегмента памяти цикла
|
MoveDC ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти данных на ячейку из сегмента памяти цикла
|
MovePC ВНА1, ВНА2;
|
Выполняет модификацию ячейки сегмента памяти данных на ячейку из сегмента памяти цикла
|
Операторы взаимодействия сегмента памяти цикла с регистрами
Как рассматривалось ранее, в языке ARGUS v.0 введено восемь регистров: регистр базы (BASE), регистр возврата (RETURN_REG), регистр состояния (STATUS), регистр операторов (OPER_SEG), регистр параметров (PARAM_SEG), регистр данных (DATA_SEG), пороговый регистр (MOD_REG) и сегмент макроинструкций (MACRO_SEG). Для получения доступа к содержимому этих регистров и их взаимодействия с сегментом памяти циклов в язык ассемблер введены операторы чтения и записи регистров.
Формат оператора чтения регистра:
move_regSC BHA, имя_регистра;
Оператор производит чтение содержимого указанного регистра и записывает полученные данные в сегмент памяти циклов по адресу, указанному в поле ВНА.
Формат оператора записи регистра:
move_regSC имя_регистра, BHA;
Оператор производит запись данных из сегмента памяти циклов, хранящихся по адресу, указанному в поле ВНА, в соответствующий регистр.
Формат оператора записи регистра:
<Имя оператора> BHA;
Оператор выполняет пересылку данных, расположенных по адресу, указанному в поле ВНА, из сегмента памяти, соответствующего имени используемого оператора, в регистр общего назначения. Для работы с регистром общего назначения (AOP) в язык ARGUS введены операторы пересылки данных в регистр общего назначения, представленные в табл. 5.
Таблица 5 Операторы пересылки данных в регистр общего назначения
Формат оператора
|
Действие
|
MovePAop ВНА;
|
Выполняет пересылку содержимого ячейки сегмента памяти параметров в регистр общего назначения
|
MoveDAop ВНА;
|
Выполняет пересылку содержимого ячейки сегмента памяти данных в регистр общего назначения
|
Операторы чтения регистра
В язык ассемблер введено восемь регистров: регистр базы (BASE), регистр возврата (RETURN_REG), регистр состояния (STATUS), регистр операторов (OPER_SEG), регистр параметров (PARAM_SEG), регистр данных (DATA_SEG), пороговый регистр (MOD_REG) и сегмент макроинструкций (MACRO_SEG). Для получения доступа к содержимому этих регистров в язык ассемблер введены операторы чтения регистров.
Формат оператора чтения регистра:
move_reg [@]BHA, имя_регистра;
Оператор производит чтение содержимого указанного регистра и записывает полученные данные по адресу, который содержится в векторе начальных адресов. Для этого оператора можно использовать косвенную адресацию.
Формат оператора записи регистра:
move_reg имя_регистра,[@]BHA.
Оператор производит запись данных, хранящихся по адресу, содержащемуся в ВНА, в соответствующий регистр. Для этого оператора можно использовать косвенную адресацию.
4. Операторы пересчета параметров
Операторы пересчета параметров представлены в табл. 6.
Таблица 6 Операторы пересчета параметров
Формат
|
Действие
|
Сложение
add vector1, vector 2;
|
Пересчет вектора (vector1). Пересчет вектора адресов (приращений адресов).
|
Пересылка
Move vector1, vector2;
Move vector1,@ vector2;
|
Пересылка вектора
Пересылка вектора по косвенному адресу
|
Сложение полей оператора
AddoSH метка, ВАП;
AddoS метка, ВАП;
AddoJ метка, ВАП;
AddoM метка, ВАП;
|
Модернизация поля SH
Модернизация поля S
Модернизация поля J
Модернизация поля M
|
Замещение полей оператора
MoveSH метка, ВАП;
MoveS метка, ВАП;
MoveJ метка, ВАП;
MoveM метка, ВАП;
|
Замещение поля SH
Замещение поля S
Замещение поля J
Замещение поля M
|
Очистка полей оператора
ClrSH метка;
ClrS метка;
ClrJ метка;
ClrM метка;
|
Очистка поля SH
Очистка поля S
Очистка поля J
Очистка поля M
|
Оператор сложения:
Add vector1, vector 2.
Оператор выполняет сложение vector1 с vector2 и результат помещает в vector1.
Оператор пересылки
MOVE приемник, источник;
Действие оператора состоит в пересылке содержимого операнда-источника в операнд-приемник. В качестве источника может выступать либо непосредственно вектор данных, либо вектор, содержащий адреса памяти данных, по которым хранятся пересылаемые данные. В первом случае выполнение оператора заключается в том, что содержимое источника переписывается в приемник. Во втором случае содержимое памяти данных, адреса ячеек которой задает источник, переписывается в приемник.
Оператор сложения поля смещения:
addoSH метка, ВАП.
Оператор выполняет сложение соответствующего поля смещения операнда с нулевым элементом операнда ВАП.
Оператор сложения поля цикла:
addoS метка, ВАП.
Оператор выполняет сложение соответствующего поля цикла операнда с нулевым элементом операнда ВАП.
В данном случае также достаточно задать лишь нулевой элемент вектора, так как остальные элементы ВАП данным оператором использоваться не будут.
Оператор сложения поля метки:
addoJ метка, ВАП.
Оператор выполняет сложение соответствующего поля метки операнда с нулевым элементом операнда ВАП.
Оператор сложения поля модификации:
addoM метка, ВАП.
Оператор выполняет сложение соответствующего поля модификации операнда с нулевым элементом операнда ВАП.
Оператор замещения поля смещения:
moveSH метка, [@]ВАП.
Оператор выполняет замещение поля смещения операнда нулевым элементом операнда ВАП.
Оператор замещения поля цикла:
moveS метка, [@]ВАП.
Оператор выполняет замещение поля цикла операнда нулевым элементом операнда ВАП.
В данном случае также достаточно задать лишь нулевой элемент вектора, так как остальные элементы операнда данным оператором использоваться не будут.
Оператор замещения поля метки:
moveJ метка, [@]ВАП.
Оператор выполняет замещение поля метки операнда нулевым элементом операнда ВАП.
Оператор замещения поля модификации:
moveM метка, [@]ВАП.
Оператор выполняет замещение поля модификации операнда нулевым элементом операнда ВАП.
Оператор очистки поля смещения:
ClrSH метка.
Оператор выполняет очистку поля смещения оператора.
4. Операторы управления
Группа операторов управления включает следующие операторы:
-
оператор безусловного перехода;
-
оператор паузы;
-
оператор цикла;
-
условный оператор.
Операторы управления приведены в табл. 7.
Таблица 7 Операторы управления
Окончание табл. 7
|
Название
|
Формат
|
Действие
|
Оператор безусловного перехода
|
Goto J;
|
Безусловный переход по адресу J
|
Оператор паузы
|
Pause N;
|
Задержка выполнения
программы на N тактов
|
Оператор цикла
|
Loop S [goto J];
|
Оператор цикла
|
Условный оператор:
|
IFP A goto J;
|
Выполняет проверку ячейки сегмента памяти параметров и выполняет переход по значению ячейки А
|
Условный оператор:
|
IFD A goto J;
|
Выполняет проверку ячейки сегмента памяти данных и выполняет переход по значению ячейки А
|
Оператор безусловного перехода:
Goto J;
При выполнении оператора безусловного перехода выполняется переход к оператору, помеченному меткой J. Частными случаями оператора goto являются операторы call и return.
Формат оператора call:
call J;
Данный оператор выполняет переход по метке J с сохранением значения адреса в стек. Данный оператор используется для организации подпрограмм.
Формат оператора return:
return;
Данный оператор извлекает адрес из регистра и выполняет переход по полученному адресу. Данный оператор используется для возврата из подпрограмм.
Оператор паузы:
Pause N;
Действие этого оператора заключается в том, что выполняется задержка исполнения программы в контроллерах распределенной памяти на N тактов.
Оператор цикла:
Loop S [goto J]
Формат оператора условного перехода:
<Имя оператора> ВНА goto J;
Действие условного оператора заключается в том, что происходит проверка содержимого ячейки памяти, адрес которой указан в поле ВНА. Если она содержит нулевое значение, то происходит переход по метке J, иначе выполняется следующий оператор. Адрес, указанный в поле ВНА, может принадлежать как сегменту памяти параметров, так и сегменту памяти данных.
Формат структуры описания адресной коммутации:
Acommutation <Имя_Коммутации>;
chan0 (<Номер Бита_0>, …<Номер Бита_15>);
chan1 (<Номер Бита_0>, …<Номер Бита_15>);
Endacom;
Для использования коммутации в исполняемом кадре предусмотрены оператор загрузки коммутации LOADACOM и оператор управления коммутацией LOADBCOM. Формат оператора LOADACOM следующий:
LOADACOM <Имя_Коммутации>;
Коммутация должна быть предварительно описана. Загруженная для данного контроллера распределенной памяти коммутация используется до загрузки новой коммутации или до подачи команды сброса коммутации.
Формат оператора LOADBCOM следующий:
LOADBCOM <Имя_Переменной>;
Оператор LOADBCOM выполняет переключение между внешними шинами, подключенными к контроллеру распределенной памяти.
Для сброса адресной коммутации используется оператор сброса, имеющий следующий формат:
RESETACOM;
В результате восстанавливается естественный порядок бит адреса.
Операторы загрузки и сброса могут также использоваться в групповых операциях для группы контроллеров распределенной памяти.
5. Внешние операторы контроллера распределенной памяти
В табл. 9 приведены форматы внешних операторов контроллера памяти. Отличительная особенность этих операторов в том, что они не могут помечаться метками.
Таблица 9 Форматы внешних операторов КРП
Формат
|
Действие
|
Операторы: ввод
input ВНА [step ВАП] [channels ВВК] [repeat КЦ] data {числовой_ряд};
input ВНА [step ВАП] [channels ВВК] [repeat КЦ] file "имя_файла";
- вывод
output ВНА [step ВАП] [channels ВВК] [repeat КЦ] file "имя_файла";
|
Ввод данных непосредственный
Ввод данных из внешнего файла
Вывод данных в файл (данные не преобразованы)
|
Ввод чисел непосредственно из исходного текста программы выполняется оператором, имеющим следующий формат:
input ВНА [step ВАП] [channels ВВK][repeat КЦ] data {числовой_ряд};
где числовой_ряд ::= набор чисел, разделенных запятыми, или набор выражений.
Константа цикла здесь задает количество вводимых векторов чисел. Когда требуется вводить числа из отдельного файла, оператор записывается в следующем виде:
input ВНА [step ВАП] [channels ВВК] [repeat КЦ] file "имя_файла";
где имя_файла ::= строка_символов.
Оператор OUT осуществляет вывод в файл содержимого памяти данных.
Формат оператора имеет вид:
output ВНА [step ВАП] [channels ВВК] [repeat КЦ] file "имя_файла";
В языке ARGUS v.0 различают два вида операторов ввода/вывода: внешние операторы и внутренние операторы.
Операторы, располагающиеся вне кадра и управляющие работой контроллера распределенной памяти извне, называются внешними. Внешнее управление выполняет программа "Загрузчик векторов прерываний" совместно с контроллером обмена.
Внешние операторы делятся на операторы ввода-вывода и операторы управления заданием. Операторы ввода-вывода выполняют загрузку/выгрузку данных в/из памяти данных в контроллер распределенной памяти. Данными могут быть как числа, так и адреса. Загрузка может происходить как во все каналы, так и в определенные. Это ограничение накладывается вектором выбираемых каналов. Числа могут вводиться в двух вариантах: либо непосредственно из исходной программы, либо из внешнего файла. Файл, из которого будут считываться данные при вводе, должен быть двоичным. Когда данные задаются непосредственно в тексте программы, то они могут быть представлены в любой системе счисления, поддерживаемой языком ARGUS v.0. Операторы ввода-вывода могут быть расположены всегда только вне кадра, в так называемом "межкадровом пространстве". Если оператор ввода/вывода стоит до первой директивы CADR, то оператор называется "Оператором начальной загрузки (выгрузки)". Когда оператор ввода/вывода размещен между кадрами, то есть его выполнение должно произойти по окончании некоторого кадра, то оператор называется "Оператором загрузки (выгрузки)". При обнаружении такого оператора ARGUS V.0 устанавливает последнему оператору предыдущего кадра признак перехода с ОСТАНОВОМ. Тогда, если программа запущена, то после исполнения оператора с таким типом перехода в текущем кадре выполнится ОСТАНОВ во всех контроллерах памяти, и обработчик векторов прерываний выполнит ввод/вывод в/из контроллера, номер которого был задан в программе. По окончании операций ввода/вывода загрузчиком будет выработан общий ПУСК для продолжения работы платы базового модуля. Номер контроллера задается так же, как и при программировании кадров.
Ввод/вывод может выполняться как во все каналы контроллера памяти, так и по выборочным каналам. Внешние параметры в операторах ввода не допускаются, когда данные вводятся непосредственно. Если же ввод или вывод осуществляются из внешнего файла, параметры операторов ввода/вывода могут быть и внешними.
Так как константа цикла в операторах ввода/вывода не может быть подвергнута модификации, то в этом поле допускается использовать как идентификаторы, так и числа, и выражения.
Операторы, располагающиеся внутри кадра и управляющие работой контроллера распределенной памяти изнутри, называются внутренними. К внутренним управляющим операторам относят оператор чтения данных из канала памяти и оператор записи данных в канал памяти.
Достарыңызбен бөлісу: |