Сборник по задачам и примерам Assembler


Умножение N-байтного числа на число размером М байт с учетом знака - часть 2


хог ах.ах ; ЕСЛИ БИТ_7_БАЙТА((и[0] AND 80h) XOR v[0])==1 TO sign:=1

mov al.u

and al.80h

xor al.v

bt ax,7

jnc $+7

mov sign.l результат будет отрицательным

lea bx.v ;получим модули сомножителей: u:~|u|; v:=|v|

mov ex.j

call calc_abs_r

1 ea bx, u

mov ex.i

call calc_abs_r ;теперь умножаем

call mul_unsign_NM ;w:=inul_unsign_NM() ;в этой точке - модуль результата ;восстанавливаем знак результата

хог si. si

emp sign.0 :ЕСЛИ sign==0 ТО ПЕРЕЙТИ_НА №т

je @@m ://для отрицательного результата вычислить дополнение значения w длиной i+j

mov ex,i+j ;w:=calc_complement_r(); w[0]:=0-w[0]

lea bx.w

call calc_complement_r ;в этой точке - двоичное дополнение результата @@m: ret ;КОН_ПРОГ

mul_sign_NM endp main:

call mul_sign_NM end main

Процедура mul_sign_NM выполняет умножение с учетом знака исходных значений в порядке байтов — старший байт по младшему адресу. Если вы используете отрицательные значения операндов, тс для правильной работы тестовой программы в сегменте данных их необходимо задать в дополнительном коде.

В данной программе используются две новые процедуры — calc_complement_r и calc_abs_r, вычисляющие соответственно дополнение и модуль числа размером N байт. Подобные процедуры уже были разработаны и введены нами для значений, порядок следования байт которых характерен для микропроцессоров Intel. Чтобы различать эти две пары процедур, процедуры для вычисления дополнения и модуля числа размером байт с порядком следования байтов, отличным от Intel, мы назвали реверсивными.




- Начало -  - Назад -  - Вперед -