![]() | |
НПО Системы Безопасности (499)340-94-73 График работы: ПН-ПТ: 10:00-19:00 СБ-ВС: выходной ![]() ![]() |
Главная » Периодика » Безопасность 0 ... 119120121122123124125 ... 159 Для сравнения на «равно» добавляются строчки: btfss STATUS 1 Выполнение следующей команды, , если результат не равен О goto Zero Skip , В противном случае (равен 0) , эта команда пропускается а для сравнения на «не равно» соответственно; btfsc STATUS, Z , Выполнение следующей команды, , если результат равен О goto NotZero Skip , В противном случае (не равен 0) , эта команда пропускается В сл}чае проверки на «больше» (первая 16-разрядная переменная больше, чем вторая) результат должен быть не О и не меньше 0. Для тестирования используется следующий код: btfsc 2, 7 Проверка 16-го разряда разности, goto NotGreater Skip пропуск, если он не равен 1 lorwf 2, W , Проверка на О btfsc STATUS z goto NotGreater Skip Обратите внимание, что проверяется только старший бит 16-разрядной разности. Если этот бит равен 1, то первая переменная меньше, чем вторая. Если он равен О, то первая переменная больше, и необходимо проверить, не равен ли результат О (в противном случае равенство). Соответственно для проверки на «меньше»: btfss 2 7 Проверка 16-го разряда разности goto NotLess Skip пропуск если он равен 1 Чтобы проверить, выполняется ли условие «больше или равно», надо стереть три последние строчки кода проверки условия «больше». Для проверки условия «меньше или равно» три строчки из фрагмента проверки «не равно» добавляются к проверке на «меньше». Ниже приведен полный код проверки условия «регистр Regl Меньше или равен регистру Reg2»: "ovf Reg2 + 1 w Загрузка старшего байта subwf Regl + 1, w , Вычитание "ovwf 2 , Сохранение во временном регистре Movf Reg2, w subwf Regl, w btfss STATUS, С decf 2 lorwf 2, w btfsc STATUS, Z goto EqualLess Skip btfsc 2, 7 goto EqualLess Skip Загрузка младшего байта Вычитание При необходимости декрементируется старший байт Проверка на равенство О Если нет, то пропуск Если равно, переход Если число отрицательное, выполнение продолжается В противном случае переход УМНОЖЕНИЕ Ниже представлена программа умножения, требующая отдельного байта для подсчета числа итераций в цикле:
Приведенная ниже программа максимально эффективна по времени при выполнении 16-разрядного умножения с 32-битным р зультатом: на каждом шаге она вместо 32-разрядного сложения осуществляет 16-разрядное (с переносом) сложение, и затем данные сдви! аются вправо. Такой код изменяет не множимое, а множит е чь в этом коде для произведения используется 32-битная величина (которая может быть задана строкой Product 5 в директиве опреде-дения переменных CBLOCK). clrf clrf movlw movwf Loop btfss goto clrf movf addwf btfsc incf movf addwf btfsc incfcz goto incf Skip decfsz goto Product + 2 Product + 3 16 BitCount Multiplier + 1, Multiplier, f STATUS, С Skip Product + 4 Multiplicand + 1 Product + 3, f STATUS, С Product + 4, f Multiplicand, w Обнуление байтов результата (Product) Работа с 15 битами Цикл по всем битам Правый сдвиг на один разряд Если перенос, то множимое добавляется к произведению Если перенос, то инкрементирование Product + 2, STATUS, С Product + 3, $ + 2 Product + 4, STATUS, Product Product Product Product Product, BitCount Loop + 4, + 3, + 2, + 1, f Учет переноса Правый сдвиг всех ячеек Сброс переноса Сдвиги Обе представленные программы могут работать как с положительными, так и с отрицательными числами. Для PIC-микроконтроллеров, имеющих встроенные множители 88 (например, PIC 17СххилиР1С 18Схх), 16-разрядное умножение в*йПолняется следующим образом: Clrf Clrf iiovf Product + 2 Product + 3 Al, w Очистка битов старших разрядов Сначала выполняется L-умножение 0 ... 119120121122123124125 ... 159 |