Project

General

Profile

Обзор работы с моделью » History » Version 20

krufter_multiclet, 04/24/2013 02:17 PM

1 6
h1. Обзор работы с моделью
2 6
3 6
Страница в разработке
4 6
5 8 krufter_multiclet
Работа с моделью на данный момент осуществляется из командной строки, в дальнейшем будет использоваться для всего проекта среда Eclipse или Netbeans.
6 8 krufter_multiclet
7 20 krufter_multiclet
[[Система команд(Instruction Set Architecture)]]
8 20 krufter_multiclet
9 9 krufter_multiclet
h2. = Система команд (Instruction Set Architecture) =
10 6
11 10 krufter_multiclet
h3. Формат кодирования команды 
12 6
13 6
Формат AA размер 32 бит:
14 6
15 6
<pre>
16 6
17 6
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0
18 6
 .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  X  X  X  X  X  X -- F2 -- адрес значения 2-ого операнда
19 6
 .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  X  X  X  X  X  X -------------------- F1 -- адрес в коммутаторе значения 1-ого операнда
20 6
 .  .  .  .  .  .  .  .  .  .  .  .  .  .  X  X  X  X  X  X -------------------------------------- t  -- Задержка выдачи результата (тау).
21 6
 .  .  .  .  .  .  .  .  .  .  .  .  .  X -------------------------------------------------------- Резерв.
22 6
 .  .  .  .  .  .  .  .  .  .  .  .  X  ---------------------------------------------------------- Признак инструкции, завершающей параграф.
23 6
 .  .  .  .  .  .  .  .  X  X  X  X -------------------------------------------------------------- TOP -- тип операции.
24 6
 .  .  .  .  .  .  X  X -------------------------------------------------------------------------- Суффикс:
25 6
 .  .  .  .  .  .                                                                                   0X - формат AA
26 6
 .  .  .  .  .  .                                                                                   00 - F2 содержит адрес коммутатора
27 6
 .  .  .  .  .  .                                                                                   01 - F2 содержит номер регистра
28 6
 X  X  X  X  X  X -------------------------------------------------------------------------------- COP -- код операции.
29 6
</pre>
30 6
31 6
Формат AV размер 64 бит.
32 6
Старшая часть имеет такую же структуру как и формата AA, младшие 32 бита -- значение поля V.
33 6
34 16 krufter_multiclet
*= Типы операций =*
35 6
36 6
Тип операции задается кодом в поле `TOP`.
37 6
38 6
Правило кодирования типов содержащих значение в целочисленном представлении.
39 6
40 6
<pre>
41 6
3 2 1 0
42 6
. . x x -- Уменьшенный на единицу размер в байтах:
43 6
. .         00 - byte
44 6
. .         01 - half word
45 6
. .         10 - word
46 6
. .         11 - double word
47 6
. 0 ------ Признак представления плавающей точки, всегда == 0.
48 6
x -------- Признак знаковости:
49 6
            0 - Беззнаковое;
50 6
            1 - Знаковое.
51 6
</pre>
52 6
53 6
Правило кодирования типов содержащих значение в представлении плавающей точки.
54 6
55 6
<pre>
56 6
3 2 1 0
57 6
. . x x -- Тип:
58 6
. .         00 - float
59 6
. .         01 - double
60 6
. .         10 - pack
61 6
. .         11 - complex
62 6
. 1 ------ Признак  представления плавающей точки, всегда == 1.
63 6
1 -------- Признак знаковости, всегда == 1.
64 6
</pre>
65 6
66 6
Сводная таблица кодов типов.
67 6
|| '''Тип''' || '''Беззнаковый''' || '''Знаковый''' || '''Примечание''' ||
68 6
|| byte      || 0b0000            || 0b1000         || ||
69 6
|| hword     || 0b0001            || 0b1001         || Тип не используется в существующей реализации ||
70 6
|| word      || 0b0010            || 0b1010         || ||
71 6
|| dword     || 0b0011            || 0b1011         || Знаковый тип этого размера не используется в существующей реализации ||
72 6
|| || || ||
73 6
|| float     ||                   || 0b1100         || ||
74 6
|| double    ||                   || 0b1101         || Тип не используется в существующей реализации ||
75 6
|| pack      ||                   || 0b1110         || ||
76 6
|| comlex    ||                   || 0b1111         || ||
77 6
78 14 krufter_multiclet
h3. === Типы в ассемблере ===
79 6
80 6
Для резервирования памяти данных в ассемблере используются директивы резервирования памяти, используемые в сегменте данных (.data).
81 6
82 6
Соответствие размера резервируемой памяти директивами ассемблера коду типов операции архитектуры приведено в таблице ниже.
83 6
Необходимо понимать, что директивы резервирования памяти в сегменте данных ассемблера никак не связаны с кодом типа операции.
84 6
Соответствие определить можно, но одно от другого не зависит.
85 6
86 6
|| '''Код типа''' || '''Директива''' || '''Размер в битах''' ||
87 6
|| byte           || .byte           || 8b  || 
88 6
|| hword          || .short          || 16b ||
89 6
|| word           || .long           || 32b ||
90 6
|| dword          || .quad           || 64b ||
91 6
92 6
В ассемблере зависимость от кода типа данных появляется в мнемонике инструкции.
93 6
Мнемоника инструкции состоит из двух частей:
94 6
 1. корня, соответствующего коду операции и
95 6
 2. суффикса, соответствующего типу операции.
96 6
97 6
Операций системы команд будут представлены ниже, а мнемонику суффикса показывает следующая таблица:
98 6
99 6
|| '''TOP''' || '''Беззнаковый''' || '''Знаковый''' || '''Примечание''' ||
100 6
|| byte      || b                 || sb             || ||
101 6
|| hword     || s                 || ss             || НЕ используется в существующей реализации ||
102 6
|| word      || l                 || sl             || ||
103 6
|| dword     || q                 || sq             || Знаковый тип этого размера НЕ используется в существующей реализации ||
104 6
|| || || || ||
105 6
|| float     ||                   || f              || ||
106 6
|| double    ||                   || d              || НЕ используется в существующей реализации ||
107 6
|| pack      ||                   || p              || ||
108 6
|| comlex    ||                   || c              || ||
109 6
110 6
111 19 krufter_multiclet
*==Поле регистров==*
112 6
113 6
Процессор имеет следующие типы регистров:
114 6
 - регистры общего назначения (РОН [GPR -- General Purpose Register]);
115 6
 - регистры индексные (РИ [IR -- Index Register]);
116 6
 - регистры управляющие (РУ [CR -- Control Register]).
117 6
118 6
<pre>
119 6
5 4 3 2 1 0
120 6
. . X X X X -- Номер регистра.
121 6
X X ---------- Тип регистра:
122 6
                00 -- Регистр общего назначения.
123 6
                01 -- Зарезервировано, не используется.
124 6
                10 -- Регистр индексный.
125 6
                11 -- Регистр управляющий.
126 6
</pre>
127 6
128 17 krufter_multiclet
h3. === Регистры общего назначения ===
129 6
130 6
Используются в качестве сверхбыстрой памяти (Scratchpad memory).
131 6
Имеют размер 64 бита.
132 6
133 17 krufter_multiclet
h3. === Регистры индексные ===
134 6
135 6
Имеют следующую логическую структуру:
136 6
137 6
<pre>
138 6
63 .. 48 47 .. 32 31 .. 0
139 6
 .  .  .  .  .  .  XXXXXX -- База   (Base).
140 6
 .  .  .  XXXXXXX ---------- Маска  (Mask).
141 6
 XXXXXXX ------------------- Индекс (Index).
142 6
</pre>
143 6
144 6
При записи значения в индексный регистр одновременно устанавливаются все части регистра.
145 6
146 6
При использовании индексного регистра в алгоритме операции участвует только значение базы -- младшие 32 бита, старшие 32 бита формируются в соответствии с правилами размножения знака для операций, работающими с знаковыми целочисленными типами, во всех остальных операциях сбрасываются в ноль.
147 6
148 6
При этом, после выполнения параграфа в котором существует инструкция, использующая индексный регистр происходит модификация значения индексного регистра по следующей формуле:
149 6
150 6
На псевдо-Си:
151 6
152 6
<pre>
153 6
Index := (( Index | ~Mask ) + 1 ) & Mask
154 6
Base  := Base + Index;
155 6
Операции сложения выполняются по модулю.
156 6
</pre>
157 6
158 6
Используются для определения смещения при индексном доступе к оперативной памяти.
159 6
В общем случае, для организации цикла используются два индексных регистра.
160 6
Один -- для вычисления количества итераций цикла, второй -- для вычисления смешения на каждом цикле итерации.
161 6
Шаг смещения, в простейшем случае, является степенью двойки (1,2,4,8,16,...).
162 6
163 6
164 17 krufter_multiclet
*=== Регистры управляющие ===*
165 6
166 6
|| '''Имя регистра''' || '''Номер''' || '''Права''' || '''Описание''' ||
167 6
|| PSW          || 00    || R/W   || Регистр управления вычислительным процессом   ||
168 6
|| INTR         || 01    || R/W   || Регистр прерываний                            ||
169 6
|| MSKR         || 02    || R/W   || Регистр маска прерываний                      ||
170 6
|| ER           || 03    || R     || Регистр исключений                            ||
171 6
|| IRETADDR     || 04    || R     || Регистр адреса возврата                       ||
172 6
|| STVALR       || 05    || R/W   || Регистр периода системного таймера            ||
173 6
|| STCR         || 06    || R/W   || Регистр управления системным таймером         ||
174 6
|| IHOOKADDR    || 07    || R/W   || Регистр первичного обработчика прерываний     ||
175 6
|| INTNUMR      || 08    || R     || Регистр номера прерывания                     ||
176 6
|| MODR         || 09    || R/W   || Регистр маски модификации индексных регистров ||
177 6
178 6
179 17 krufter_multiclet
h3. == Память ==
180 6
181 6
Единицей адресации памяти данных является байт, размером 8 бит.
182 6
Адресация по всем блокам памяти данных сквозная.
183 6
При этом аппаратно чтение данных выравнено на 64 бита.
184 6
При вычитывании данных пересекающих границу выравнивания чтение выполняется в "два приема" (сказывается на быстродействии).
185 6
186 6
Многобайтные значения в памяти данных располагаются в порядке от старшего байта к младшему (little-endian).
187 6
188 6
Единицей адресации памяти команд является 64 бита.
189 6
Адресация памяти команд блочная.
190 6
С программной точки зрения значение метки одинаково во всех блоках.
191 6
192 6
Значения в блоке памяти команд располагаются в порядке от младшего байта к старшему (big-endian).
193 6
194 6
195 17 krufter_multiclet
*== Таблица команд ==*
196 6
197 6
Большинство инструкций формируют результат, сохраняемый в коммутаторе.
198 6
Размер значения результата соответствует размеру коммутатора -- 64 бит.
199 6
200 6
Результат нагружен значениями флагов:
201 6
|| '''№ бита''' || '''Флаг''' || '''Перевод''' || '''Описание''' ||
202 6
|| 64 || ZF (Zero Flag)     || Флаг нуля         || Результат нулевой. ||
203 6
|| 65 || OF (Overflow Flag) || Флаг переполнения || Потеря значащего бита. ||
204 6
|| 66 || CF (Carry Flag)    || Флаг переноса     || Операция произвела перенос из старшего бита результата. ||
205 6
|| 67 || SF (Sign Flag)     || Флаг знака        || Состояние старшего бита результата. ||
206 6
207 6
208 6
Флаги могут иметь значение не для каждой операции.
209 6
В таблице команд приведены значения флагов, которые имеют значение.
210 6
211 6
Обозначения, используемые в таблице команд:
212 6
 - Все числа представлены в двоичной системе;
213 6
 - Рядом с двоичным значением кода операции в скобочках дано десятичное значение;
214 6
 - Если число или цифра не используется то на ее знакоместе стоит знак '-';
215 6
 - Если цифра в числе может принимать любое значение, на ее знакоместе стоит знак 'x';
216 6
 - В колонке флаги результата (Result Flags) перечислены флаги которые вырабатывает инструкция или которые она сохраняет.
217 6
   Т.е. эти флаги, как характеристики значения результата, имеют смысл.
218 6
 - Примечания, помеченные символом '*' для не реализованных в аппаратуре типов приведены для общности.
219 6
220 6
221 17 krufter_multiclet
h3. === Инструкции работы с памятью ===
222 6
223 6
||     || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
224 6
|| || || || || || || || ||
225 7 krufter_multiclet
|| rd  || 100001 (33) || xx     || 00xx || 000000 || xxxxxx || ZF SF       || Считывается столько бит сколько определено размером типа. Старшие биты нули. ||
226 7 krufter_multiclet
||     ||             || xx     || 1000 || 000000 || xxxxxx || ZF SF       || Считываются 8 бит.  7 бит распространяется в старшие. ||
227 7 krufter_multiclet
||     ||             || xx     || 1001 || 000000 || xxxxxx || ZF SF       || *Считываются 16 бит. 15 бит распространяется в старшие. ||
228 7 krufter_multiclet
||     ||             || xx     || 1010 || 000000 || xxxxxx || ZF SF       || Считывается 32 бита. 31 бит распространяется в старшие. ||
229 6
||     ||             || xx     || 1011 || 000000 || xxxxxx || ZF SF       || Считывается 64 бита. ||
230 6
||     ||             || xx     || 1100 || 000000 || xxxxxx || ZF SF       || Старшие биты результата расширяются нулем. ||
231 6
||     ||             || xx     || 1101 || 000000 || xxxxxx || ZF SF       || *Старшие биты результата расширяются нулем. ||
232 6
||     ||             || xx     || 11xx || 000000 || xxxxxx || ZF          || Считывается 64 бита. ||
233 6
|| wr  || 100010 (34) || xx     || xxxx || xxxxxx || xxxxxx || -- -- -- -- || Записывается столько бит сколько определено размером типа.||
234 6
235 6
 __wr__::
236 6
 Поле F1 никогда не может быть равной нулю.
237 6
 __wr__ в отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
238 6
239 6
240 17 krufter_multiclet
h3. === Инструкции работы с регистрами ===
241 6
242 6
||     || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
243 6
|| || || || || || || || ||
244 6
|| exa || 000010 (02) || 01     || 0010 || 000000 || xxxxxx || ZF          || Исполнительный адрес, сформированный индексным регистром. ||
245 6
||     ||             || 11     || 0010 || 000000 || xxxxxx || ZF          || Исполнительный адрес, сформированный индексным регистром с полем V. ||
246 7 krufter_multiclet
|| get || 000011 (03) || xx     || 00xx || 000000 || xxxxxx || ZF SF       || Значение обрезается до размера типа. Старшие биты нули. ||
247 7 krufter_multiclet
||     ||             || xx     || 10xx || 000000 || xxxxxx || ZF SF       || Значение обрезается до размера типа. Распространение знакового бита типа. ||
248 6
||     ||             || xx     || 1100 || 000000 || xxxxxx || ZF SF       || Загрузка значения. Старшие биты нули. ||
249 6
||     ||             || xx     || 11xx || 000000 || xxxxxx || ZF          || Загрузка значения. ||
250 6
|| set || 000100 (04) || 00     || 0011 || xxxxxx || xxxxxx || -- -- -- -- || Пересылка значения коммутатора в регистр. ||
251 6
||     ||             || 01     || 0011 || xxxxxx || xxxxxx || -- -- -- -- || Пересылка значения регистра в регистр. ||
252 7 krufter_multiclet
||     ||             || 10     || 0010 || xxxxxx || 000000 || -- -- -- -- || Запись беззнаковой константы в регистр. Старшие биты нули. ||
253 7 krufter_multiclet
||     ||             ||        || 1010 || xxxxxx || 000000 || -- -- -- -- || Запись знаковой константы в регистр. Распространение знакового бита типа. ||
254 6
255 6
256 6
 __exa__::
257 6
 В качестве операнда имеет смысл только индексный регистр.
258 6
259 6
 __set__::
260 6
 Интерпретация значения поля F1 отличается от интерпретации, используемой для других инструкций.
261 6
 Значением поля F1 является индекс регистра в который записывается значение, сформированное при интерпретации значений поля F2 и/или V.
262 6
 В отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
263 6
264 6
 __get__::
265 6
 Во всех случаях происходит преобразование типа и/или выставление флагов заново.
266 6
 При формировании значения аргумента инструкция не обращается к памяти данных.
267 6
 Формат команды с суффиксом 11 не имеет смысла, т.к. для этого используется __exa__.
268 6
 Инструкцию можно использовать для преобразования размеров значения целочисленного типа.
269 6
270 6
Прочтение мнемокода инструкций:
271 6
|| exa || EXecutive Address ||
272 6
273 17 krufter_multiclet
h3. === Арифметические инструкции ===
274 6
275 6
||       || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
276 6
|| || || || || || || || ||
277 6
|| add   || 000101 (05) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF OF  || Сложение целочисленное. ||
278 6
||       ||             || xx     || 11xx || xxxxxx || xxxxxx || ZF SF    OF  || Сложение.  ||
279 6
|| sub   || 000110 (06) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF OF  || Вычитание целочисленное. ||
280 6
||       ||             || xx     || 11xx || xxxxxx || xxxxxx || ZF SF    OF  || Вычитание.  ||
281 6
|| mul   || 000111 (07) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF==OF || Умножение целочисленное. ||
282 6
||       ||             || xx     || 11xx || xxxxxx || xxxxxx || ZF SF    OF  || Умножение. ||
283 6
|| adc   || 001000 (08) || 00     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Сложение с переносом. ||
284 6
|| sbb   || 001001 (09) || 00     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Вычитание с заемом. ||
285 6
|| insub || 001010 (10) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF OF  || Обратное вычитание целочисленное. ||
286 6
||       ||             || xx     || 11xx || xxxxxx || xxxxxx || ZF SF    OF  || Обратное вычитание. ||
287 6
|| div   || 001011 (11) || xx     || 1100 || xxxxxx || xxxxxx || ZF SF    OF  || Деление.  ||
288 6
|| sqrt  || 001100 (12) || xx     || 1100 || 000000 || xxxxxx || ZF SF    OF  || Извлечение квадратного корня.  ||
289 6
|| max   || 001101 (13) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF        || Выбор наибольшего для целочисленных типов. ||
290 6
||       ||             || xx     || 110x || xxxxxx || xxxxxx || ZF SF    OF  || Выбор наибольшего для float. ||
291 6
|| min   || 001110 (14) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF        || Выбор наименьшего. ||
292 6
||       ||             || xx     || 110x || xxxxxx || xxxxxx || ZF SF    OF  || Выбор наименьшего для float. ||
293 6
|| abs   || 001111 (15) || xx     || 1000 || 000000 || xxxxxx || ZF       OF  || Абсолютное значение знакового байта. ||
294 6
||       ||             || xx     || 1010 || 000000 || xxxxxx || ZF       OF  || Абсолютное значение знакового слова. ||
295 6
||       ||             || xx     || 1100 || 000000 || xxxxxx || ZF           || Абсолютное значение float. ||
296 6
297 6
Пояснение:
298 6
 - Арифметических операций для типов 0011 (unsigned dword), 1011 (dword) не существует.
299 6
 - Для инструкций в формате AV значение поля V преобразуется к типу операции по правилам для инструкций __set__.
300 6
 - Поле F1  не может быть нулем, если не оговорено особо.
301 6
302 6
Инструкции __adc__, __sbb__ используют в качестве операндов арифметической операции значение '''второго''' аргумента и значение флага CF '''первого''' аргумента.
303 6
304 6
Значения флагов CF и OF вычисляются на разрядной сетке типа инструкции.
305 6
Например, флаг сдвига (CF) для байтного сложения выставляется при переносе единицы из 7-ого бита результата в 8-ой.
306 6
307 6
Для инструкции умножения __mul__ если размер результата получился больше чем размер операнда выставляются оба влага CF и OF.
308 6
309 6
Прочтение мнемокода инструкций:
310 6
|| adc   || ADdition with Carry Flag ||
311 6
|| sbb   || !SuBtract with Barrow (Carry Flag) ||
312 6
|| insub || INversion SUBtract    ||
313 6
314 17 krufter_multiclet
h3. === Логические и побитовые инструкции ===
315 6
316 6
||          || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
317 6
|| || || || || || || || ||
318 6
|| or       || 010000 (16) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || Логическое сложение ||
319 6
|| and      || 010001 (17) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || Логическое умножение ||
320 6
|| xor      || 010010 (18) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || Сложение по mod2 ||
321 6
|| not      || 010011 (19) || xx     || 0011 || 000000 || xxxxxx || ZF           || Отрицание ||
322 6
|| || || || || || || || ||
323 6
|| norm     || 010100 (20) || xx     || 10xx || 000000 || xxxxxx || ZF           || Возвращает значение используемое при нормализации числа с фиксированной точкой. ||
324 6
|| pack     || 010101 (21) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || ||
325 6
|| patch    || 010110 (22) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || ||
326 6
|| || || || || || || || ||
327 6
|| sll, sal || 011000 (24) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF OF  || Логический/арифметический сдвиг влево ||
328 6
|| slr      || 011001 (25) || xx     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Логический сдвиг вправо ||
329 6
|| sar      || 011011 (27) || xx     || 10xx || xxxxxx || xxxxxx || ZF SF CF OF  || Арифметический сдвиг вправо ||
330 6
|| rol      || 011100 (28) || xx     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Циклический сдвиг влево ||
331 6
|| ror      || 011101 (29) || xx     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Циклический сдвиг вправо ||
332 6
333 6
'''Примечание''':
334 6
 COP формата '''011'''xxx зарезервирован для реализации инструкций сдвигов и переходов (см. ниже).
335 6
336 6
Пояснение:
337 6
 - Инструкции __or__, __and__, __xor__, __not__ реализованы для внутреннего представления (64 бита).
338 6
 - Инструкции __shl__ и __sal__ реализованы одинаково, различие в знаковости типа операции можно пренебречь.
339 6
340 6
Все инструкции сдвига выставляют флаги CF и OF. (Далее используется: MSB - Most Significant Bit).
341 6
342 6
Флаг CF равен выдвигаемому биту.
343 6
344 6
Флаг OF определен если сдвиг на один разряд.
345 6
346 6
SLL, SAL, ROL, ROR::
347 6
 OF <- 0 if (CF == MSB), т.е. два старших бита операнда были одинаковы.
348 6
 OF <- 1 if (CF != MSB), т.е. два старших бита операнда были различны.
349 6
SAR::
350 6
 OF <- 0
351 6
SLR::
352 6
 OF <- MSB_первоначального_операнда
