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

блестящий фетр, блестящий фетр на алиэкспресс. | Фанеровка шпоном шпонирование процесс облицовки деталей подробно. | Гербалайф прайс лист по материалам www.herbalinfo.ru. | Свечи факельные смотрите на http://www.laystela.ru. | купить удостоверение санкт-петербург |

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


mov dl,k

add ax,dx ;t=(ax) ? временная переменная

push dx

xor dx,dx

div b ;t mod b

mov ah,dl

pop dx

mov k,al

mov w[bx+si+1],ah

;m5

dec si

loop m4

mov al,k

mov w[bx],al

m6:

dec bx

pop cx

loop m2

pop si

endm

sub_sign_N macro minuend,deduction,N

local cycl,m1

;старший байт по младшему адресу

push si

mov cl,N

mov si,N-1

cycl: mov al,deduction[si]

sbb minuend[si],al

; jnc m1

; neg minuend[si]

m1: dec si

loop cycl

pop si

endm

add_unsign_N macro carry,summand_1,summand_2,N

local cycl,end_p

mov cl,N

mov si,N-1

cycl: mov al,summand_2[si]

adc summand_1[si],al

dec si

loop cycl

jnc end_p

adc carry,0

end_p: nop

endm

div_sign_N macro u,N,v,w,r

local m1

;старший байт по младшему адресу

mov r,0

lea si,u ;j=0

xor di,di ;j=0

mov cx,N

xor dx,dx

xor bx,bx

m1: mov ax,256 ;основание с.с.

mul word ptr r ;результат в dx:ax

mov bl,[si]

add ax,bx

div v

;сформировать результат:

mov w[di],al ;частное

mov r,ah ;остаток в r

inc si

inc di

loop m1

;если нужно - получим модуль (уберите знаки комментария)

; mov cx,N ;длина операнда

; lea bx,w

; call calc_abs_r

endm

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:

;проверим выполнение неравенства:




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