Двоично-десятичные числа (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