Project

General

Profile

Обзор работы с индексными регистрами » History » Version 48

krufter_multiclet, 07/12/2013 10:44 AM

1 1 krufter_multiclet
h1. Обзор работы с индексными регистрами
2 1 krufter_multiclet
3 3 krufter_multiclet
Индексные регистры используются для косвенной адресации. Логическая структура индексного регистра:
4 4 krufter_multiclet
5 5 krufter_multiclet
| *Номера битов*| 63..48       | 47..32      | 31..0      |
6 5 krufter_multiclet
| *Обозначение* | Индекс(Index)| Маска(Mask) | База(Base) | 
7 6 krufter_multiclet
8 20 krufter_multiclet
Для обращения к какому-либо регистру данного типа используются номера от 32 до 39.
9 6 krufter_multiclet
Имен у данного типа регистров нет. В общем случае (см. исключения в описании конкретной
10 6 krufter_multiclet
команды в разделе «Система команд ассемблера») при использовании регистра данного типа в 
11 6 krufter_multiclet
качестве аргумента операции значение этого аргумента формируется согласно следующему
12 6 krufter_multiclet
алгоритму:
13 7 krufter_multiclet
14 1 krufter_multiclet
1. вычисление исполнительного адреса, согласно следующей формуле:
15 7 krufter_multiclet
_Address_ = _Index_ + _Base_
16 8 krufter_multiclet
17 6 krufter_multiclet
2. обращение к памяти данных по исполнительному адресу для чтения/записи 
18 6 krufter_multiclet
значения аргумента согласно типу используемой команды.
19 9 krufter_multiclet
20 20 krufter_multiclet
Модификация значения индексного регистра осуществляется аппаратно по завершению
21 6 krufter_multiclet
параграфа в том случае, если установлен соответствующий бит регистра MODR маски 
22 1 krufter_multiclet
изменения индексных регистров (см. раздел «Регистры управления»), согласно следующей 
23 6 krufter_multiclet
формуле:
24 7 krufter_multiclet
_Index_ = ((_Index_ | ∼ _Mask_ ) + 1) & _Mask_,
25 6 krufter_multiclet
где | — операция побитового «ИЛИ», & — операция побитового «И», ∼ — операция 
26 6 krufter_multiclet
побитового инвертирования.
27 6 krufter_multiclet
В двух выше приведённых формулах используется целочисленная 32-х разрядная 
28 1 krufter_multiclet
арифметика. Значения старших 16 разрядов (с 16 по 31) полей Индекс (Index) и Маска 
29 1 krufter_multiclet
(Mask)заполняются нулями.
30 10 krufter_multiclet
31 16 krufter_multiclet
Рассмотрим подробнее работу с индексными регистрами мультиклеточного процессора.
32 11 krufter_multiclet
33 46 krufter_multiclet
*1) Отличие индексных регистров от РОНов*
34 11 krufter_multiclet
35 11 krufter_multiclet
В командах ассемблера, при использовании РОНов(регистров общего назначения) в качестве аргумента,
36 11 krufter_multiclet
происходит работа с текущим значением РОНа. Например:
37 11 krufter_multiclet
38 11 krufter_multiclet
<pre>
39 11 krufter_multiclet
pre:
40 11 krufter_multiclet
    getl 5
41 11 krufter_multiclet
    setl #1, @1
42 12 krufter_multiclet
    jmp paragraph1
43 11 krufter_multiclet
complete
44 11 krufter_multiclet
45 11 krufter_multiclet
paragraph1:
46 47 krufter_multiclet
    getl 5
47 47 krufter_multiclet
    addl @1, #1
48 11 krufter_multiclet
    setl #1, @1
49 11 krufter_multiclet
    jmp paragraph2
50 11 krufter_multiclet
complete
51 11 krufter_multiclet
</pre>
52 13 krufter_multiclet
53 20 krufter_multiclet
В параграфе "pre" мы положили в первый РОН значение "5". В параграфе "paragraph1" командой "addl" 
54 17 krufter_multiclet
выполнится сложение, результат которого(5+5=10) запишется в первый РОН. 
55 14 krufter_multiclet
56 20 krufter_multiclet
В командах ассемблера, при использовании индексных регистров качестве аргумента,
57 14 krufter_multiclet
происходит работа со значением, размещённым в памяти по адресу который формирует индексный регистр.
58 1 krufter_multiclet
Адрес, формируемый индексным регистром равен сумме _Индекса_ и _Базы_ регистра (_Address_ = _Index_ + _Base_).
59 17 krufter_multiclet
60 17 krufter_multiclet
Рассмотрим пример:
61 17 krufter_multiclet
62 17 krufter_multiclet
<pre>
63 17 krufter_multiclet
pre:
64 18 krufter_multiclet
    getl 4
