IMUL – команда умножения со знаком
MUL – беззнаковое умножение
КОМАНДА СЛОЖЕНИЯ INC
КОМАНДА NEG
КОМАНДА ВЫЧИТАНИЯ DEC
КОМАНДА ВЫЧИТАНИЯ С ЗАЁМОМ SBB
КОМАНДА ВЫЧИТАНИЯ SUB
SUB OP1,OP2
OP1:=OP1-OP2
В обычном процессоре отсутствует вычитатель, и поэтому к первому операнду прибавляется второй с противоположным знаком ==>
OP1:=OP1+(-OP2)
SUB AL,BL
AL=5=05h= 0.0000101b
BL=18=12h=0.0010010b
| изменение знака
V
OF SF ZF AF PF CF 1.1101110b
┌──┬──┬──┬──┬──┬──┐ 0.0000101b
│ 0│ 1│ 0│ *│ 1│ 0│ ----------
└──┴──┴──┴──┴──┴──┘ 1.1110011b дк
----------
1.0001101b пк = -13
Все флаги формируются по правилу сложения чисел со знаком.
SBB OP1,OP2
OP1:=OP1-OP2-CF
Используется для вычитания чисел, длина которых превышает слово.
DEC OP – однооперандная
OP := OP – 1
Команда формирует все флаги, кроме флага переноса CF (который не определен).
NEG OP
OP := –OP – инвертирует операнд
INC OP
OP := OP + 1
Команда формирует все флаги, кроме флага переноса CF (который не определён).
mul OP───┬──>регистр
└──>ячейка памяти
mul 5 – недопустимая команда
В команде явно присутствует второй операнд, по умолчанию первый операнд – регистр AL или AX.
Использование непосредственного операнда запрещено, т. к. неизвестно, какая должна быть у него длина (8 или 16 бит).
mul BH ┌───┐
------ └───┘AL
;AX := AL * BH * ┌───┐
└───┘BH
─────────
┌───┬───┐
└───┴───┘AX
mul BX ┌───┬───┐
------ └───┴───┘AX
* ┌───┬───┐
;(DX:AX) := AX * BX └───┴───┘BX
──────────────────
┌───┬───┐┌───┬───┐
└───┴───┘└───┴───┘
DX AX
Пусть мы имеем два максимальных двузначных десятичных числа
99 * 99 = 9801
Перемножение двузначного на двузначное дает число не более четырёх цифр.
Диапазон байта 0..255
0..(28 - 1)
(28 - 1) * (28 - 1) = 65025, а диапазон слова: 0..65535
0..(216 - 1)
Т. к. при умножении формируется результат удвоенной длины, то физическое переполнение невозможно.
Однако именно в команде умножения формируются синхронно два флага CF и OF. Значение '1' определяет ситуацию переполнения, которая сигнализирует о том, что значение произведения превышает длину исходных операндов.
Пример: ┐
AL=25│
* ├─0..255
BH=25│
┘
───────
AX=625
┌───┬───┐
│ 02│ 71│-> CF=1, OF=1
└───┴───┘
Обычно при выполнении вычислений используются операнды одной длины. Если это байты, тогда если при умножении не возникает переполнения, то в качестве результата можно использовать его младшую половину.
15 * 15 = 225 = E1h
┌───┐
│ 0F│AL
└───┘
* ┌───┐
│ 0F│BH
└───┘
─────────
┌───┬───┐
┌──│ 00│ E1│AX
│ └───┴───┘
V └─┬─┘
OF=0 └──────>результат в AL
CF=0
Все остальные флаги в команде формируются хаотично.
imul OP – умножение знаковых операндов
-------
Алгоритмы умножения беззнаковых чисел и знаковых чисел отличаются, что потребовало двух команд умножения.
Команда выполняется аналогично mul, при умножении автоматически формируются знак результата. Отличие состоит в правилах формирования флага переполнения
(-128..127) – диапазон байта
При выходе результата за диапазон байта формируется переполнение:
15 * 15 = 225 = E1h | (-15) * 15 =-225 =-Е1h=1Fhдк
┌───┐ ┐ | ┌───┐
│ 0F│ AL│ | │ F1│ AL
└───┘ │ | └───┘
* ┌───┐ │ | ┌───┐
│ OF│ BH│ | │ 0F│ BH
└───┘ ├─┐ | └───┘
───────── │ V | ─────────
┌───┬───┐ │ знаковые | ┌───┬───┐
┌───│ 00│ E1│ AX│ величины | │ FF│ 1F│ AX
│ └───┴───┘ ┘ | └───┴───┘
V └─┬─┘ | Если цифровая часть резуль-
CF=1 ┌────────┐ | тата помещается в младшем бай-
OF=1 │11100001│ | те, то все биты старшего байта
└────────┘ можно рассматривать как знаковые разряды. При этом если знаковый разряд младшего байта отличается от любого бита старшего байта, то это указывает на ситуацию переполнения.
┌───┬───┐
│ FF 1F│ AX
└───┴───┘
AX | | AL
┌────────┐ ┌────────┐
│11111111│ │00011111│
└────────┘ └────────┘