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