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