Обзор работы с индексными регистрами » 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> |