Вызов в Самсоне
Парал. Процессы
Сoroutine - сопрограмма
Возврат
1) Переход обратно
2) Восстан. Регистры
3) На врехушку стека возвращ зн-ие
4) Передаем упр-е
Полный детерменизм во время написания, никакого стека, команда transfer
У кажд.процесса свой сегмент данных.Никакого стека. Есть semaphore или жжужалка или мониторы, захваты ресурса, сообщения
Обычно 50 тактов команда вызов, боремся как с вырезкой.
To 1000 do p(x,y) od “толкотня регистров”
Вирт кажд. Процедуру с чистого листа транслировал, а здесь закикл. стек, есть указат на дно и указат на верхушку, освобожд память от дна.(нессиметрич. выгрузка регистров)
Стек выгружает в память, когда близок к переполнению, загружает, когда к истощению. При вызове нумерации меняется, но дыхание стека статически просчитывается внутри процедуры
Сложение регистров – 1 такт, чтение-запись в память – 4-5 такта. Значит, надо работать с регистрами.
В САМСОНе ~ 40 регистров.
Стек регистров:
УК – указатель верхушки стека регистров.
Перенумеровываем регистры: 0-ой – УК, дальше влево – 1, 2 и т.д. Если нужен ещё один регистр, УК сдвигаем вправо. Тот регистр, на который он указывал, становится 0-ым, тот, который был 0-ым, становится первым и т.д. В разные моменты времени один и тот же регистр имеет разные номера.
for i:=1 to N do a[i]:=0
Ч1 – загрузить 1
Ч N – загрузить N
ЦК М8 – проверка
ЧА а – загрузить адрес начала массива
инд1Р – регистровая индексация
Ч0 – загрузить 0
П@ - с верхушки стека целых записать в память, куда указывает адресный регистр
КЦ – конец цикла
Так плохо: на каждой итерации читаем адрес начала массива. Улучшение: