Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции!!!.doc
Скачиваний:
9
Добавлен:
27.09.2019
Размер:
1.76 Mб
Скачать
  1. Реализация вызовов процедур

1) BAL – Branch and Link

Записали в спец регист адр. Возврата, следить, чтобы его не попотили

2) Аппетит считаем во время трансляци. Память бывает динамической и статической. Статика – всё, что статической памяти, но без массивов. Запомнить всё, что нужно – 30 –40 тактов.

Вызов:

  1. Отхватить data в стеке процедур (см.шапку А)

  2. Пусть из А вызыв Б, нужно определ. Кол-во места для Б.Строим динамическую цепочку (в сегменте данных процесса есть стек процедур)

  3. Запомнить все нужные регистрв

  4. Передаем параметры (Z,R – через соотв.теки, остальное через адр. стек)

  5. Передать управлен

Возврат

  1. Переход обратно

  2. Восстан. Регистры

  3. На врехушку стека возвращ зн-ие

  4. Передаем упр-е

  1. Сoroutine - сопрограмма

Полный детерменизм во время написания, никакого стека, команда transfer

  1. Парал. Процессы

У кажд.процесса свой сегмент данных.Никакого стека. Есть 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

П@ - с верхушки стека целых записать в память, куда указывает адресный регистр

КЦ – конец цикла

Т ак плохо: на каждой итерации читаем адрес начала массива. Улучшение:

to 1000 do f(x)

Пусть для f(x) нужно 4 регистра. А если свободны только 2? Перед каждым вызовом нужно освобождать 2 регистра, а после вызова – их восстанавливать. Получаем "толкотню" регистров.

Решение: выгружаем регистры только когда стек близок к переполнению, загружаем обратно только когда стек близок к опустошению. Временем подкачки-откачки регистров можно пренебречь.

Пример.

Пусть процедуре А нужно 7 регистров, процедуре В – 8, процедуре С – 3. Пусть из процедуры А мы вызываем В, потом из В вызываем С. Сначала свободны все 16 регистров. При вызове А, потом В занимаем 15 из них. Процедура С "видит", что ей не хватит двух регистров. Выгружаем регистры не В, а А. При возвращении из С в В все регистры В будут с стеке.

Итог:

Регистры занимаются циклически. В каждом стеке есть указатели верхушки и дна. Освобождаем регистры от дна, заполняем от верхушки. При трансляции считается, сколько процедуре нужно будет регистров. При исполнении проверяется, хватит или не хватит регистров.