353 6
354 6
Прочтение мнемокода инструкций:
355 6
|| sll   || Shift Logical Left||
356 6
|| slr   || Shift Logical Right ||
357 6
|| sal   || Shift Arithmetic Left ||
358 6
|| sar   || Shift Arithmetic Right ||
359 6
|| rol   || ROtate Left ||
360 6
|| ror   || ROtate Right ||
361 6
|| bsr   || Bit Scan Reverse ||
362 6
363 17 krufter_multiclet
h3. === Инструкции передачи управления ===
364 6
365 6
||          || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание || Условие перехода || Применимость ||
366 6
|| || || || || || || || || ||
367 6
|| jmp      || 011110 (30) || xx     || 0000 || 000000 || xxxxxx || -- -- -- --  ||            || Безусловный || не значимо ||
368 6
|| || || || || || || || || ||
369 6
|| je       || 011110 (30) || xx     || 0001 || xxxxxx || xxxxxx || -- -- -- --  || `V1 == V2` || ZF == 1              || все       ||
370 6
|| jne      || 011110 (30) || xx     || 0010 || xxxxxx || xxxxxx || -- -- -- --  || `V1 != V2` || ZF == 0              || все       ||
371 6
|| js       || 011110 (30) || xx     || 1000 || xxxxxx || xxxxxx || -- -- -- --  ||            || SF == 1              || не значимо ||
372 6
|| jns      || 011110 (30) || xx     || 1001 || xxxxxx || xxxxxx || -- -- -- --  ||            || SF == 0              || не значимо ||
373 6
|| jo       || 011110 (30) || xx     || 1010 || xxxxxx || xxxxxx || -- -- -- --  ||            || OF == 1              || не значимо ||
374 6
|| jno      || 011110 (30) || xx     || 1011 || xxxxxx || xxxxxx || -- -- -- --  ||            || OF == 0              || не значимо ||
375 6
|| || || || || || || || || ||
376 6
|| jb, jc   || 011110 (30) || xx     || 0100 || xxxxxx || xxxxxx || -- -- -- --  || `U1 <  U2` || CF == 1              || без знака ||
377 6
|| jbe      || 011110 (30) || xx     || 0101 || xxxxxx || xxxxxx || -- -- -- --  || `U1 <= U2` || CF == 1 or  ZF == 1  || без знака ||
378 6
|| ja       || 011110 (30) || xx     || 0110 || xxxxxx || xxxxxx || -- -- -- --  || `U1 >  U2` || CF == 0 and ZF == 0  || без знака ||
379 6
|| jae, jnc || 011110 (30) || xx     || 0111 || xxxxxx || xxxxxx || -- -- -- --  || `U1 >= U2` || CF == 0              || без знака ||
380 6
|| || || || || || || || || ||
381 6
|| jl       || 011110 (30) || xx     || 1100 || xxxxxx || xxxxxx || -- -- -- --  || `S1 <  S2` || SF != OF             || со знаком ||
382 6
|| jle      || 011110 (30) || xx     || 1101 || xxxxxx || xxxxxx || -- -- -- --  || `S1 <= S2` || SF != OF or  ZF == 1 || со знаком ||
383 6
|| jg       || 011110 (30) || xx     || 1110 || xxxxxx || xxxxxx || -- -- -- --  || `S1 >  S2` || SF == OF and ZF == 0 || со знаком ||
384 6
|| jge      || 011110 (30) || xx     || 1111 || xxxxxx || xxxxxx || -- -- -- --  || `S1 >= S2` || SF == OF             || со знаком ||
385 6
386 6
Пояснение:
387 6
388 6
Все инструкции условного перехода в отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
389 6
390 6
Прочтение мнемокода инструкций:
391 6
|| je   || Jump if Equal             ||
392 6
|| jne  || Jump if Not Equal         ||
393 6
|| || ||
394 6
|| jb   || Jump if Below             ||
395 6
|| jbe  || Jump if Below and Equal   ||
396 6
|| ja   || Jump if Above             ||
397 6
|| jae  || Jump if Above and Equal   ||
398 6
|| || ||
399 6
|| jl   || Jump if Less              ||
400 6
|| jle  || Jump if Less and Equal    ||
401 6
|| jg   || Jump if Greater           ||
402 6
|| jge  || Jump if Greater and Equal ||
403 6
404 17 krufter_multiclet
h3. === Инструкции преобразования типов ===
405 6
406 6
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
407 6
|| || || || || || || || ||
408 6
|| cwf  || 111000 (56) || xx     || 1100 || 000000 || xxxxxx || ZF    CF OF || Преобразование word -> float ||
409 6
|| cswf || 111010 (58) || xx     || 1100 || 000000 || xxxxxx || ZF SF CF OF || Преобразование signed word -> float ||
410 6
|| cfsw || 111011 (59) || xx     || 1010 || 000000 || xxxxxx || ZF SF CF OF || Преобразование float -> signed word ||
411 6
412 6
Значения флагов CF, OF необходимо уточнить по признакам, выставляемым алгоритмом преобразования.
413 6
414 6
Прочтение мнемокода инструкций:
415 6
|| cwf  || Convert Word to Float        ||
416 6
|| cswf || Convert Signed Word to Float ||
417 6
|| cfsw || Convert Float to Signed Word ||
418 6
419 6
420 18 krufter_multiclet
h3. === Мультимедийные инструкции (MMC MultiMedia Command) ===
421 6
422 6
Мультимедийные команды выполняются над упакованными значениями.
423 6
В данной группе команд TOP может не совпадать с типом результата.
424 6
425 6
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
426 6
|| || || || || || || || ||
427 6
|| madd || 110001 (49) || xx     || 1110 || xxxxxx || xxxxxx || ZF SF    OF  || Упакованное умножение со сложением. ||
428 6
429 6
 '''madd'''::
430 6
 Для двух упакованных чисел [a,b] [c,d] выполняет операцию: r = a*c + b*d.
431 6
 Флаги выставляются аналогично инструкции __add__ с типом float.
432 6
433 6
Прочтение мнемокода инструкций:
434 6
|| madd || packed Multiply and ADD ||