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

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

;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. Программу деления многобайтных двоичных чисел с порядком следования байтов "младший байт по младшему адресу" оставляем вам в качестве упражнения.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.