Сборник по задачам и примерам Assembler


Деление (N+М)-разрядного беззнакового целого на число размером М байт - часть 3


;ДЕЛАТЬ ПОКА tf

;НАЧ_БЛОК_1

;ЕСЛИ qq==b OR qq*v[n-2] > b*rr+ u[j+n-1] ТО

;НАЧ_БЛОК_2

;qq:=qq-1

;rr:=rr+v[n-1]

;ЕСЛИ rrіb ТО tf:=FALSE

;КОН_БЛОК_2

;ИНАЧЕ tf:=FALSE

;КОН_БЛОК_1

@@m4:

mov ax,qq

cmp ax,b ;qq<>b

je @@m9 ;на qq=qq-1

;qq*vn-2>b*rr+uj+n-2

mul v+1 ;qq*vn-2

mov temp,ax ;temp=vn-2*qq

xor ax,ax

mov ax,b

mul rr

xor dx,dx

mov dl,u0[si+2]

add ax,dx

cmp temp,ax ;qq*vn-2 > b*rr+uj+n-2

jna @@m8

@@m9:

dec qq

xor ax,ax

mov al,v

add rr,ax

jmp @@m4

@@m8:

@@m3:

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

 




- Начало -  - Назад -  - Вперед -