Imul множення цілих чисел зі знаком програмування, уроки і приклади

Додаток. Система команд процесорів Intel

IMUL Множення цілих чисел зі знаком

Команда IMUL виконує множення цілого числа зі знаком, що знаходиться в регістрі AL (у разі множення на байт) або АХ (у разі множення на слово), на операнд-джерело (ціле число зі знаком). Розмір твори в два рази більше розміру співмножників.
Для однобайтових операцій один із співмножників поміщається в регістр AL; після виконання операції твір записується в регістр АХ.
Для двобайтових операцій один із співмножників поміщається в регістр АХ; після виконання операції твір записується в регістри DX: AX (в DX - старша частина, в АХ - молодша).
Як операнд-співмножник команди imul можна вказувати регістр (окрім сегментного) або елемент пам'яті; не допускається множення на безпосереднє значення. Команда впливає на прапори OF і CF. Якщо АН або DX є просто знакова розширення AL або АХ, відповідно (тобто результат множення зі знаком вірний), OF і CF скидаються в 0; в іншому випадку (результат зі знаком не поміщається в АХ або DX: AX) OF і CF встановлюються в 1.


mov AL, 5; Перший співмножник
mov BL, 3; Другий співмножник
imul BL; AX = 000Fh (твір)


mov AX, 256; Перший співмножник
mov BX, 256; Другий співмножник
imul BX; DX = 0001h, AX = 0000h
; (Число 65536)


mov AL, -5; AL = FBh
mov BL, 3; BL = 03h
imul BL; AX-'FFF1h (-15)


Для команди imul з одним операндом другий співмножник повинен розташовуватися в AL, АХ або ЕАХ. Процесор вибирає розмірність другого сомножителя, виходячи з розмірності першого, зазначеного в якості операнда. 16-, 32- або 64-бітовий знаковий результат поміщається в регістри АХ, DX: AX або EDX: EAX, відповідно. Якщо після операції множення вміст АН, DX або EDX є лише знаковим розширенням AL, АХ або ЕАХ, відповідно, то прапори CF і OF скидаються в 0. Інакше вони встановлюються в 1.
Для команди imul з двома операндами їх твір записується в перший операнд; другий операнд не змінюється. Як перший операнд можуть виступати 16- або 32-розрядні регістри загального призначення; як другий операнд - 16- або 32-розрядні регістри загального призначення, 16- або 32-бітові елементи пам'яті або безпосереднє значення. Обидва операнди повинні мати один розмір. Якщо результат множення поміщається в перший операнд, прапори CF і OF скидаються в 0. Інакше вони встановлюються в 1.
Для команди imul з трьома операндами твір другого і третього операндів записується в перший операнд. Як перший операнд можуть виступати 16- або 32-розрядні регістри загального призначення; як другий операнд - 16- або 32-розрядні регістри загального призначення або 16- або 32-бітові елементи пам'яті; в якості третьої операнда - тільки безпосереднє значення. Два перших операнда повинні мати один розмір. Якщо результат множення поміщається в перший операнд, прапори CF і OF скидаються в 0. Інакше вони встановлюються в 1.


mov EAX, -1; Перший співмножник
mov ESI, 100000000; Другий співмножник
imul ESI; EDX = FFFFFFFFh,
; EAX = FA0AlF00h
; Результат = -100 млн


; У полях даних
ор2 dd 100h; Перший співмножник
; У програмному сегменті
mov EAX, 400000h; Другий співмножник
imul EAX, op2; EAX = 40000000h
приклад 3
mov BX, 300h
imul АХ, ВХ, 4; AX = 300h * 4 = 0C00h