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

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

div_unsign_NM proc
;НАЧ_ПРОГ
;//шаг 1 – нормализация:
;D1 – нормализация
;d: = b/(v[n-1]+1)
xor ax,ax
mov dl,v
inc dl;vn-1+1
mov ax,b
div dl
mov d,al;d=b/(v1+1)
;u[n+m…0]: = u[n+m-1…0]*d
mul_unsign_NM u,m,d,1,w
cld
push ds
pop es
lea si,w
lea di,u0
mov cx,m+1
rep movsb
;v[n-1…0]: = v[n-1…0]*d
mul_unsign_NM v,n,d,1,w
cld
push ds
pop es
lea si,w+1
lea di,v
mov cx,n
rep movsb
;//шаг 2 – начальная установка j:
;mm: = m-n; j: = mm
;D2:
mov si,0;n=0 (? n=n+m)
;D3:
@@m7:
;//шаг 3 – вычислить частичное частное qq:
;qq: = (u[j+n]*b+u[j+n-1]) / v[n-1]
;rr: = (u[j+n]*b+u[j+n-1]) MOD v[n-1]
@@m1: xor ax,ax
mov al,u0[si]
mul b
shl eax,16
shrd eax,edx,16;результат умножения в eax
xor edx,edx
mov dl,u0[si+1]
add eax,edx
shld edx,eax,16;восстановили пару dx:ax для деления
xor bx,bx
mov bl,v;v › bx
div bx
mov qq,ax
mov rr,dx
@@m2:
;проверим выполнение неравенства:
;ДЕЛАТЬ ПОКА 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:
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.