While D do E od

Циклы

For I from A by B to C while D do E od

Команды передачи управления

РК – регистр команд - РКОМ

PC – указывает на следующую команду (program counter) - СЧАК

ПБ М16 – переход безусловный на М16 от РК, П1 М16, П0 М16

В0У М8, В1У М8, Н0У М8, Н1У М8 – укороченные в стеке целых

В М16 – вперёд

Н М16 – назад

ВБУ М8, НБУ М8 – укороченные команды

В 0 – переход на следующую команду (переход, считая от РС), ибо PC указывает всегда на следующую команду относительно исполняемой. Можно и ВУ 0.

Н 2 – переход на себя (команда перехода занимает 2 байта)

If усл then … else …

0 – false, 1- true

В0 – перейти по false

В1 – перейти по true

В=, В/=, В<, В<=, В>, В>= - объединение нескольких действий, верхушка стека сравнивается с 0,

“В0У” + “=” = В=У, ост. Ан-но

Если переход произошел, то надо разогнать водопровод (3-4 такта).

ВЫБОР Н8+1 М16 …М16 обрабат до 256 меток. Если “0” то идем по первой метке. Команда должна начинаться с четного адр. (если нечетный то ставим НОП)


  1. Организация циклов

For I to n do E od - 90%, to n do, while D do.

Борьба с циклами – предсказан. переходов

 
 

to N do:

КСЧ – конец по счётчику, вычитает 1 из верхушки стека, если стало 0, выходим.

 
 

Если N было неположительным, то надо сразу уйти. Сделать так:

 
 

Ч N – записать N на стек НСЧ – начало по счётчику: N>0?

ЧР0 – размножить N на стеке

В<= - сравнить N с нулём

(НСЧ

нач:

Е

КСЧ [y]

Кон:

)

М: В0 [y] конец

E

НБ М

Конец:

for i:=1 to N do:

 
 

Ч1 – записать 1 в стек

Ч N – записать N в стек

ЦК – проверяет, что i<=N, если да, то переходим на следующую итерацию цикла.

КЦ – конец цикла, добавляет 1 к подверхушке стека, сравнивает с верхушкой, если <=, то переходим на ЦК КОН

(Нач: ЦИКЛ С8/C16

Е E

КЦ

Кон) КОНЦИКЛ

Поддерживает цик в разн. направлен.


  1. Работа с вырезками

[L1:u1, L2:u2] int A

«Паспорт» массива: хранятся границы и шаги (шаг2 – длина элемента, шаг1 – длина строки), адрес начала массива. При триммерной вырезкеи формируют новый паспорт в другом сегменте памяти. В статике лежит только адр. Массива (из-за того, что сегмент огранич 64 кб -?)

Тогда адрес элемента A[i,j] вычисляется по формуле:

A[i,j] = A' + (i – L1)*шаг1 + (j – L2)*шаг2 =

= A' – L1*шаг1 – L2*шаг2 + i*шаг1 + j*шаг2

С0 = A' – L1*шаг1 – L2*шаг2 – можно вычислить заранее для ускорения работы

В "Самсоне" массивы представляются сегментами.

Длина паспорта – 16 байт.

Для одномерного массива с 2-х байтовыми элементами значения С0 в зависимости от L будут такими:

(С0 = A-L*шаг)

L=0 C0=16; L=1 C0=14; L=-1 C0=18

Если длина элемента 1, то умножать на шаг2 не надо. Если длина элемента 2, то можно сложить. Если длина элемента 4, то надо сдвинуть или два раза сложить.

индБ – байтовый, индЦ – двухбайтовый, индП – четырёхбайтовый.

инд1, инд2, инд – для 1-, 2- и т.д. мерных массивов

Как избавиться от С0: договорились писать массивы от 0 или от 1, С0:=16 (если от 1, то останется дырка в два байта).

Если массив передаётся как параметр процедуре, то мы не знаем, с какими элементами мы работаем. Разделили массивы на «хорошие» – в которых умножать не надо, – и плохие. Для плохих генератор массива возвращает нулевое смещение, т.е. начало паспорта. Для хороших возвращает начало самого массива.

Для хороших массивов вырезка работает за три такта. //Вырезка – наиболее частая операция при умножении матриц, представленных в виде массивов (особенно одномерных).

Контроль за диапазонами индексов: включается или отключается на первом такте. Если включен, то все массивы считаются плохими.

Два режима работы 1) отладочный 2) режим счета


  1. Реализация виртуальной памяти

Впервые введена в языке Ада, ~ 1960 год.

Основная идея: создать иллюзию большой памяти.

Главная особенность: физические адреса нельзя запоминать (так как сегменты могут переместиться).

 
 

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

Физический адрес = адрес начала сегмента + смещение

Преобразование мат. адреса в физический ~ 10 тактов.

НО: обращение к памяти идёт неравномерно (есть небольшой кусок памяти, к которому происходит ~ 90% всех обращений) (Copyright Терехов 2004).

«Фокус» в "Самсоне":

Есть стек адресов – 16 записей по 24 бита.

ЧА – читает мат. адрес, преобразует в физический, записывает его на верхушку стека.

Условие: если на сегмент есть хотя бы одна ссылка из стека адресов, то этот сегмент откачке/перемещению не подлежит (проигрыш невелик).

Если сегментов не хватает, происходит "встряска": пробегаем по сегментам, находим тот, к которому было меньше всего обращений. Его вытесняем во внешнюю память (но с учётом условия)

ПА – по физическому адресу находит математический. Можно просто бежать по всем сегментам и искать, в какой попадает данный физический адрес (чтобы найти № сегмента). В "Самсоне": есть ещё один стек, параллельный стеку адресов (16 записей по 16 бит), в который записывается N сегмента. Тогда команда ПА по номеру сегмента в таблице сегментов находит адрес начала сегмента, вычитает его из физического адреса и получает смещение.


  1. Реализация вызовов процедур

1) BAL – Branch and Link

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

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

Вызов:

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

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

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

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

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: