Project

General

Profile

R1 ISA » History » Version 3

krufter_multiclet, 05/12/2015 12:13 PM

1 3 krufter_multiclet
h1. Мультиклет R1 ISA
2 3 krufter_multiclet
3 1 krufter_multiclet
= Система команд (Instruction Set Architecture) =
4 1 krufter_multiclet
5 1 krufter_multiclet
== Формат кодирования команды ==
6 1 krufter_multiclet
7 1 krufter_multiclet
Формат AA размер 32 бит:
8 1 krufter_multiclet
<pre>
9 1 krufter_multiclet
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
10 1 krufter_multiclet
 .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  X  X  X  X  X  X -- F2 -- адрес в коммутаторе / номер регистра 2-ого операнда
11 1 krufter_multiclet
 .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  X  X  X  X  X  X -------------------- F1 -- адрес в коммутаторе значения 1-ого операнда
12 1 krufter_multiclet
 .  .  .  .  .  .  .  .  .  .  .  .  .  .  X  X  X  X  X  X -------------------------------------- Резерв
13 1 krufter_multiclet
 .  .  .  .  .  .  .  .  .  .  X  X  X  X -------------------------------------------------------- TOP -- тип операции
14 1 krufter_multiclet
 .  .  .  .  .  .  .  .  .  X  ------------------------------------------------------------------- Признак инструкции, завершающей параграф
15 1 krufter_multiclet
 .  .  .  .  .  .  .  .  X------------------------------------------------------------------------ Признак чтения из памяти данных (0 — значение используется непосредственно, 1 - значение используется в качестве адреса памяти данных)
16 1 krufter_multiclet
 .  .  .  .  .  .  .  X -------------------------------------------------------------------------- Интерпретация значения поля F2 (0 — адрес в коммутаторе, 1 — номер регистра)
17 1 krufter_multiclet
 .  .  .  .  .  .  X ----------------------------------------------------------------------------- Признак наличия поля V у команды (0 — нет, 1— есть)
18 1 krufter_multiclet
 X  X  X  X  X  X -------------------------------------------------------------------------------- COP -- код операции.
19 1 krufter_multiclet
</pre>
20 1 krufter_multiclet
21 1 krufter_multiclet
Формат AV размер 64 бит.
22 1 krufter_multiclet
Старшая часть имеет такую же структуру как и формата AA, младшие 32 бита -- значение поля V.
23 1 krufter_multiclet
24 1 krufter_multiclet
== Типы операции ==
25 1 krufter_multiclet
26 1 krufter_multiclet
Тип операции задается кодом в поле `TOP`.
27 1 krufter_multiclet
28 1 krufter_multiclet
Сводная таблица кодов типов.
29 1 krufter_multiclet
<pre>
30 1 krufter_multiclet
0000 - Беззнаковый байт               (Byte)
31 1 krufter_multiclet
0001 - Беззнаковый short              (Short)
32 1 krufter_multiclet
0010 - Беззнаковый long               (Long)
33 1 krufter_multiclet
0011 - Беззнаковый quad               (Quad)
34 1 krufter_multiclet
0100 - Упакованный беззнаковый short  (Pack short)
35 1 krufter_multiclet
0101 - Упакованный знаковый short     (Pack signed short)
36 1 krufter_multiclet
0110 - Упакованный беззнаковый long   (Pack long)
37 1 krufter_multiclet
0111 - Упакованный знаковый long      (Pack signed long)
38 1 krufter_multiclet
1000 - Знаковый байт                  (Signed byte)
39 1 krufter_multiclet
1001 - Знаковый short                 (Signed short)
40 1 krufter_multiclet
1010 - Знаковый long                  (Signed long)
41 1 krufter_multiclet
1011 - Знаковый quad                  (Signed quad) - не используется
42 1 krufter_multiclet
1100 - Float
43 1 krufter_multiclet
1101 - Double
44 1 krufter_multiclet
1110 - Pack
45 1 krufter_multiclet
1111 - Complex
46 1 krufter_multiclet
</pre>
47 1 krufter_multiclet
48 1 krufter_multiclet
49 1 krufter_multiclet
=== Типы в ассемблере ===
50 1 krufter_multiclet
51 1 krufter_multiclet
Для резервирования памяти данных в ассемблере используются директивы резервирования памяти, используемые в сегменте данных (.data).
52 1 krufter_multiclet
53 1 krufter_multiclet
Соответствие размера резервируемой памяти директивами ассемблера коду типов операции архитектуры приведено в таблице ниже.
54 1 krufter_multiclet
Необходимо понимать, что директивы резервирования памяти в сегменте данных ассемблера никак не связаны с кодом типа операции.
55 1 krufter_multiclet
Соответствие определить можно, но одно от другого не зависит.
56 1 krufter_multiclet
57 1 krufter_multiclet
|| '''Код типа''' || '''Директива''' || '''Размер в битах''' ||
58 1 krufter_multiclet
|| byte           || .byte           || 8b  ||
59 1 krufter_multiclet
|| short          || .short          || 16b ||
60 1 krufter_multiclet
|| long           || .long           || 32b ||
61 1 krufter_multiclet
|| quad           || .quad           || 64b ||
62 1 krufter_multiclet
63 1 krufter_multiclet
В ассемблере зависимость от кода типа данных появляется в мнемонике инструкции.
64 1 krufter_multiclet
Мнемоника инструкции состоит из двух частей:
65 1 krufter_multiclet
 1. корня, соответствующего коду операции и
66 1 krufter_multiclet
 2. суффикса, соответствующего типу операции.
67 1 krufter_multiclet
68 1 krufter_multiclet
Операций системы команд будут представлены ниже, а мнемонику суффикса показывает следующая таблица:
69 1 krufter_multiclet
70 1 krufter_multiclet
|| '''TOP''' || '''Беззнаковый''' || '''Знаковый''' || '''Примечание''' ||
71 1 krufter_multiclet
|| byte      || b                 || sb             || ||
72 1 krufter_multiclet
|| short     || s                 || ss             || ||
73 1 krufter_multiclet
|| long      || l                 || sl             || ||
74 1 krufter_multiclet
|| quad      || q                 || sq             || ||
75 1 krufter_multiclet
|| || || || ||
76 1 krufter_multiclet
|| float     ||                   || f              || ||
77 1 krufter_multiclet
|| double    ||                   || d              || ||
78 1 krufter_multiclet
|| pack      ||                   || p              || ||
79 1 krufter_multiclet
|| comlex    ||                   || c              || ||
80 1 krufter_multiclet
81 1 krufter_multiclet
82 1 krufter_multiclet
== Поле регистров ==
83 1 krufter_multiclet
84 1 krufter_multiclet
Процессор имеет следующие типы регистров:
85 1 krufter_multiclet
 - регистры общего назначения (РОН [GPR -- General Purpose Register]);
86 1 krufter_multiclet
 - регистры индексные (РИ [IR -- Index Register]);
87 1 krufter_multiclet
 - регистры управляющие (РУ [CR -- Control Register]).
88 1 krufter_multiclet
89 1 krufter_multiclet
<pre>
90 1 krufter_multiclet
5 4 3 2 1 0
91 1 krufter_multiclet
. . X X X X -- Номер регистра.
92 1 krufter_multiclet
X X ---------- Тип регистра:
93 1 krufter_multiclet
                00 -- Регистр общего назначения.
94 1 krufter_multiclet
                01 -- Зарезервировано, не используется.
95 1 krufter_multiclet
                10 -- Регистр индексный.
96 1 krufter_multiclet
                11 -- Регистр управляющий.
97 1 krufter_multiclet
</pre>
98 1 krufter_multiclet
99 1 krufter_multiclet
=== Регистры общего назначения ===
100 1 krufter_multiclet
101 1 krufter_multiclet
Используются в качестве сверхбыстрой памяти (Scratchpad memory).
102 1 krufter_multiclet
Имеют размер 64 бита.
103 1 krufter_multiclet
104 1 krufter_multiclet
=== Регистры индексные ===
105 1 krufter_multiclet
106 1 krufter_multiclet
Имеют следующую логическую структуру:
107 1 krufter_multiclet
<pre>
108 1 krufter_multiclet
63 .. 48 47 .. 32 31 .. 0
109 1 krufter_multiclet
 .  .  .  .  .  .  XXXXXX -- База   (Base).
110 1 krufter_multiclet
 .  .  .  XXXXXXX ---------- Маска  (Mask).
111 1 krufter_multiclet
 XXXXXXX ------------------- Индекс (Index).
112 1 krufter_multiclet
</pre>
113 1 krufter_multiclet
114 1 krufter_multiclet
При записи значения в индексный регистр одновременно устанавливаются все части регистра.
115 1 krufter_multiclet
116 1 krufter_multiclet
При использовании индексного регистра в алгоритме операции участвует только значение базы -- младшие 32 бита, старшие 32 бита формируются в соответствии с правилами размножения знака для операций, работающими с знаковыми целочисленными типами, во всех остальных операциях сбрасываются в ноль.
117 1 krufter_multiclet
118 1 krufter_multiclet
При этом, после выполнения параграфа в котором существует инструкция, использующая индексный регистр происходит модификация значения индексного регистра по следующей формуле:
119 1 krufter_multiclet
120 1 krufter_multiclet
$$Index \gets (( Index \vee \neg Mask ) \oplus 1 ) \wedge Mask$$
121 1 krufter_multiclet
$$Base  \gets Base \oplus Index;$$
122 1 krufter_multiclet
123 1 krufter_multiclet
или на псевдо-Си:
124 1 krufter_multiclet
<pre>
125 1 krufter_multiclet
Index := (( Index | ~Mask ) + 1 ) & Mask
126 1 krufter_multiclet
Base  := Base + Index;
127 1 krufter_multiclet
Операции сложения выполняются по модулю.
128 1 krufter_multiclet
</pre>
129 1 krufter_multiclet
130 1 krufter_multiclet
Используются для определения смещения при индексном доступе к оперативной памяти.
131 1 krufter_multiclet
В общем случае, для организации цикла используются два индексных регистра.
132 1 krufter_multiclet
Один -- для вычисления количества итераций цикла, второй -- для вычисления смешения на каждом цикле итерации.
133 1 krufter_multiclet
Шаг смещения, в простейшем случае, является степенью двойки (1,2,4,8,16,...).
134 1 krufter_multiclet
135 1 krufter_multiclet
136 1 krufter_multiclet
=== Регистры управляющие ===
137 1 krufter_multiclet
138 1 krufter_multiclet
|| '''Имя регистра''' || '''Номер''' || '''Права''' || '''Описание''' ||
139 1 krufter_multiclet
|| PSW          || 00    || R/W   || Регистр управления вычислительным процессом   ||
140 1 krufter_multiclet
|| INTR         || 01    || R/W   || Регистр прерываний                            ||
141 1 krufter_multiclet
|| MSKR         || 02    || R/W   || Регистр маска прерываний                      ||
142 1 krufter_multiclet
|| ER           || 03    || R     || Регистр исключений                            ||
143 1 krufter_multiclet
|| IRETADDR     || 04    || R     || Регистр адреса возврата                       ||
144 1 krufter_multiclet
|| STVALR       || 05    || R/W   || Регистр периода системного таймера            ||
145 1 krufter_multiclet
|| STCR         || 06    || R/W   || Регистр управления системным таймером         ||
146 1 krufter_multiclet
|| IHOOKADDR    || 07    || R/W   || Регистр первичного обработчика прерываний     ||
147 1 krufter_multiclet
|| INTNUMR      || 08    || R     || Регистр номера прерывания                     ||
148 1 krufter_multiclet
|| MODR         || 09    || R/W   || Регистр маски модификации индексных регистров ||
149 1 krufter_multiclet
150 1 krufter_multiclet
151 1 krufter_multiclet
== Память ==
152 1 krufter_multiclet
153 1 krufter_multiclet
Единицей адресации памяти данных является байт, размером 8 бит.
154 1 krufter_multiclet
Адресация по всем блокам памяти данных сквозная.
155 1 krufter_multiclet
При этом аппаратно чтение данных выравнено на 64 бита.
156 1 krufter_multiclet
При вычитывании данных пересекающих границу выравнивания чтение выполняется в "два приема" (сказывается на быстродействии).
157 1 krufter_multiclet
158 1 krufter_multiclet
Многобайтные значения в памяти данных располагаются в порядке от старшего байта к младшему (little-endian).
159 1 krufter_multiclet
160 1 krufter_multiclet
Единицей адресации памяти команд является 64 бита.
161 1 krufter_multiclet
Адресация памяти команд блочная.
162 1 krufter_multiclet
С программной точки зрения значение метки одинаково во всех блоках.
163 1 krufter_multiclet
164 1 krufter_multiclet
Значения в блоке памяти команд располагаются в порядке от младшего байта к старшему (big-endian).
165 1 krufter_multiclet
166 1 krufter_multiclet
167 1 krufter_multiclet
== Таблица команд ==
168 1 krufter_multiclet
169 1 krufter_multiclet
Большинство инструкций формируют результат, сохраняемый в коммутаторе.
170 1 krufter_multiclet
Размер значения результата соответствует размеру коммутатора -- 64 бит.
171 1 krufter_multiclet
172 1 krufter_multiclet
Результат нагружен значениями флагов:
173 1 krufter_multiclet
||№ бита||     Флаг               || Перевод                                                                                      ||Описание      ||                       ||
174 1 krufter_multiclet
|| 64   || ZF (Zero Flag)         || Флаг нуля                                                                                    || Результат нулевой. ||                 ||
175 1 krufter_multiclet
|| 65   || OF (Overflow Flag)     || Флаг переполнения                                                                            || Потеря значащего бита. ||              ||
176 1 krufter_multiclet
|| 66   || CF (Carry/Inexact Flag)|| Флаг переноса/Флаг потери точности результата в операциях с числами в формате плавающей точки
177 1 krufter_multiclet
старшего бита результата/При округлении результата произошла потеря значащих битов||Операция произвела перенос из ||
178 1 krufter_multiclet
|| 67   || SF (Sign Flag)         || Флаг знака                                                                                   || Состояние старшего бита результата. ||
179 1 krufter_multiclet
180 1 krufter_multiclet
Флаги могут иметь значение не для каждой операции.
181 1 krufter_multiclet
В таблице команд приведены значения флагов, которые имеют значение.
182 1 krufter_multiclet
183 1 krufter_multiclet
Обозначения, используемые в таблице команд:
184 1 krufter_multiclet
 - Все числа представлены в двоичной системе;
