[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Правила простые. Есть 2 числа в форматах, допустим, A.B и C.D (A,C -число разрядов на целые части, B,D - на дробные части).
Суммарная разрядность результата умножения=A+C+B+D (режим умножителя -целочисленный, ena m_mode). Из них A+C разрядов - целая часть, B+D - дробная. Т.е. формат результата будет (A+C).(B+D). По другому - младшие B+D разрядов - дробная часть, остальные - целая.
Ужатие до требуемого формата делается отбросом (либо простым, либо с округлением) нескольких младших разрядов дробной части. Отброс же, в свою очередь, делается сдвигом, причем без разницы в какую сторону (число сдвигов разное, конечно). Но, если в требуемом выходном формате число разрядов на целую часть меньше A+C, возможно переполнение, это надо отслеживать.
Конкретно Ваш случай:
3.13*8.8=11.21 (с ena m_mode). Но с dis m_mode результат автоматически сдвигается влево на 1 разряд и, если брать только mr1,mr0 регистры, будет иметь формат 10.22. Отбросив 16 разрядов mr0, т.е. сохранив только MR1, автоматом получите 10.6. Но это пройдет только если Ваш результат по модулю меньше 512. В противном случае - переполнение. Т.е. -4*-128=512, но 512, при 10 разрядном представлении целой части, есть минус 512. Однако в Вашем случае переполнение легко обнаруживается и, следовательно, рез-т м.б. скорректирован:
dis m_mode;
mr=mx0*my0(ss) или mr=mx0*my0(rnd);
if mv sat mr; {контроль переполнения}
dm(result)=mr1;
Собственно все, что я написал, имеется в UM ADSP21XX.
E-mail: info@telesys.ru