Рубрики
Справочник по ассемблеру

IMUL

СинтаксисIMUL множитель_1
IMUL множитель_1, множитель_2
IMUL произведение, множитель_1, множитель_2
Машинный
код
F6 /5 — IMUL r/m8
F7 /5 — IMUL r/m16
F7 /5 — IMUL r/m32
OF AF /r — IMUL r16,r/m16
OF AF /r — IMUL r32,r/m32
6B /r ib — IMUL r16,r/m16,imm8
68 /r ib — IMUL r32,r/m32,imm8
6B /r ib — IMUL r16,imm8
6B /r ib — IMUL r32,imm8
69 /r iw — IMUL r16,r/m16,imm16
69 /r id — IMUL r32,r/m32,imm32
69 /r iw — IMUL r16,imm16
69 /r id — IMUL r32,imm32
ОписаниеУмножение со знаком.

Описание команды

Выполняет умножение двух операндов со знаком. В отличии от команды mul для умножения беззнаковых чисел команда imul имеет три формы, различающиеся числом операндов.

Форма с одним операндом – эта форма сходна в использовании с mul. Операнд-источник (регистр общего назначения или переменная) умножается на значение из AL, AX или EAX (в зависимости от размера операнда). Результат умножения с вдвое большей разрядностью, чем у операнда-источника помещается в AX, DX:AX, EDX:EAX регистры, соответственно.

Размер операндовПервый множительВторой множительРезультат
БайтALr/m8AX
СловоAXr/m16DX:AX
Двойное словоEAXr/m32EDX:EAX

Форма с двумя операндами – тут операнд-приёмник (первый операнд) умножается на операнд-источник (второй операнд). Приёмником может быть только регистр общего назначения, а в качестве источника используется непосредственное значение, регистр общего назначения или переменная. От результата умножения отсекается старшая часть и помещается в операнд-приёмник.

Форма с тремя операндами – первый операнд принимает результат умножения, а второй и третий – операнды-источники. Первый операнд-источник (регистр общего назначения или переменная) умножается на второй операнд-источник (непосредственное значение). От результата умножения отсекается старшая часть и помещается в операнд приёмник (регистр общего назначения).

Флаги

Для формы с одним операндом флаги CF и OF устанавливаются на 1, если знаковые биты были перенесены в старшую часть регистра-результата, и наоборот, если результат помещается в младшей части, флаги CF и OF устанавливаются на 0.

Для форм с двумя и тремя операндами, флаги CF и OF устанавливаются, когда в старшей части результата есть значение, которое отсечется, чтобы подогнать результат под размер операнда-приёмника, и наоборот, флаги выставляются на 0, если результат поместится в операнд-приёмник.

Флаги SF, ZF, AF, и PF имеют неопределенное значение.

Рубрики
Учебный курс

Урок 12. Преобразование типов

Часть команд процессор может обработать только со значениями одной разрядности. Процессор без колебаний перемножит байт на байт и слово на слово. Но никак не байт на слово, или двойное слово на слово. Чтобы складывать, перемножать и выполнять другие операции со значениями разных размеров, программист должен озаботиться преобразованием типов в своей программе. Под преобразованием типов я […]

Рубрики
Справочник по ассемблеру

DIV

СинтаксисDIV делитель
Машинный
код
F6 /6 — DIV r/m8
F7 /6 — DIV r/m16
F7 /6 — DIV r/m32
ОписаниеДеление без знака.
ДействиеDIV используется при делении без учета знака. Команда делит 8-, 16-, 32- битные значение регистра (делимое) на хранимые в регистре или памяти байт, слово или двойное слово (делитель). Частное от деления помещается в AL, AX или EAX регистр соответственно. Остаток помещается в AH, DX или EDX.
Размер делимого (8-, 16- или 32-битный регистр), а также выделяемое место под результат определяются размером регистра, используемого в качестве делителя:
Размер операндаДелимоеДелительЧастноеОстаток
БайтAXr/m8ALAH
СловоDX:AXr/m16AXDX
Двойное словоEAX:EDXr/m32EAXEDX
ФлагиФлаги OF, SF, ZF, AF, PF и CF не установлены.

Пример использования команды div:

Рубрики
Справочник по ассемблеру

MUL

СинтаксисMUL множитель
Машинный
код
F6 /4 — MUL r/m8
F7 /4 — MUL r/m16
F7 /4 — MUL r/m32
ОписаниеУмножение без знака.
ДействиеКоманда получает единственный явный аргумент, размер которого определяет регистры, выделеяемые командой под результат операции умножения (подробности приведены в таблице ниже). Другой множитель предварительно помещается в AL/AX/EAX регистр.
Размеры множителей и регистры, отводимые под результат исполнения команды:
Размер операндовПервый множительВторой множительРезультат*
БайтALr/m8AX
СловоAXr/m16DX:AX
Двойное словоEAXr/m32EDX:EAX
*Старшая часть результата помещается в регистры AH, DX или EDX соответственно.
ФлагиЕсли старшая половина результата нулевая:
OF=CF=0 SF=? ZF=? AF=? PF=?.
Если старшая половина результата ненулевая:
OF=CF=1 SF=? ZF=? AF=? PF=?.

Пример использования команды mul:

Рубрики
Учебный курс

Урок 11. Умножение и деление

Поход на рынок, как правило, заканчивается покупкой какого-либо товара. Если мы хотим купить несколько единиц товара одного наименования, то продавец посчитает нам итоговую сумму с использованием простейшего компьютера – микрокалькулятора. В аналогии с ассемблером при умножении товаров программа микрокалькулятора будет оперировать с числами без знака, поскольку нельзя купить минус три пури или минус пять круассанов. […]