65 17 krufter_multiclet
    setl #32, @1
66 17 krufter_multiclet
    getl 6
67 17 krufter_multiclet
    wrl @1, @3 
68 17 krufter_multiclet
    jmp paragraph1
69 17 krufter_multiclet
complete
70 17 krufter_multiclet
71 17 krufter_multiclet
paragraph1:
72 48 krufter_multiclet
    getl 5
73 48 krufter_multiclet
    addl @1, #32
74 18 krufter_multiclet
    setl #32, @1
75 17 krufter_multiclet
    jmp paragraph2
76 1 krufter_multiclet
complete
77 1 krufter_multiclet
</pre>
78 18 krufter_multiclet
79 20 krufter_multiclet
В параграфе "pre" мы положили в 32-й индексный регистр значение "4". В этом же параграфе записывается
80 18 krufter_multiclet
в память данных по адресу 4 значение равное 6. В параграфе "paragraph1" командой "addl" 
81 18 krufter_multiclet
выполнится сложение значения, размещённого в памяти данных по адресу, сформированному индексным регистром.
82 18 krufter_multiclet
В нашем случае _Index_ = 0, _Base_ = 4, следовательно адрес в памяти данных будет равен 4.
83 18 krufter_multiclet
По 4 адресу в памяти данных располагается значение 6, т.е. результатом операции "addl" будет число 11 (6+5).
84 18 krufter_multiclet
Результат сложения мы поместим в индексный регистр номер 32.
85 18 krufter_multiclet
86 18 krufter_multiclet
+Примечание:+ команды _setl_ и _getl_ оперируют с самим индексным регистром и не обращаются в память по значению, 
87 18 krufter_multiclet
формируемому индексным регистром. 
88 21 krufter_multiclet
89 46 krufter_multiclet
*2) Автоматический инкремент индексного регистра*
90 21 krufter_multiclet
91 21 krufter_multiclet
Модификация значения индексного регистра осуществляется аппаратно по завершению
92 21 krufter_multiclet
параграфа в том случае, если установлен соответствующий бит регистра MODR маски 
93 21 krufter_multiclet
изменения индексных регистров.
94 22 krufter_multiclet
95 22 krufter_multiclet
Рассмотрим заполнение индексного регистра для модификации:
96 30 krufter_multiclet
97 31 krufter_multiclet
<pre>
98 22 krufter_multiclet
I = (K - N + 1) * L
99 22 krufter_multiclet
M = (K - 1) * L
100 22 krufter_multiclet
B = 0
101 22 krufter_multiclet
102 22 krufter_multiclet
а) К - ближайшее к N число, кратное степени 2, K >= N
103 22 krufter_multiclet
б) 0 <= I < 65536
104 22 krufter_multiclet
в) 0 <= M < 65536
105 22 krufter_multiclet
106 22 krufter_multiclet
где I - Index, M - Mask, B - Base
107 1 krufter_multiclet
N - число итераций
108 23 krufter_multiclet
L - шаг итераций
109 31 krufter_multiclet
</pre>
110 24 krufter_multiclet
111 46 krufter_multiclet
h3. Условия модификации:
112 25 krufter_multiclet
113 24 krufter_multiclet
1) значение индексного регистра только инкрементируется
114 37 krufter_multiclet
(_при достижении последней итерации цикл модификации начинается заново_)
115 24 krufter_multiclet
2) шаг может быть только равным числу кратному степени 2 и не равен нулю.
116 24 krufter_multiclet
(1, 2, 4, 8, 16 ...)
117 32 krufter_multiclet
118 44 krufter_multiclet
База задаёт лишь смещение значений индексного регистра.
119 44 krufter_multiclet
120 45 krufter_multiclet
*3) Рассмотрим модификацию индексного регистра на примерах*
121 26 krufter_multiclet
122 46 krufter_multiclet
h3. а) Пусть необходим счётчик на 10000 итераций с шагом 1.
123 32 krufter_multiclet
124 38 krufter_multiclet
<pre>
125 32 krufter_multiclet
N = 10000, L = 1;
126 32 krufter_multiclet
Найдём значения I, M, B
127 35 krufter_multiclet
128 37 krufter_multiclet
1) I = (K-N+1)*L = (16384-10000+1)*1 = 6385
129 1 krufter_multiclet
К выбиралось как ближайшее к N число кратное степени 2,
130 1 krufter_multiclet
т.е. 2^14 - 16384
131 37 krufter_multiclet
132 37 krufter_multiclet
2) M = (K-1)*L = (16384-1)*1 = 16383
133 37 krufter_multiclet
134 37 krufter_multiclet
3) B = 0
135 38 krufter_multiclet
</pre>
136 37 krufter_multiclet
137 37 krufter_multiclet
Индексный регистр номер 32 будет изменяться от 6385 до 16383, после
138 37 krufter_multiclet
16383 индексный регистр примет значение 0. В результате изменения регистра
139 37 krufter_multiclet
от 6385 до 0 мы получим 10000 итераций с шагом изменения 1 по завершению параграфа.
140 37 krufter_multiclet
141 37 krufter_multiclet
Если задать значение базы, например B = 4, то индексный регистр 32 будет
142 37 krufter_multiclet
изменяться от 6389 до 16387, причём следующее значение после 16387 будет 4.
143 36 krufter_multiclet
144 39 krufter_multiclet
Пример на ассемблере с модификацией индексного регистра будет выглядеть следующим
145 39 krufter_multiclet
образом:
146 39 krufter_multiclet
147 39 krufter_multiclet
<pre>
148 39 krufter_multiclet
set_modr:
149 39 krufter_multiclet
    getl (6385<<16)|16383 //заполняем индекс и маску
150 40 krufter_multiclet
    patch @1, 0 //склеиваем маску индекс и базу в 64 разряда
151 40 krufter_multiclet
    setq #32, @1 //записываем значение в регистр
152 40 krufter_multiclet
    setl #MODR, 1 //разрешаем модификацию первого индексного регистра
153 39 krufter_multiclet
    jmp paragraph64
154 39 krufter_multiclet
complete
155 39 krufter_multiclet
156 39 krufter_multiclet
paragraph64:
157 40 krufter_multiclet
    exa #32 //получаем значение индекс + база
158 40 krufter_multiclet
    je @1, part2 //условный переход, проверка на ноль
159 39 krufter_multiclet
    jne @2, paragraph64
160 39 krufter_multiclet
complete
161 39 krufter_multiclet
</pre>
162 39 krufter_multiclet
163 46 krufter_multiclet
h3. б) Пусть необходим счётчик на 5300 итераций с шагом 4.
164 35 krufter_multiclet
165 41 krufter_multiclet
<pre>
166 35 krufter_multiclet
N = 5300, L = 4;
167 35 krufter_multiclet
Найдём значения I, M, B
168 41 krufter_multiclet
169 41 krufter_multiclet
1) I = (K-N+1)*L = (8192-5300+1)*4 = 11572
170 41 krufter_multiclet
К выбиралось как ближайшее к N число кратное степени 2,
171 41 krufter_multiclet
т.е. 2^13 - 8192
172 41 krufter_multiclet
173 41 krufter_multiclet
2) M = (K-1)*L = (8192-1)*4 = 32764
174 41 krufter_multiclet
175 41 krufter_multiclet
3) B = 0
176 41 krufter_multiclet
</pre>
177 41 krufter_multiclet
178 41 krufter_multiclet
Индексный регистр номер 32 будет изменяться от 11572 до 32764, после
179 41 krufter_multiclet
32764 индексный регистр примет значение 0. В результате изменения регистра
180 41 krufter_multiclet
от 11572 до 0 мы получим 5300 итераций с шагом изменения 4 по завершению параграфа.
181 41 krufter_multiclet
182 41 krufter_multiclet
Если задать значение базы, например B = 6, то индексный регистр 32 будет
183 41 krufter_multiclet
изменяться от 11578 до 32780, причём следующее значение после 32780 будет 6.
184 41 krufter_multiclet
185 41 krufter_multiclet
Пример на ассемблере с модификацией индексного регистра будет выглядеть следующим
186 41 krufter_multiclet
образом:
187 41 krufter_multiclet
188 41 krufter_multiclet
<pre>
189 41 krufter_multiclet
set_modr:
190 41 krufter_multiclet
    getl (11572<<16)|32764 //заполняем индекс и маску
191 41 krufter_multiclet
    patch @1, 0 //склеиваем маску индекс и базу в 64 разряда
192 41 krufter_multiclet
    setq #32, @1 //записываем значение в регистр
193 41 krufter_multiclet
    setl #MODR, 1 //разрешаем модификацию первого индексного регистра
194 41 krufter_multiclet
    jmp paragraph64
195 41 krufter_multiclet
complete
196 41 krufter_multiclet
197 41 krufter_multiclet
paragraph64:
198 41 krufter_multiclet
    exa #32 //получаем значение индекс + база
199 41 krufter_multiclet
    je @1, part2 //условный переход, проверка на ноль
200 41 krufter_multiclet
    jne @2, paragraph64
201 41 krufter_multiclet
complete
202 41 krufter_multiclet
</pre>