Обзор работы с моделью » 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 || |