Деление двоичных чисел
Сегмент данных может быть задан, например, так:
.data значения в и и v нужно внести u db 5.6.7:делимое N=$-u:длина в байтах значения и v db 15;делитель w db N dup (0) r dw 0:остаток
В программе div_unsign_N_l.asm порядок следования байтов делимого неестествен для микропроцессора Intel. Поэтому на дискете приведен вариант программы div_unsign_N_l_I.asm, в котором эта проблема устранена.
Далее при рассмотрении программы деления многобайтных двоичных чисел нам понадобится макрокоманда divunsignN деления N-разрядного беззнакового целого на одноразрядное число размером 1 байт (порядок следования байтов не характерен для процессоров Intel, то есть старший байт находится по младшему адресу). Текст макрокоманды приведен на дискете.
Деление (N+М)-разрядного беззнакового целого на число размером М байт
ПРОГРАММА div_unsign_NM ;---------------------------------------------------------- ;div_unsign_NM.asm – программа на ассемблере деления (N+M)-разрядного беззнакового ; целого на число размером N байт ;(порядок – старший байт по младшему адресу (не Intel)) ;Вход: U и V – u=um+n-1..+u1u0 – делимое; v=vn-1…v1v0- ;делитель, m – длина делимого;n – длина делителя; b=256 – ;основание системы счисления. ;Выход: q=qmqm-1…q1q0 – частное, r=rn-1…r1r0 – остаток. ;Ограничения: vn-1№0 OR 0ffh; N>1. ;---------------------------------------------------------- masm model small,c .data ;значения в u и v нужно внести u0 db 0;дополнительный старший байт делимого для нормализации u db 1fh,0c3h,12h,0ffh;делимое m=$-u;длина в байтах значения u v0 db 0;для компенсирующего сложения 0vn-1…v1v0 v db 3fh,50h;делитель n=$-v;длина в байтах значения v mm=m-n w db m+1 dup (0);для промежуточных вычислений q db mm dup (0);частное qq dw 0;частичное частное;qq db 0 rr dw 0;частичный остаток r db n dup (0);остаток d db 0 temp dw 0 temp_r db n dup (0) borrow db 0;факт заема на шаге D4 k db 0;перенос 0 Ј k < 255 b dw 100h;размер машинного слова carry db 0 .stack 256 .486 .code calc_complement_r proc dec cx mov si,cx neg byte ptr [bx][si];дополнение первого байта cmp byte ptr [bx][si],0;operand=0 – особый случай jne short $+3 stc;установить cf, так как есть перенос jcxz @@exit_cycl;для однозначного числа @@cycl: dec si not byte ptr [bx][si] adc byte ptr [bx][si],0 loop @@cycl @@exit_cycl: ret calc_complement_r endp mul_unsign_NM macro u,i,v,j,w local m2,m4,m6 push si ;очистим w push ds pop es xor al,al lea di,w mov cx,i+j