Иллюстрированный самоучитель по задачам и примерам Assembler

Деление двоичных чисел

Аналогично операции умножения деление реализуется двумя типами команд – учитывающими и не учитывающими знаки операндов. Эти команды накладывают ощутимые ограничения на размерность (а соответственно и на диапазон значений) операндов. Поэтому мы рассмотрим вначале пример стандартного применения команд, после чего займемся реализацией алгоритмов деления чисел произвольной размерности.

Деление без учета знака значения размером 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
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.