185 1 krufter_multiclet
 - Рядом с двоичным значением кода операции в скобочках дано десятичное значение;
186 1 krufter_multiclet
 - Если число или цифра не используется то на ее знакоместе стоит знак '-';
187 1 krufter_multiclet
 - Если цифра в числе может принимать любое значение, на ее знакоместе стоит знак 'x';
188 1 krufter_multiclet
 - В колонке флаги результата (Result Flags) перечислены флаги которые вырабатывает инструкция или которые она сохраняет.
189 1 krufter_multiclet
   Т.е. эти флаги, как характеристики значения результата, имеют смысл.
190 1 krufter_multiclet
 - Примечания, помеченные символом '*' для не реализованных в аппаратуре типов приведены для общности.
191 1 krufter_multiclet
192 1 krufter_multiclet
193 1 krufter_multiclet
=== Инструкции работы с памятью ===
194 1 krufter_multiclet
195 1 krufter_multiclet
||     || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
196 1 krufter_multiclet
|| || || || || || || || ||
197 1 krufter_multiclet
|| rd  || 100001 (33) || xx     || 00xx || 000000 || xxxxxx || ZF SF       || Считывается столько бит сколько определено размером типа. Старшие биты нули. ||
198 1 krufter_multiclet
||     ||             || xx     || 1000 || 000000 || xxxxxx || ZF SF       || Считываются 8 бит. 7 бит распространяется в старшие. ||
199 1 krufter_multiclet
||     ||             || xx     || 1001 || 000000 || xxxxxx || ZF SF       || Считываются 16 бит. 15 бит распространяется в старшие. ||
200 1 krufter_multiclet
||     ||             || xx     || 1010 || 000000 || xxxxxx || ZF SF       || Считывается 32 бита. 31 бит распространяется в старшие. ||
201 1 krufter_multiclet
||     ||             || xx     || 1011 || 000000 || xxxxxx || ZF SF       || Считывается 64 бита. ||
202 1 krufter_multiclet
||     ||             || xx     || 1100 || 000000 || xxxxxx || ZF SF       || Старшие биты результата расширяются нулем. ||
203 1 krufter_multiclet
||     ||             || xx     || 1101 || 000000 || xxxxxx || ZF SF       || Старшие биты результата расширяются нулем. ||
204 1 krufter_multiclet
||     ||             || xx     || 11xx || 000000 || xxxxxx || ZF          || Считывается 64 бита. ||
205 1 krufter_multiclet
|| wr  || 100010 (34) || xx     || xxxx || xxxxxx || xxxxxx || -- -- -- -- || Записывается столько бит сколько определено размером типа.||
206 1 krufter_multiclet
207 1 krufter_multiclet
 __wr__::
208 1 krufter_multiclet
 Поле F1 никогда не может быть равной нулю.
209 1 krufter_multiclet
 __wr__ в отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
210 1 krufter_multiclet
211 1 krufter_multiclet
212 1 krufter_multiclet
=== Инструкции работы с регистрами ===
213 1 krufter_multiclet
214 1 krufter_multiclet
||     || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
215 1 krufter_multiclet
|| || || || || || || || ||
216 1 krufter_multiclet
|| exa || 000010 (02) || 01     || 0010 || 000000 || xxxxxx || ZF          || Исполнительный адрес, сформированный индексным регистром. ||
217 1 krufter_multiclet
||     ||             || 11     || 0010 || 000000 || xxxxxx || ZF          || Исполнительный адрес, сформированный индексным регистром с полем V. ||
218 1 krufter_multiclet
|| get || 000011 (03) || xx     || 00xx || 000000 || xxxxxx || ZF SF       || Значение обрезается до размера типа. Старшие биты нули. ||
219 1 krufter_multiclet
||     ||             || xx     || 10xx || 000000 || xxxxxx || ZF SF       || Значение обрезается до размера типа. Распространение знакового бита типа. ||
220 1 krufter_multiclet
||     ||             || xx     || 1100 || 000000 || xxxxxx || ZF SF       || Загрузка значения. Старшие биты нули. ||
221 1 krufter_multiclet
||     ||             || xx     || 11xx || 000000 || xxxxxx || ZF          || Загрузка значения. ||
222 1 krufter_multiclet
|| set || 000100 (04) || 00     || 0011 || xxxxxx || xxxxxx || -- -- -- -- || Пересылка значения коммутатора в регистр. ||
223 1 krufter_multiclet
||     ||             || 01     || 0011 || xxxxxx || xxxxxx || -- -- -- -- || Пересылка значения регистра в регистр. ||
224 1 krufter_multiclet
||     ||             || 10     || 0010 || xxxxxx || 000000 || -- -- -- -- || Запись беззнаковой константы в регистр. Старшие биты нули. ||
225 1 krufter_multiclet
||     ||             ||        || 1010 || xxxxxx || 000000 || -- -- -- -- || Запись знаковой константы в регистр. Распространение знакового бита типа. ||
226 1 krufter_multiclet
227 1 krufter_multiclet
228 1 krufter_multiclet
 __exa__::
229 1 krufter_multiclet
 В качестве операнда имеет смысл только индексный регистр.
230 1 krufter_multiclet
231 1 krufter_multiclet
 __set__::
232 1 krufter_multiclet
 Интерпретация значения поля F1 отличается от интерпретации, используемой для других инструкций.
233 1 krufter_multiclet
 Значением поля F1 является индекс регистра в который записывается значение, сформированное при интерпретации значений поля F2 и/или V.
234 1 krufter_multiclet
 В отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
235 1 krufter_multiclet
236 1 krufter_multiclet
 __get__::
237 1 krufter_multiclet
 Во всех случаях происходит преобразование типа и/или выставление флагов заново.
238 1 krufter_multiclet
 При формировании значения аргумента инструкция не обращается к памяти данных.
239 1 krufter_multiclet
 Формат команды с суффиксом 11 не имеет смысла, т.к. для этого используется __exa__.
240 1 krufter_multiclet
 Инструкцию можно использовать для преобразования размеров значения целочисленного типа.
241 1 krufter_multiclet
242 1 krufter_multiclet
Прочтение мнемокода инструкций:
243 1 krufter_multiclet
|| exa || EXecutive Address ||
244 1 krufter_multiclet
245 1 krufter_multiclet
=== Арифметические инструкции ===
246 1 krufter_multiclet
247 1 krufter_multiclet
||       || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
248 1 krufter_multiclet
|| || || || || || || || ||
249 1 krufter_multiclet
|| add   || 000101 (05) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF OF  || Сложение целочисленное. ||
250 1 krufter_multiclet
||       ||             || xx     || 11xx || xxxxxx || xxxxxx || ZF SF    OF  || Сложение вещественное.  ||
251 1 krufter_multiclet
|| sub   || 000110 (06) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF OF  || Вычитание целочисленное. ||
252 1 krufter_multiclet
||       ||             || xx     || 11xx || xxxxxx || xxxxxx || ZF SF    OF  || Вычитание вещественное.  ||
253 1 krufter_multiclet
|| mul   || 000111 (07) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF==OF || Умножение целочисленное. ||
254 1 krufter_multiclet
||       ||             || xx     || 11xx || xxxxxx || xxxxxx || ZF SF    OF  || Умножение вещественное. ||
255 1 krufter_multiclet
|| adc   || 001000 (08) || 00     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Сложение с переносом. ||
256 1 krufter_multiclet
|| sbb   || 001001 (09) || 00     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Вычитание с заемом. ||
257 1 krufter_multiclet
|| insub || 001010 (10) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF OF  || Обратное вычитание целочисленное. ||
258 1 krufter_multiclet
||       ||             || xx     || 11xx || xxxxxx || xxxxxx || ZF SF    OF  || Обратное вычитание вещественное. ||
259 1 krufter_multiclet
|| div   || 001011 (11) || xx     || 1100 || xxxxxx || xxxxxx || ZF SF    OF  || Деление вещественное.  ||
260 1 krufter_multiclet
|| sqrt  || 001100 (12) || xx     || 1100 || 000000 || xxxxxx || ZF SF    OF  || Извлечение квадратного корня вещественное.  ||
261 1 krufter_multiclet
|| max   || 001101 (13) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF        || Выбор наибольшего для целочисленных типов. ||
262 1 krufter_multiclet
||       ||             || xx     || 110x || xxxxxx || xxxxxx || ZF SF    OF  || Выбор наибольшего для  вещественного. ||
263 1 krufter_multiclet
|| min   || 001110 (14) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF        || Выбор наименьшего для целочисленных типов. ||
264 1 krufter_multiclet
||       ||             || xx     || 110x || xxxxxx || xxxxxx || ZF SF    OF  || Выбор наименьшего для  вещественного. ||
265 1 krufter_multiclet
|| abs   || 001111 (15) || xx     || 1000 || 000000 || xxxxxx || ZF       OF  || Абсолютное значение знакового байта. ||
266 1 krufter_multiclet
||       ||             || xx     || 1010 || 000000 || xxxxxx || ZF       OF  || Абсолютное значение знакового слова. ||
267 1 krufter_multiclet
||       ||             || xx     || 110x || 000000 || xxxxxx || ZF           || Абсолютное значение для  вещественного. ||
268 1 krufter_multiclet
269 1 krufter_multiclet
Пояснение:
270 1 krufter_multiclet
 - Арифметических операций для типов 0011 (unsigned quad), 1011 (quad) не существует.
271 1 krufter_multiclet
 - Для инструкций в формате AV значение поля V преобразуется к типу операции по правилам для инструкций __set__.
272 1 krufter_multiclet
 - Поле F1  не может быть нулем, если не оговорено особо.
273 1 krufter_multiclet
274 1 krufter_multiclet
Инструкции __adc__, __sbb__ используют в качестве операндов арифметической операции значение '''второго''' аргумента и значение флага CF '''первого''' аргумента.
275 1 krufter_multiclet
276 1 krufter_multiclet
Значения флагов CF и OF вычисляются на разрядной сетке типа инструкции.
277 1 krufter_multiclet
Например, флаг сдвига (CF) для байтного сложения выставляется при переносе единицы из 7-ого бита результата в 8-ой.
278 1 krufter_multiclet
279 1 krufter_multiclet
Для инструкции умножения __mul__ если размер результата получился больше чем размер операнда выставляются оба влага CF и OF.
280 1 krufter_multiclet
281 1 krufter_multiclet
Прочтение мнемокода инструкций:
282 1 krufter_multiclet
|| adc   || ADdition with Carry Flag ||
283 1 krufter_multiclet
|| sbb   || !SuBtract with Barrow (Carry Flag) ||
284 1 krufter_multiclet
|| insub || INversion SUBtract    ||
285 1 krufter_multiclet
286 1 krufter_multiclet
=== Логические и побитовые инструкции ===
287 1 krufter_multiclet
288 1 krufter_multiclet
||          || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
289 1 krufter_multiclet
|| || || || || || || || ||
290 1 krufter_multiclet
|| or       || 010000 (16) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || Логическое сложение ||
291 1 krufter_multiclet
|| and      || 010001 (17) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || Логическое умножение ||
292 1 krufter_multiclet
|| xor      || 010010 (18) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || Сложение по mod2 ||
293 1 krufter_multiclet
|| not      || 010011 (19) || xx     || 0011 || 000000 || xxxxxx || ZF           || Отрицание ||
294 1 krufter_multiclet
|| || || || || || || || ||
295 1 krufter_multiclet
|| norm     || 010100 (20) || xx     || 10xx || 000000 || xxxxxx || ZF           || Возвращает значение используемое при нормализации числа с фиксированной точкой. ||
296 1 krufter_multiclet
|| pack     || 010101 (21) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || ||
297 1 krufter_multiclet
|| patch    || 010110 (22) || xx     || 0011 || xxxxxx || xxxxxx || ZF           || ||
298 1 krufter_multiclet
|| bsr      || 010111 (23) || xx     || 00xx || 000000 || xxxxxx || ZF           || Сканирование битов назад ||
299 1 krufter_multiclet
|| sll, sal || 011000 (24) || xx     || x0xx || xxxxxx || xxxxxx || ZF SF CF OF  || Логический/арифметический сдвиг влево ||
300 1 krufter_multiclet
|| slr      || 011001 (25) || xx     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Логический сдвиг вправо ||
301 1 krufter_multiclet
|| bsf      || 011010 (26) || xx     || 00xx || 000000 || xxxxxx || ZF           || Сканирование битов вперёд ||
302 1 krufter_multiclet
|| sar      || 011011 (27) || xx     || 10xx || xxxxxx || xxxxxx || ZF SF CF OF  || Арифметический сдвиг вправо ||
303 1 krufter_multiclet
|| rol      || 011100 (28) || xx     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Циклический сдвиг влево ||
304 1 krufter_multiclet
|| ror      || 011101 (29) || xx     || 00xx || xxxxxx || xxxxxx || ZF SF CF OF  || Циклический сдвиг вправо ||
305 1 krufter_multiclet
306 1 krufter_multiclet
'''Примечание''':
307 1 krufter_multiclet
 COP формата '''011'''xxx зарезервирован для реализации инструкций сдвигов и переходов (см. ниже).
308 1 krufter_multiclet
309 1 krufter_multiclet
Пояснение:
310 1 krufter_multiclet
 - Инструкции __or__, __and__, __xor__, __not__ реализованы для внутреннего представления (64 бита).
311 1 krufter_multiclet
 - Инструкции __shl__ и __sal__ реализованы одинаково, различие в знаковости типа операции можно пренебречь.
312 1 krufter_multiclet
313 1 krufter_multiclet
Все инструкции сдвига выставляют флаги CF и OF. (Далее используется: MSB - Most Significant Bit).
314 1 krufter_multiclet
315 1 krufter_multiclet
Флаг CF равен выдвигаемому биту.
316 1 krufter_multiclet
317 1 krufter_multiclet
Флаг OF определен если сдвиг на один разряд.
318 1 krufter_multiclet
319 1 krufter_multiclet
SLL, SAL, ROL, ROR::
320 1 krufter_multiclet
 OF <- 0 if (CF == MSB), т.е. два старших бита операнда были одинаковы.
321 1 krufter_multiclet
 OF <- 1 if (CF != MSB), т.е. два старших бита операнда были различны.
322 1 krufter_multiclet
SAR::
323 1 krufter_multiclet
 OF <- 0
324 1 krufter_multiclet
SLR::
325 1 krufter_multiclet
 OF <- MSB_первоначального_операнда
326 1 krufter_multiclet
327 1 krufter_multiclet
Прочтение мнемокода инструкций:
328 1 krufter_multiclet
|| sll   || Shift Logical Left||
329 1 krufter_multiclet
|| slr   || Shift Logical Right ||
330 1 krufter_multiclet
|| sal   || Shift Arithmetic Left ||
331 1 krufter_multiclet
|| sar   || Shift Arithmetic Right ||
332 1 krufter_multiclet
|| rol   || ROtate Left ||
333 1 krufter_multiclet
|| ror   || ROtate Right ||
334 1 krufter_multiclet
|| bsr   || Bit Scan Reverse ||
335 1 krufter_multiclet
|| bsf   || Bit Scan Forward ||
336 1 krufter_multiclet
337 1 krufter_multiclet
=== Инструкции передачи управления ===
338 1 krufter_multiclet
339 1 krufter_multiclet
||          || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание || Условие перехода || Применимость ||
340 1 krufter_multiclet
|| || || || || || || || || ||
341 1 krufter_multiclet
|| jmp      || 011110 (30) || xx     || 0000 || 000000 || xxxxxx || -- -- -- --  ||            || Безусловный || не значимо ||
342 1 krufter_multiclet
|| || || || || || || || || ||
343 1 krufter_multiclet
|| je       || 011110 (30) || xx     || 0001 || xxxxxx || xxxxxx || -- -- -- --  || `V1 == V2` || ZF == 1              || все       ||
344 1 krufter_multiclet
|| jne      || 011110 (30) || xx     || 0010 || xxxxxx || xxxxxx || -- -- -- --  || `V1 != V2` || ZF == 0              || все       ||
345 1 krufter_multiclet
|| js       || 011110 (30) || xx     || 1000 || xxxxxx || xxxxxx || -- -- -- --  ||            || SF == 1              || не значимо ||
346 1 krufter_multiclet
|| jns      || 011110 (30) || xx     || 1001 || xxxxxx || xxxxxx || -- -- -- --  ||            || SF == 0              || не значимо ||
347 1 krufter_multiclet
|| jo       || 011110 (30) || xx     || 1010 || xxxxxx || xxxxxx || -- -- -- --  ||            || OF == 1              || не значимо ||
348 1 krufter_multiclet
|| jno      || 011110 (30) || xx     || 1011 || xxxxxx || xxxxxx || -- -- -- --  ||            || OF == 0              || не значимо ||
349 1 krufter_multiclet
|| || || || || || || || || ||
350 1 krufter_multiclet
|| jb, jc   || 011110 (30) || xx     || 0100 || xxxxxx || xxxxxx || -- -- -- --  || `U1 <  U2` || CF == 1              || без знака ||
351 1 krufter_multiclet
|| jbe      || 011110 (30) || xx     || 0101 || xxxxxx || xxxxxx || -- -- -- --  || `U1 <= U2` || CF == 1 or  ZF == 1  || без знака ||
352 1 krufter_multiclet
|| ja       || 011110 (30) || xx     || 0110 || xxxxxx || xxxxxx || -- -- -- --  || `U1 >  U2` || CF == 0 and ZF == 0  || без знака ||
353 1 krufter_multiclet
|| jae, jnc || 011110 (30) || xx     || 0111 || xxxxxx || xxxxxx || -- -- -- --  || `U1 >= U2` || CF == 0              || без знака ||
354 1 krufter_multiclet
|| || || || || || || || || ||
355 1 krufter_multiclet
|| jl       || 011110 (30) || xx     || 1100 || xxxxxx || xxxxxx || -- -- -- --  || `S1 <  S2` || SF != OF             || со знаком ||
356 1 krufter_multiclet
|| jle      || 011110 (30) || xx     || 1101 || xxxxxx || xxxxxx || -- -- -- --  || `S1 <= S2` || SF != OF or  ZF == 1 || со знаком ||
357 1 krufter_multiclet
|| jg       || 011110 (30) || xx     || 1110 || xxxxxx || xxxxxx || -- -- -- --  || `S1 >  S2` || SF == OF and ZF == 0 || со знаком ||
358 1 krufter_multiclet
|| jge      || 011110 (30) || xx     || 1111 || xxxxxx || xxxxxx || -- -- -- --  || `S1 >= S2` || SF == OF             || со знаком ||
359 1 krufter_multiclet
360 1 krufter_multiclet
Пояснение:
361 1 krufter_multiclet
362 1 krufter_multiclet
Все инструкции условного перехода в отличии от большинства других команд НЕ возвращают значение операнда (оптимизация выполнения).
363 1 krufter_multiclet
364 1 krufter_multiclet
Прочтение мнемокода инструкций:
365 1 krufter_multiclet
|| je   || Jump if Equal             ||
366 1 krufter_multiclet
|| jne  || Jump if Not Equal         ||
367 1 krufter_multiclet
|| js   || Jump if Signed            ||
368 1 krufter_multiclet
|| jns  || Jump if Not Signed        ||
369 1 krufter_multiclet
|| jo   || Jump if Overflow          ||
370 1 krufter_multiclet
|| jno  || Jump if Not Overflow      ||
371 1 krufter_multiclet
|| jc   || Jump if Carry             ||
372 1 krufter_multiclet
|| jnc  || Jump if Not Carry         ||
373 1 krufter_multiclet
|| || ||
374 1 krufter_multiclet
|| jb   || Jump if Below             ||
375 1 krufter_multiclet
|| jbe  || Jump if Below and Equal   ||
376 1 krufter_multiclet
|| ja   || Jump if Above             ||
377 1 krufter_multiclet
|| jae  || Jump if Above and Equal   ||
378 1 krufter_multiclet
|| || ||
379 1 krufter_multiclet
|| jl   || Jump if Less              ||
380 1 krufter_multiclet
|| jle  || Jump if Less and Equal    ||
381 1 krufter_multiclet
|| jg   || Jump if Greater           ||
382 1 krufter_multiclet
|| jge  || Jump if Greater and Equal ||
383 1 krufter_multiclet
384 1 krufter_multiclet
=== Инструкции выбора второго аргумента по условию ===
385 1 krufter_multiclet
386 1 krufter_multiclet
||          || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание || Условие перехода || Применимость ||
387 1 krufter_multiclet
|| || || || || || || || || ||
388 1 krufter_multiclet
|| se       || 011111 (31) || xx     || 0001 || xxxxxx || xxxxxx || ZF SF        || `V1 == V2` || ZF == 1              || все       ||
389 1 krufter_multiclet
|| sne      || 011111 (31) || xx     || 0010 || xxxxxx || xxxxxx || ZF SF        || `V1 != V2` || ZF == 0              || все       ||
390 1 krufter_multiclet
|| ss       || 011111 (31) || xx     || 1000 || xxxxxx || xxxxxx || ZF SF        ||            || SF == 1              || не значимо ||
391 1 krufter_multiclet
|| sns      || 011111 (31) || xx     || 1001 || xxxxxx || xxxxxx || ZF SF        ||            || SF == 0              || не значимо ||
392 1 krufter_multiclet
|| so       || 011111 (31) || xx     || 1010 || xxxxxx || xxxxxx || ZF SF        ||            || OF == 1              || не значимо ||
393 1 krufter_multiclet
|| sno      || 011111 (31) || xx     || 1011 || xxxxxx || xxxxxx || ZF SF        ||            || OF == 0              || не значимо ||
394 1 krufter_multiclet
|| || || || || || || || || ||
395 1 krufter_multiclet
|| sb, sc   || 011111 (31) || xx     || 0100 || xxxxxx || xxxxxx || ZF SF        || `U1 <  U2` || CF == 1              || без знака ||
396 1 krufter_multiclet
|| sbe      || 011111 (31) || xx     || 0101 || xxxxxx || xxxxxx || ZF SF        || `U1 <= U2` || CF == 1 or  ZF == 1  || без знака ||
397 1 krufter_multiclet
|| sa       || 011111 (31) || xx     || 0110 || xxxxxx || xxxxxx || ZF SF        || `U1 >  U2` || CF == 0 and ZF == 0  || без знака ||
398 1 krufter_multiclet
|| sae, snc || 011111 (31) || xx     || 0111 || xxxxxx || xxxxxx || ZF SF        || `U1 >= U2` || CF == 0              || без знака ||
399 1 krufter_multiclet
|| || || || || || || || || ||
400 1 krufter_multiclet
|| sl       || 011111 (31) || xx     || 1100 || xxxxxx || xxxxxx || ZF SF        || `S1 <  S2` || SF != OF             || со знаком ||
401 1 krufter_multiclet
|| sle      || 011111 (31) || xx     || 1101 || xxxxxx || xxxxxx || ZF SF        || `S1 <= S2` || SF != OF or  ZF == 1 || со знаком ||
402 1 krufter_multiclet
|| sg       || 011111 (31) || xx     || 1110 || xxxxxx || xxxxxx || ZF SF        || `S1 >  S2` || SF == OF and ZF == 0 || со знаком ||
403 1 krufter_multiclet
|| sge      || 011111 (31) || xx     || 1111 || xxxxxx || xxxxxx || ZF SF        || `S1 >= S2` || SF == OF             || со знаком ||
404 1 krufter_multiclet
405 1 krufter_multiclet
Прочтение мнемокода инструкций:
406 1 krufter_multiclet
|| se   || Send value to switchboard if Equal             ||
407 1 krufter_multiclet
|| sne  || Send value to switchboard if Not Equal         ||
408 1 krufter_multiclet
|| ss   || Send value to switchboard if Signed            ||
409 1 krufter_multiclet
|| sns  || Send value to switchboard if Not Signed        ||
410 1 krufter_multiclet
|| so   || Send value to switchboard if Overflow          ||
411 1 krufter_multiclet
|| sno  || Send value to switchboard if Not Overflow      ||
412 1 krufter_multiclet
|| sc   || Send value to switchboard if Carry             ||
413 1 krufter_multiclet
|| snc  || Send value to switchboard if Not Carry         ||
414 1 krufter_multiclet
|| || ||
415 1 krufter_multiclet
|| sb   || Send value to switchboard if Below             ||
416 1 krufter_multiclet
|| sbe  || Send value to switchboard if Below and Equal   ||
417 1 krufter_multiclet
|| sa   || Send value to switchboard if Above             ||
418 1 krufter_multiclet
|| sae  || Send value to switchboard if Above and Equal   ||
419 1 krufter_multiclet
|| || ||
420 1 krufter_multiclet
|| sl   || Send value to switchboard if Less              ||
421 1 krufter_multiclet
|| sle  || Send value to switchboard if Less and Equal    ||
422 1 krufter_multiclet
|| sg   || Send value to switchboard if Greater           ||
423 1 krufter_multiclet
|| sge  || Send value to switchboard if Greater and Equal ||
424 1 krufter_multiclet
425 1 krufter_multiclet
=== Инструкции работы с битами аргумента ===
426 1 krufter_multiclet
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
427 1 krufter_multiclet
|| || || || || || || || ||
428 1 krufter_multiclet
|| bc   || 100000 (32) || xx     || 00xx || xxxxxx || xxxxxx || ZF           || Вычислениe числа единичных битов в аргументе ||
429 1 krufter_multiclet
430 1 krufter_multiclet
=== Инструкция копирования флагов ===
431 1 krufter_multiclet
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
432 1 krufter_multiclet
|| || || || || || || || ||
433 1 krufter_multiclet
|| fcpy  || 100011 (35) || xx     || 0011 || xxxxxx || xxxxxx || ZF SF OF CF  || Копирование флагов первого аргумента во второй ||
434 1 krufter_multiclet
435 1 krufter_multiclet
=== Инструкция развёртки байтов ===
436 1 krufter_multiclet
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
437 1 krufter_multiclet
|| ib   || 100100 (36) || xx     || х000 || xxxxxx || xxxxxx || ZF SF OF CF  ||            ||
438 1 krufter_multiclet
439 1 krufter_multiclet
=== Инструкция свёртки байтов ===
440 1 krufter_multiclet
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
441 1 krufter_multiclet
|| cb   || 100101 (37) || xx     || х000 || xxxxxx || xxxxxx ||              ||            ||
442 1 krufter_multiclet
443 1 krufter_multiclet
444 1 krufter_multiclet
=== Инструкция свёртки байтов с насыщением ===
445 1 krufter_multiclet
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
446 1 krufter_multiclet
|| cbs  || 100110 (38) || xx     || х000 || xxxxxx || xxxxxx ||              ||            ||
447 1 krufter_multiclet
448 1 krufter_multiclet
449 1 krufter_multiclet
=== Инструкции выбора первого или второго аргумента по условию ===
450 1 krufter_multiclet
451 1 krufter_multiclet
||          || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание || Условие перехода || Применимость ||
452 1 krufter_multiclet
|| || || || || || || || || ||
453 1 krufter_multiclet
|| me       || 100111 (39) || xx     || 0001 || xxxxxx || xxxxxx || ZF SF        || `V1 == V2` || ZF == 1              || все       ||
454 1 krufter_multiclet
|| mne      || 100111 (39) || xx     || 0010 || xxxxxx || xxxxxx || ZF SF        || `V1 != V2` || ZF == 0              || все       ||
455 1 krufter_multiclet
|| ms       || 100111 (39) || xx     || 1000 || xxxxxx || xxxxxx || ZF SF        ||            || SF == 1              || не значимо ||
456 1 krufter_multiclet
|| mns      || 100111 (39) || xx     || 1001 || xxxxxx || xxxxxx || ZF SF        ||            || SF == 0              || не значимо ||
457 1 krufter_multiclet
|| mo       || 100111 (39) || xx     || 1010 || xxxxxx || xxxxxx || ZF SF        ||            || OF == 1              || не значимо ||
458 1 krufter_multiclet
|| mno      || 100111 (39) || xx     || 1011 || xxxxxx || xxxxxx || ZF SF        ||            || OF == 0              || не значимо ||
459 1 krufter_multiclet
|| mb       || 100111 (39) || xx     || 0100 || xxxxxx || xxxxxx || ZF SF        || `U1 <  U2` || CF == 1              || без знака ||
460 1 krufter_multiclet
|| mbe      || 100111 (39) || xx     || 0101 || xxxxxx || xxxxxx || ZF SF        || `U1 <= U2` || CF == 1 or  ZF == 1  || без знака ||
461 1 krufter_multiclet
|| ma       || 100111 (39) || xx     || 0110 || xxxxxx || xxxxxx || ZF SF        || `U1 >  U2` || CF == 0 and ZF == 0  || без знака ||
462 1 krufter_multiclet
|| mae      || 100111 (39) || xx     || 0111 || xxxxxx || xxxxxx || ZF SF        || `U1 >= U2` || CF == 0              || без знака ||
463 1 krufter_multiclet
|| ml       || 100111 (39) || xx     || 1100 || xxxxxx || xxxxxx || ZF SF        || `S1 <  S2` || SF != OF             || со знаком ||
464 1 krufter_multiclet
|| mle      || 100111 (39) || xx     || 1101 || xxxxxx || xxxxxx || ZF SF        || `S1 <= S2` || SF != OF or  ZF == 1 || со знаком ||
465 1 krufter_multiclet
|| mg       || 100111 (39) || xx     || 1110 || xxxxxx || xxxxxx || ZF SF        || `S1 >  S2` || SF == OF and ZF == 0 || со знаком ||
466 1 krufter_multiclet
|| mge      || 100111 (39) || xx     || 1111 || xxxxxx || xxxxxx || ZF SF        || `S1 >= S2` || SF == OF             || со знаком ||
467 1 krufter_multiclet
468 1 krufter_multiclet
Прочтение мнемокода инструкций:
469 1 krufter_multiclet
|| me   || Move argument to switchboard if Equal             ||
470 1 krufter_multiclet
|| mne  || Move argument to switchboard if Not Equal         ||
471 1 krufter_multiclet
|| ms   || Move argument to switchboard if Signed            ||
472 1 krufter_multiclet
|| mns  || Move argument to switchboard if Not Signed        ||
473 1 krufter_multiclet
|| mo   || Move argument to switchboard if Overflow          ||
474 1 krufter_multiclet
|| mno  || Move argument to switchboard if Not Overflow      ||
475 1 krufter_multiclet
|| smb  || Move argument to switchboard if Below             ||
476 1 krufter_multiclet
|| mbe  || Move argument to switchboard if Below and Equal   ||
477 1 krufter_multiclet
|| ma   || Move argument to switchboard if Above             ||
478 1 krufter_multiclet
|| mae  || Move argument to switchboard if Above and Equal   ||
479 1 krufter_multiclet
|| ml   || Move argument to switchboard if Less              ||
480 1 krufter_multiclet
|| mle  || Move argument to switchboard if Less and Equal    ||
481 1 krufter_multiclet
|| mg   || Move argument to switchboard if Greater           ||
482 1 krufter_multiclet
|| mge  || Move argument to switchboard if Greater and Equal ||
483 1 krufter_multiclet
484 1 krufter_multiclet
485 1 krufter_multiclet
=== Инструкция передачи значения из коммутатора с сохранением флагов===
486 1 krufter_multiclet
||       || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание                 ||
487 1 krufter_multiclet
|| move  || 101000 (40) || xx     || 0011 || xxxxxx || xxxxxx || SF CF OF ZF  ||Сохраняются флаги аргумента ||
488 1 krufter_multiclet
489 1 krufter_multiclet
490 1 krufter_multiclet
=== Инструкции преобразования типов ===
491 1 krufter_multiclet
492 1 krufter_multiclet
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
493 1 krufter_multiclet
|| || || || || || || || ||
494 1 krufter_multiclet
|| cdf  || 110111 (55) || xx     || 1100 || 000000 || xxxxxx || ZF SF    OF || Преобразование double -> float ||
495 1 krufter_multiclet
|| clf  || 111000 (56) || xx     || 1100 || 000000 || xxxxxx || ZF       OF || Преобразование long -> float ||
496 1 krufter_multiclet
|| cfd  || 111001 (57) || xx     || 1100 || 000000 || xxxxxx || ZF SF    OF || Преобразование float -> double ||
497 1 krufter_multiclet
|| cslf || 111010 (58) || xx     || 1100 || 000000 || xxxxxx || ZF SF    OF || Преобразование signed long -> float ||
498 1 krufter_multiclet
|| cfsl || 111011 (59) || xx     || 1010 || 000000 || xxxxxx || ZF SF    OF || Преобразование float -> signed long ||
499 1 krufter_multiclet
500 1 krufter_multiclet
Значения флагов CF, OF необходимо уточнить по признакам, выставляемым алгоритмом преобразования.
501 1 krufter_multiclet
502 1 krufter_multiclet
Прочтение мнемокода инструкций:
503 1 krufter_multiclet
|| cdf  || Convert Double to Float      ||
504 1 krufter_multiclet
|| clf  || Convert Long to Float        ||
505 1 krufter_multiclet
|| cfd  || Convert Float to Double      ||
506 1 krufter_multiclet
|| cslf || Convert Signed Long to Float ||
507 1 krufter_multiclet
|| cfsl || Convert Float to Signed Long ||
508 1 krufter_multiclet
509 1 krufter_multiclet
510 1 krufter_multiclet
=== Мультимедийные инструкции (MMC !MultiMedia Command) ===
511 1 krufter_multiclet
512 1 krufter_multiclet
Мультимедийные команды выполняются над упакованными значениями.
513 1 krufter_multiclet
В данной группе команд TOP может не совпадать с типом результата.
514 1 krufter_multiclet
515 1 krufter_multiclet
||      || COP         || Suffix || TOP  || F1     || F2     || Result Flags || Примечание ||
516 1 krufter_multiclet
|| || || || || || || || ||
517 1 krufter_multiclet
|| madd || 110001 (49) || xx     || 1110 || xxxxxx || xxxxxx || ZF SF    OF  || Упакованное умножение со сложением. ||
518 1 krufter_multiclet
519 1 krufter_multiclet
 '''madd'''::
520 1 krufter_multiclet
 Для двух упакованных чисел [a,b] [c,d] выполняет операцию: r = a*c + b*d.
521 1 krufter_multiclet
 Флаги выставляются аналогично инструкции __add__ с типом float.
522 1 krufter_multiclet
523 1 krufter_multiclet
Прочтение мнемокода инструкций:
524 1 krufter_multiclet
|| madd || packed Multiply and ADD ||