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│

└────────┘ └────────┘