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