654

Еще одно решение задачи о модуле числа

Навеяно сданной сессиейИтак,задача - взять модуль целого числа (скажем,размером в байт) без сравненийи циклов ( loop так или иначе производит сравнение).Признаком того,что число отрицательное является его крайний левый бит.На этом и построим решение.Так как модуль отрицательного числа в eax вычисляется по формуле nще eax/фвв eax,1,то:Пусть в al хранится число,модуль которого нам нужен1)помещаем значение знакового бита в регистр dl sub dl,dl bt al,7 adc dl,02)add al,1 можно заменить на sub al,dl ,что будет верно для al любого знака3)инвертация: Строим функцию,которая за нас будет определять,стоит ли инвертировать биты в al. Для этого можно построить таблицу истинности необходимой функции и по ней построить СДНФ функции. Бит al[7..0] dl Результат 0 0 0 1 0 1 0 1 1 1 1 0 X1 X2Искомая СДНФ равна (X1 and !X2) or (!X1 and X2) Т.е. для каждого бита al мы вычисляем эту функцию и заменяем бит на ее результатЭта функция не является единственной - так,на базисе (+) она будет такой: X1(+)X2 - где (+) - операция сложения по модулю 1
0