.VAR/CIRC abuf[6], bbuf[3], cbuf[5];
Для размещения всех этих буферов в памяти процессора потребуется 6+3+5=14 ячеек памяти. Поскольку первым в директиве объявлен буфер abuf, то он будет кольцевым. Ближайшим числом больше 14 и кратным двум является число 16. Поэтому базовый адрес буфера abuf должен быть кратен 16 (четыре младших значащих разряда будут равны нулю). Базовый адрес буфера bbuf будет следовать сразу за адресом последнего элемента буфера abuf. Аналогично будет размещен и буфер cbuf. Размещение всех этих буферов в памяти процессора показано в табл. 11.2.
Таблица 11.2 Размещение трех буферов в памяти процессора
Имя буфера Элемент буфера Двоичный адрес … abuf abuf[0] XXXXXXXXXX0000 abuf[1] XXXXXXXXXX0001 abuf[2] XXXXXXXXXX0010 abuf[3] XXXXXXXXXX0011 abuf[4] XXXXXXXXXX0100 abuf[5] XXXXXXXXXX0101 bbuf bbuf[0] XXXXXXXXXX0110 bbuf[1] XXXXXXXXXX0111 bbuf[2] XXXXXXXXXX1000 cbuf cbuf[0] XXXXXXXXXX1001 cbuf[1] XXXXXXXXXX1010 cbuf[2] XXXXXXXXXX1011 cbuf[3] XXXXXXXXXX1100 XXXXXXXXXX1101 …Следующий пример показывает использование трех директив для объявления трех различных кольцевых буферов:
.VAR/CIRC abuf[6];
.VAR/CIRC bbuf[3];
.VAR/CIRC cbuf[5];
Поскольку буферы объявлены отдельно, все они будут кольцевыми и не будут объединены. Правила размещения для каждого из этих буферов такие же, как в рассмотренном выше примере для одиночного буфера abuf. Размещение этих буферов в памяти процессора показано в табл. 11.3.
Таблица 11.3 Размещение трех кольцевых буферов в памяти процессора
Имя буфера Элемент буфера Двоичный адрес … abuf abuf[0] XXXXXXXXX00000 abuf[1] XXXXXXXXX00001 abuf[2] XXXXXXXXX00010 abuf[3] XXXXXXXXX00011 abuf[4] XXXXXXXXX00100 abuf[5] XXXXXXXXX00101 … bbuf bbuf[0] XXXXXXXXX01000 bbuf[1] XXXXXXXXX01001 bbuf[2] XXXXXXXXX01010 … cbuf cbuf[0] XXXXXXXXX10000 cbuf[1] XXXXXXXXX10001 cbuf[2] XXXXXXXXX10010 cbuf[3] XXXXXXXXX10011 …Чтобы получить доступ к буферу abuf из программы, необходимо инициализировать индексные регистры DAG и регистры длины буфера следующими инструкциями:
I0 = ^abuf; {Присвоить индексному регистру I0 базовый адрес буфера abuf}
L0 = %abuf; {Присвоить L0 длину буфера abuf}
M0 = 1; {Присвоить модификатору M0 значение наращивания
указателя адреса буфера abuf}
Далее в программе можно читать данные из буфера с помощью инструкции AR=DM(I0, L0) или записывать данные в буфер инструкцией DM(I0, L0)=AR. Естественно, вместо регистра AR могут применяться и некоторые другие регистры процессора. При размещении этих инструкций в цикле каждое обращение к буферу будет автоматически увеличивать индексный регистр адреса I0 на величину M0. При достижении регистром I0 величины, равной L0, индексный регистр I0 вновь загрузится базовым адресом буфера. Таким образом, обращения к буферу будут кольцевыми. Для линейных буферов регистр длины буфера должен быть установлен в ноль.
Директивы PMSEG и DMSEGДанные директивы предназначены для размещения программ и данных в сегментах памяти. Директива PMSEG указывает редактору связей на необходимость разместить все программы и данные модуля в определенном сегменте памяти программ. Директива DMSEG указывает редактору связей на необходимость разместить все структуры данных модуля в определенном сегменте памяти данных. Сегменты должны быть предварительно определены в файле описания архитектуры системного конфигуратора. Директивы PMSEG и DMSEG подобно параметру SEG директив MODULE и VAR имеют следующий формат:
.PMSEG имя_сегмента_pm;
.DMSEG имя_сегмента_dm;
Обычно, чтобы расположить все программы и данные исходного модуля в определенном системным конфигуратором сегменте памяти, необходимо повторить параметр SEG в директиве MODULE и всех директивах VAR внутри модуля. Директивы PMSEG и DMSEG используются для исключения многократного повторения параметров SEG. Директивы PMSEG и DMSEG должны быть размещены в исходном файле программного модуля перед директивой MODULE. Ниже приводится пример, в котором модуль prog1, некоторые буферы и переменную var1 располагают в памяти данных в сегменте с именем seg1:
.DMSEG seg1;
.MODULE/RAM prog1;
.VAR/DM/RAМ/СIRС buf1[15];
.VAR/DM/RAM buf2[5];
.VAR/DM/RAM buf3[5];
.VAR/DM/RAM var1;