Обзор работы с индексными регистрами » History » Version 34
« Previous -
Version 34/48
(diff) -
Next » -
Current version
krufter_multiclet, 05/08/2013 03:50 PM
Обзор работы с индексными регистрами¶
Индексные регистры используются для косвенной адресации. Логическая структура индексного регистра:
Номера битов | 63..48 | 47..32 | 31..0 |
Обозначение | Индекс(Index) | Маска(Mask) | База(Base) |
Для обращения к какому-либо регистру данного типа используются номера от 32 до 39.
Имен у данного типа регистров нет. В общем случае (см. исключения в описании конкретной
команды в разделе «Система команд ассемблера») при использовании регистра данного типа в
качестве аргумента операции значение этого аргумента формируется согласно следующему
алгоритму:
1. вычисление исполнительного адреса, согласно следующей формуле:
Address = Index + Base
2. обращение к памяти данных по исполнительному адресу для чтения/записи
значения аргумента согласно типу используемой команды.
Модификация значения индексного регистра осуществляется аппаратно по завершению
параграфа в том случае, если установлен соответствующий бит регистра MODR маски
изменения индексных регистров (см. раздел «Регистры управления»), согласно следующей
формуле:
Index = ((Index | ∼ Mask ) + 1) & Mask,
где | — операция побитового «ИЛИ», & — операция побитового «И», ∼ — операция
побитового инвертирования.
В двух выше приведённых формулах используется целочисленная 32-х разрядная
арифметика. Значения старших 16 разрядов (с 16 по 31) полей Индекс (Index) и Маска
(Mask)заполняются нулями.
Рассмотрим подробнее работу с индексными регистрами мультиклеточного процессора.
1) Отличие индексных регистров от РОНов¶
В командах ассемблера, при использовании РОНов(регистров общего назначения) в качестве аргумента,
происходит работа с текущим значением РОНа. Например:
pre: getl 5 setl #1, @1 jmp paragraph1 complete paragraph1: addl #1, 5 setl #1, @1 jmp paragraph2 complete
В параграфе "pre" мы положили в первый РОН значение "5". В параграфе "paragraph1" командой "addl"
выполнится сложение, результат которого(5+5=10) запишется в первый РОН.
В командах ассемблера, при использовании индексных регистров качестве аргумента,
происходит работа со значением, размещённым в памяти по адресу который формирует индексный регистр.
Адрес, формируемый индексным регистром равен сумме Индекса и Базы регистра (Address = Index + Base).
Рассмотрим пример:
pre: getl 4 setl #32, @1 getl 6 wrl @1, @3 jmp paragraph1 complete paragraph1: addl #32, 5 setl #32, @1 jmp paragraph2 complete
В параграфе "pre" мы положили в 32-й индексный регистр значение "4". В этом же параграфе записывается
в память данных по адресу 4 значение равное 6. В параграфе "paragraph1" командой "addl"
выполнится сложение значения, размещённого в памяти данных по адресу, сформированному индексным регистром.
В нашем случае Index = 0, Base = 4, следовательно адрес в памяти данных будет равен 4.
По 4 адресу в памяти данных располагается значение 6, т.е. результатом операции "addl" будет число 11 (6+5).
Результат сложения мы поместим в индексный регистр номер 32.
Примечание: команды setl и getl оперируют с самим индексным регистром и не обращаются в память по значению,
формируемому индексным регистром.
2) Автоматический инкремент индексного регистра¶
Модификация значения индексного регистра осуществляется аппаратно по завершению
параграфа в том случае, если установлен соответствующий бит регистра MODR маски
изменения индексных регистров.
Рассмотрим заполнение индексного регистра для модификации:
I = (K - N + 1) * L M = (K - 1) * L B = 0 а) К - ближайшее к N число, кратное степени 2, K >= N б) 0 <= I < 65536 в) 0 <= M < 65536 где I - Index, M - Mask, B - Base N - число итераций L - шаг итераций
Условия модификации:
1) значение индексного регистра только инкрементируется
(при достижении последней итерации цикл модификации начинается заново)
2) шаг может быть только равным числу кратному степени 2 и не равен нулю.
(1, 2, 4, 8, 16 ...)
База задаёт лишь смещение значений индексного регистра.
3) Рассмотрим модификацию индексного регистра на примерах¶
а) Пусть необходим счётчик на 10000 итераций с шагом 1.
N = 10000, L = 1;
Найдём значения I, M, B