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