Рубрики
Справочник по ассемблеру

CMP

СинтаксисCMP приёмник,источник
Машинный
код
3C ib — CMP AL,imm8
3D iw — CMP AX,imm16
3D id — CMP EAX,imm32
80 /7 ib — CMP r/m8,imm8
81 /7 iw — CMP r/m16,imm16
81 /7 id — CMP r/m32,imm32
83 /7 ib — CMP r/m16,imm8
83 /7 ib — CMP r/m32,imm8
38 /r — CMP r/m8,r8
39 /r — CMP r/m16,r16
39 /r — CMP r/m32,r32
3A /r — CMP r8,r/m8
3B /r — CMP r16,r/m16
3B /r — CMP r32,r/m32
ОписаниеСравнение.
ДействиеИнструкция CMP сравнивает 2 операнда. Основное применение инструкции – проверка условий в циклах. CMP вычитает один операнд от другого, затем сравнивает, являются операнды равными или нет (см. команда SUB). Исходные операнды не меняются. Также используется для условных переходов по меткам.
ФлагиOF=r SF=r ZF=r AF=r PF=r CF=r

Пример использования инструкции CMP:

CMP часто используется для сверки счетчика, то есть сравнения числа повторений цикла с условием. Рассмотрим типичный случай:

Рубрики
Справочник по ассемблеру

SBB

СинтаксисSBB приемник,источник
Машинный
код
1C ib — SBB AL,imm8
1D iw — SBB AX,imm16
1D id — SBB EAX,imm32
80 /3 ib — SBB r/m8,imm8
81 /3 iw — SBB r/m16,imm16
81 /3 id — SBB r/m32,imm32
83 /3 ib — SBB r/m16,imm8
83 /3 ib — SBB r/m32,imm8
18 /r — SBB r/m8,r8
19 /r — SBB r/m16,r16
19 /r — SBB r/m32,r32
1A /r — SBB r8,r/m8
1B /r — SBB r16,r/m16
1B /r — SBB r32,r/m32
ОписаниеВычитание с заёмом.
ДействиеВычитание двух целочисленных двоичных операндов с учётом флага CF.
ФлагиOF=r SF=r ZF=r AF=r PF=r CF=r

Команда SBB дополняет команду SUB при выполнени вычитания чисел частями. Состояние флага CF представляет собой заём от предыдущего вычитания. Приёмник = приёмник — (источник + CF)

Пример использования команды SBB для вычитания операнда размером в слово (2 байта) из двойного слова (4 байта):

Рубрики
Учебный курс

Учебный курс. Урок 10. Сложение и вычитание с переносом

Регистры процессоров ограничены в разрядности архитектурой процессора (как правило, x86/64), поэтому сложение чисел, как из реального мира, так и из виртуального в ассемблере имеет дополнительные нюансы. В предыдущем Уроке 9. Сложение и вычитание операции сложения и вычитания выполнялись только в границах размеров регистров. Сложение операндов превышающих размеры регистров приводит к переполнению и установке флага CF. […]

Рубрики
Справочник по ассемблеру

NEG

СинтаксисNEG операнд
Машинный
код
F6 /3 — NEG r/m8
F7 /3 — NEG r/m16
F7 /3 — NEG r/m32
ОписаниеИзменение знака.
ДействиеКоманда вычисляет двоичное дополнение операнда.
ФлагиЕсли операнд равен нулю: CF=0 OF=r SF=r ZF=r AF=r PF=r.
Если операнд не равен нулю: CF=1 OF=r SF=r ZF=r AF=r PF=r.

Команда NEG меняет знак операнда, преобразуя его значение в дополнительный код. Инструкция имеет смысл только для чисел со знаком, поскольку преобразование теряет смысл, если число 1 преобразуется в интерпретируемое беззнаковым число 255 (FF).

По выполнению инструкции устанавливаются флаги, которые характеризуют преобразование. Если произошло преобразование положительного числа в отрицательное, то SF=1, для всех остальных случаев SF=0.

Пример использования команды NEG:

Рубрики
Справочник по ассемблеру

SUB

СинтаксисSUB приемник,источник
Машинный
код
2C ib — SUB AL,imm8
2D iw — SUB AX,imm16
2D id — SUB EAX,imm32
80 /5 ib — SUB r/m8,imm8
81 /5 iw — SUB r/m16,imm16
81 /5 id — SUB r/m32,imm32
83 /5 ib — SUB r/m16,imm8
83 /5 ib — SUB r/m32,imm8
28 /r — SUB r/m8,r8
29 /r — SUB r/m16,r16
29 /r — SUB r/m32,r32
2A /r — SUB r8,r/m8
2B /r — SUB r16,r/m16
2B /r — SUB r32,r/m32
ОписаниеВычитание.
ДействиеВычитание двух целочисленных двоичных операндов.
приёмник = приёмник — источник
ФлагиOF=r SF=r ZF=r AF=r PF=r CF=r

Команда SUB вычитает из первого операнда (приёмника) второй операнд. Результат вычитания переписывает значение операнда — приёмника.

Флаг SF имеет значение только для чисел со знаком. SF=1 указывает на отрицательный знак результата. Пример:

Если числа равноразмерные и без знака, то CF=1 будет указывать на некорректный результат (результат ушел в отрицательное значение). Например:

Для чисел со знаком и при вычитании меньшего по размеру числа от большего (пример, вычитание слова от двойного слова) CF=1 означает, что вычитание выполнилось с заёмом. Инструкция SBB продолжит вычитание с учетом флага CF: