Деление двоичных чисел
;D4 ;//шаг 4 – умножить и вычесть: ;u[j+n…j]: = u[j+n…j]-qq*v[n-1…0] mul_unsign_NM v,n,qq,1,w mov bx,si push si sub_sign_N u0[bx],w,<n+1>;v< › w ;ЕСЛИ u[j+n…j]<0 ТО;запоминаем факт заема, получаем дополнение ;НАЧ_БЛОК_3 ;borrow: = 1 ;u[j+n…j]: = calc_complement_r(u[j+n…j]) ;КОН_БЛОК_3 jnc @@m5;переход, если нет заема (результат положительный) mov borrow,1;запоминаем факт заема, получаем дополнение pop si lea bx,u0[si] mov cx,n+1 call calc_complement_r ;D5 ;//шаг 5 – проверка остатка: ;q[j]: = qq @@m5: mov ax,qq mov q[si],al ;ЕСЛИ borrow<>1 ТО cmp borrow,1;был заем на шаге D4?? jne @@m6 ;НАЧ_БЛОК_4 ;//шаг 6 – компенсирующее сложение: ;q[j]: = q[j]-1 ;u[j+n…j]: = u[j+n…j]+v[n-1…0] ;КОН_БЛОК_4 ;D6 – компенсирующее сложение mov borrow,0;сбросим факт заема dec q[si] mov bx,si push si add_unsign_N carry,u0[bx],v0,<n+1>;перенос не нужен ;D7 ;//шаг 7 – цикл по j: ;j: = j-1 @@m6: pop si inc si ;ЕСЛИ jі0 ТО ПЕРЕЙТИ_НА @@m7 cmp si,mm jle @@m7 ;D8 – денормализация ;//шаг 8 – денормализация: ;//вычислим остаток: ;r[n-1…0]: = u[n-1…0]/d mov bx,si div_sign_N u0[bx],N,d,r,temp_r ret ;//q[m…0] – частное, r[n-1…0]? астаток ;КОН_ПРОГ div_unsign_NM endp main: mov dx,@data mov ds,dx call div_unsign_NM mov ax,4c00h int 21h end main
Программа не работает, если первый байт делителя равен 0f fh. Сам алгоритм не изменяется, а проблема устраняется просто – необходимо лишь в нужных местах программы поменять разрядность операндов.
Порядок следования байтов делимого неестествен для микропроцессора Intel. Программу деления многобайтных двоичных чисел с порядком следования байтов "младший байт по младшему адресу" оставляем вам в качестве упражнения.