Умножение двоичных чисел
Вычисление дополнения числа размером N байт (реверсивное)
:calc_complement_r – процедура на ассемблере вычисления дополнения числа размером N байт :(старший байт по младшему адресу). ;Вход: регистр ВХ – адрес операнда в памяти: регистр СХ – длина операнда. ;Выход: регистр ВХ – адрес дополнения операнда в памяти. ca1c_complement_r ргос dec ex mov si.ex neg byte ptr [bx][si] дополнение первого байта cmp byte ptr [bx][si].O: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
Для значений размерностью 1/2/4 байта дополнение можно получать с помощью одной команды NEG:
neg operand
Дополнение значений N байт вычисляет алгоритм, реализованный в процедуре calc_complement_r. Обратите внимание, что первый байт может быть нулевым, поэтому алгоритм учитывает это обстоятельство. Попытка получить его дополнение с помощью команды NE6 обречена на провал. Флаг CF в этом случае также должен устанавливаться программно. Подумайте, почему?
Вычисление модуля числа размером N байт (реверсивное)
calc_abs_r – процедура на ассемблере вычисления модуля числа размером N байт :(старший байт по младшему адресу). :Вход: регистр ВХ – адрес операнда в памяти: регистр СХ – длина операнда. :Выход: регистр ВХ – адрес модуля операнда в памяти. .code calc_abs_r proc определим знак операнда test byte ptr [bx],80h;проверяем знак operand jz @@exit:число положительное call calc_complement_r @@exit: ret calc_abs_r endp
Для вычислений над операндами, порядок следования байтов которых характерен для микропроцессоров Intel, нам придется разработать еще один вариант процедуры умножения значений размерностью в произвольное количество байтов. Псевдокод и соответствующая ему программа на ассемблере mul_sign_NM_I приведены на дискете.