I
IDIV Деление целых чисел со знаком
Команда IDIV выполняет деление целого числа со знаком, находящегося в регистрах АХ (в случае деления на байт) или DX:AX (в случае деления на слово), на операнд-источник (целое число со знаком). Размер делимого в два раза больше размеров делителя и остатка. Оба результата рассматриваются как числа со знаком, причем знак остатка равен знаку делимого.
Для однобайтовых операций делимое помещается в регистр АХ; после выполнения операции деления частное записывается в регистр AL, остаток – в регистр АН.
Для двухбайтовых операций делимое помещается в регистры DX:AX (в DX – старшая часть, в АХ – младшая); после выполнения операции деления частное записывается в регистр АХ, остаток – в регистр DX.
В качестве операнда-делителя команды idiv можно указывать регистр данных или ячейку памяти; не допускается деление на непосредственное значение. Если делитель равен 0, или если частное не помещается в назначенный регистр, возбуждается прерывание через вектор 0. Команда не воздействует на флаги процессора.
Пример 1:
mov AX,506; Делимое mov BL,50; Делитель idiv BL; AL=0Ah (частное), AH=06h ; (остаток)
Рис. П3. Состояние стека после входа в подпрограмму и выполнения команды enter8.0(на рисунке адреса ячеек уменьшаются в низ)
Пример 2:
;В полях данных long dd 0F0007h; Делимое ; В программном сегменте mov DX,word ptr long+2; DX=000Fh, старшая часть делимого mov AX,word ptr long; AX=0007h, младшая часть делимого mov CX,256; Делитель idiv СХ; AX=0F00h (частное), ;DX=0007h (остаток) Пример 3 mov AX,-506; AX=FE06h, делимое mov BL,50; Делитель idiv BL; AL=F6h (-10), AH=FAh (-6)
Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. При этом, если делитель представляет 32-битовую величину, то возможен только один вариант команды деления, когда делимое находится в парс регистров EDX:EAX. В этом случае частное будет помещено в регистр БАХ, остаток – в EDX.
Пример:
; В полях данных dvd dq – 100001; Делимое ;B программном сегменте mov EAX,dword ptr dvd EAX=FFFE795Fh ;(младшая часть делимого) mov EDX,dword ptr dvd+4 EDX=FFFFFFFFh; (старшая часть делимого) mov EBX,50; Делитель idiv EBX; Частное в EAX=FFFFF830h= ;-2000, остаток в EDX=FFFFFFFFh=-1