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

Двоично-десятичные числа (BCD-числа). Неупакованные BCD-числа.

mul_bcd_r v.n.d.l.w
eld
push ds
pop es
lea si.w+1
lea di.v
mov ex,n rep movsb:D2:
mov si.O;n=0:D3: @@m7: moval.uO[si]
emp v,al
jne @@ml
mov qq.9:qq=b-l
jmp @@m2
(<t@ml: xor ax,ax
mov al.uO[si]
mul b
xor dx.dx
mov dl,uO[si+l]
add ax.dx
mov bl.v;v › bx divbl
mov qq.al
@@m2::проверим выполнение неравенства:
@@m4: mul v+1
mov temp .ax: taiip=v2*qq
xor ax.ax
mov al,uO[si]
mul b
xor edx.edx
mov dl.uO[si+l] add dx.ax
mov al.qq
mul v:eax=qq*vl
sub dx,ax
xchg dx.ax
mul b
xor bx.bx
mov bl.uO[si+2]
add ax.bx
cmp temp,ax
jna (a@m3
dec qq
mov al.qq
jmp @@m4
@@m3:: D4
mul_bcd_r v.n.qq.l.w
mov bx.si
push si
sub_bcd_r uO[bx].<n+l>.w,<n+l>,uO[bx];v< › w
jnc @@m5:переход, если нет заема (результат положительный)
mov borrow.1;запоминаем факт заема, получаем дополнение
pop si;D5
@@m5: moval.qq
mov q[si].al
cmp borrow.1:был заем на шаге D4??
jne @@m6:D6 – компенсирующее сложение
mov borrow.0:сбросин факт заема
dec q[si]
mov bx.si
push si
add_bcd_r uO[bx].<n+l>.vO,<n+l>,uO;перенос не нужен:D7
@@m6: pop si
inc si
cmp si.mm
jle @@m7:D8 – денормализация
mov bx.si
div_bcd_l_r uO[bx],N,d.r.temp_r
ret
div_bcd_NM_r endp *
main:
call div_bcd_NM_r end main
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.