Двоично-десятичные числа (BCD-числа). Неупакованные BCD-числа.
Деление N-разрядного беззнакового целого BCD-числа на одноразрядное BCD-число размером 1 байт (макрокоманда)
div_bcd_l_r macro u.N.v.w.r local ml
:div_bcd_l_r u.N.v.w.r – деление N-разрядного беззнакового целого BCD-числа
;на одноразрядное BCD-число размером 1 байт.:Вход: и – делимое
; N – длина делимого, v – делитель.
:Выход: w – частное, r – остаток.
:Порядок следования байтов – старший байт по младшему адресу (не Intel) (!).
mov r.О
lea si.u;j=0
хог di.di:j=0
mov cx.N
xor dx.dx
xor bx.bx
ml: mov ah,г
mov al.[si]
aaJ
div v сформировать результат:
mov w[di].al;частное
mov r.ah.- остаток в r
inc si
inc di
loop ml
:если нужно – получим модуль (уберите знаки комментария)
: mov cx.N;длина операнда
: lea bx.w
; call calc_abs_r
endm
Деление неупакованных BCD-чисел
:div_bcd_NM_r.asm – деление неупакованных BCD-чисел и и v размером n+m и п байт.
;Вход: и-и^гиз-.и,^,, – делимое: v=v1v2…vn – делитель .b=256 – основание системы счисления.
;Выход: qq1q2-.qm – частное .r=rir2…rn – остаток,
:Порядок следования байт – старший байт по младшему адресу (не Intel) (!).
.data значения в u и v нужно внести
uO db 0 дополнительный байт для нормализации
u db 1.0.3.5.9.4.6:делимое
m=$-u:длина в байтах значения и
vO db 0:для сложения OvjV2..vn
v do 5.9.1:делитель
n=$-v:длина в байтах значения v
ГПП1=П1-П
w db m+1 ctup (0):для промежуточных вычислений q db mm dup (0):частное qq db 0
г db n dup (0):остаток
b dw 10 юснование системы счисления
d db 0
temp dw 0
temp_r db n dup (0)
borrow db 0:факт заема на шаге D4
k db 0;перенос 0 =< k < 255
carry db 0
.code
:вставить описание макрокоманд calc_complement_r .mul_bcd_r .sub_bcd_r .add_bcd_r.:div_bcd_l_r
div_bcd_NM_r proc;D1 – нормализация
xor ax.ax
mov dl.v
inc dl:vl+l
mov ax.b
div dl
mov d.al:d=b/(v1+l)
mul_bcd_r u.m.d.l.w
eld
push ds
pop es
lea si.w
lea di.uO
mov cx.m+1 rep movsb