Деление двоичных чисел
Аналогично операции умножения деление реализуется двумя типами команд – учитывающими и не учитывающими знаки операндов. Эти команды накладывают ощутимые ограничения на размерность (а соответственно и на диапазон значений) операндов. Поэтому мы рассмотрим вначале пример стандартного применения команд, после чего займемся реализацией алгоритмов деления чисел произвольной размерности.
Деление без учета знака значения размером 2 байта на значение размером 1 байт
:div_unsign.asm – программа на ассемблере деления без учета знака значения ;размером 2 байта на значение размером 1 байт. :Вход: u – делимое: v – делитель. ;Выход: w – частное, r – остаток. .data:значения в и и v нужно внести u dw?:делимое v db?:делитель w db 0 r db 0 .code div_unsign proc mov ax.u div v сформировать результат: mov r.ah:остаток mov w.al:частное ret divjjnsign endp, main: call div_unsign end ma in
Деление чисел большей размерности (4/8 байтов) выполняется аналогично. Необходимо заменить директивы DB на DW/DD, регистр АХ на EAX/EDX: ЕАХ, регистр AL на АХ/ЕАХ, регистр АН на DX/EDX.
Деление с учетом знака значения размером 2 байта на значение размером 1 байт
:div_sign.asm – программа на ассемблере деления с учетом знака значения ;размером 2 байта на значение размером 1 байт. :Вход: u – делимое; v – делитель. :Выход: w – частное, r – остаток. .data значения в и и v нужно внести u dw?;делимое v db?;делитель w db О r db О .code div_sign proc mov ax.u idiv v сформировать результат: mov г,ah:остаток mov w.al;частное :если нужно получить модуль – уберите знаки комментария: mov cx.l;длина операнда ; lea bx.w: call calc_abs;или; neg w ret div_sign endp main: call div_sign end main
Деление чисел большей размерности (4/8 байтов) выполняется аналогично. Необходимо заменить директивы DB на DW/DD, регистр АХ на EAX/EDX:EAX, регистр AL на АХ/ЕАХ, регистр АН на DX/EDX.
Деление N-разрядного беззнакового целого на одноразрядное число размером 1 байт
:div_uns1gn_N_1.asm – программа на ассемблере деления без учета знака значения :размером N байт на значение размером 1 байт. ;Порядок следования байтов – старший байт по младшему адресу (не Intel) :Вход: u – делимое; v – делитель.:Выход: w – частное, r – остаток. .data значения в и и v нужно внести u db?;делимое N=$-u:длина в байтах значения и v db?:делитель w db N dup (0) г dw 0:остаток .code div_unsign_N_lproc mov г.О хоr si.si;j"0 mov cx.N хоr dx.dx хоr bx.bx @@ml: movax.256 основание с.с. mul г результат в dx:ax mov bl,u[si] add ax.bx div v сформировать результат: mov w[si].al:частное shr ax.8 mov г.ах юстаток в г inc si loop @@ml ret d i v_uns i gn_N_lendp main: call div_unsign_N_l end main