Деление двоичных чисел
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:
