Команды умножения и деления двоичных чисел
Применяются для выполнения операций умножения и деления над двоичными, упакованными и неупакованными двоично-кодированными десятичными числами. Их описание представлено в таблице 4.5.
Таблица 4.5 – Формат команд умножения и деления
Название команды | Мнемоника и формат команды | Описание действия |
Умножить без знака | MUL RC | См. таблицу 4.6 |
Умножить со знаком | IMUL SRC | См. таблицу 4.6 |
Делить без знака | DIV SRC | См. таблицу 4.7 |
Делить со знаком | IDIV SRC | См. таблицу 4.7 |
Особенностью операций умножения и деления является наличие всего одного операнда(сомножителя или делимого). Второй операнд задан неявно; его местоположение фиксировано и зависит от размера операндов. Знаки результатов в операциях со знаком определяются по алгебраическим правилам.
Варианты размеров сомножителей, мест размещения второго операнда и результата для операции умножения представлены в таблице 4.6, а для операции деления – в таблице 4.7.
Таблица 4.6 – Расположение операндов и результата при умножении
Первый сомножитель | Второй сомножитель | Результат |
Байт | AL | 16 битов в AX; AL – младшая часть результата, AH – старшая часть результата (AX) (SRC) * (AL) |
Слово | AX | 32 бита в паре DX:AX; AX – младшая часть результата, DX – старшая часть результата (DX:AX) (SRC) * (AX) |
Двойное слово | EAX | 64 бита в паре EDX:EAX; EAX – младшая часть результата, EDX – старшая часть результата (EDX:EAX) (SRC) * (EAX) |
Если результат по размеру совпадает с размером сомножителей, то флаги CF и OF после завершения операции раны нулю, в противном случае - устанавливаются в единицу. Это значит, что результат вышел за пределы младшей части произведения и состоит из двух частей, что необходимо учитывать при дальнейшей работе. Остальные флаги не определены.
Таблица 4.7 – Расположение операндов и результата при делении
Делимое | Делитель | Частное | Остаток |
Слово (16 бит) в регистре AX | Байт в регистре или ячейке памяти | Байт в регистре AL (AL) (AX)/ (SRC) | Байт в регистре AH (AH) (AX)/ (SRC) |
Двойное слово (32 бита), в DX – старшая часть в AX – младшая часть | Слово (16 бит) в регистре или ячеек памяти | Слово (16 бит) в регистре AX (AX) (DX:AX)/ (SRC) | Слово (16 бит) в регистре DX (DX) (DX:AX)/ (SRC) |
Учетверенное слово (64 бита), в EDX – старшая часть, в EAX – младшая часть | Двойное слово (32 бита) в регистре или ячейке памяти | Двойное слово (32 бита) в регистре EAX (EAX) (EDX:EAX)/ (SRC) | Двойное слово (32 бита) в регистре EDX (EDX) (EDX:EAX)/ (SRC) |
Делитель может находиться в регистре или в памяти и иметь размер 8, 26 или 32 бита. Местонахождение делимого фиксировано. Результатом команды деления являются частное и остаток от деления. После выполнения операции деления содержимое флагов не определено, но возможно возникновение прерывания с номером ноль (так называемое «деление на ноль») в случаях, когда делитель равен нулю или частное не входит в отведенную для него разрядную сетку.
Что касается режимов адресации, то операнды источники не могут быть непосредственными значениями, а все другие режимы адресации допустимы. Операнды – получатели строго фиксированы.
Логические команды
Логические команды выполняют логические операции над битами операндов. Размерность операндов должна быть одинакова. Логические команды наиболее часто используются для селективных установок, инвертирования, сброса или проверки бит в операнде- получателе в соответствии с двоичным набором операнда-источника. Такие действия часто встречаются в операциях над битами регистров и данных ввода-вывода. При этом операнд источник называют маской, а сама операция называется маскированием. Описание логических команд представлено в таблице 4.8.
Таблица 4.8 - Формат логических команд
Название команды | Мнемоника и формат команды | Описание действия |
Инвертировать | NOT OPR | (OPR)not OPR |
Объединить по «ИЛИ» | OR DST,SRC | (DST)(DST) or (SRC) |
Объединить по «И» | AND DST,SRC | (DST)(DST) and (SRC) |
Сложить по MOD2 («исключающее ИЛИ») | XOR DST,SRC | (DST)(DST) xor (SRC) |
Проверить | TEST OPR1,OPR2 | OPR1 and OPR2 |
Команда NOT не воздействует на флажки. Остальные команды сбрасывают OF и CF, оставляют АF не определенным и устанавливают СF, ZF, PF по обычным правилам.
Касательно режимов адресации, в команде NOT не допускается непосредственный операнд. В остальных командах один из операндов должен быть регистром. Другой операнд может иметь любой режим адресации.