Авторизация


...

Кто на сайте?

Сейчас 57 гостей и ни одного зарегистрированного пользователя на сайте

Статистика

-Посетители : 239
-Материалы : 214

ПП умножения константы 0xFFFF на байт

Категория: 5. Программные приемы
Автор: MAZ Просмотров: 3481

altХочу популярно, на примере объяснить, что мне нравится в ассемблере. Это его гибкость и возможность подумать и сделать не стандартно именно под необходимую задачу.

Сразу скажу, я ни в какой мере не осуждаю любителей языков высокого уровня.

Это просто глупо, особенно при объеме  памяти и производительности современных микроконтроллеров.

Мне нужно было произвести простое вычисление, умножить двухбайтную константу 0xFFFF на однобайтное число.

  Однобайтное число не может быть равно 0. Это проверялось до вычисления.  Если запустить стандартную, известную мне, процедуру умножения, то это от 100 до 200 машинных тактов Меня это не устраивало.

На Си программист обычно не думает об этой мелочи, всего одна строчка и пусть компилятор разбирается.

Забегу вперед, процедура на ассемблере заняла всего 7 тактов, что меня сильно порадовало.

Результат умножение двух байтного числа на однобайтное это максимум трехбайтная переменная. Назовем её REZYLTAT. Множитель – REG.

 Так как на ноль не умножаем. То  в REZYLTAT должно быть при умножении на 1 число 0x00FFFF. Если подумать, то просматривается простая закономерность. Для умножения надо вычесть 1 из REG  и переписать в старший байт REZYLTAT  и из младшего байта REZYLTAT вычесть это же число. Все. Очень просто. Вот текст.

; определим переменные 
REZYLTAT :3    
REG
; умножение  константы 0xFFFF на REG ( REG не равен 0)
       movlw  0xFF          ; запишем 0xFF
       movwf  REZYLTAT +1   ; в средний байт 
       movwf  REZYLTAT      ; в  младший байт
       decf   REG           ; отнимем 1 из множителя
       movf   REG,W         ; и запишем результат 
       movwf  REZYLTAT +2   ; в старший байт 
       subwf  REZYLTAT      ; отнимем из младшего байта
       return    

ну и полный вариант, REG любое число

; умножение  константы 0xFFFF на байт
       movf   REG,W         ; проверяем на нуль
       btfsc  STATUS,Z
       goto   ZERO          ; результат умножения ноль 
       movlw  0xFF          ; запишем 0xFF
       movwf  REZYLTAT +1   ; средний байт
       movwf  REZYLTAT      ; младший байт
       decf   REG           ; отнимем 1 из множителя
       movf   REG,W         ; и запишем результат 
       movwf  REZYLTAT +2   ; в старший байт
       subwf  REZYLTAT      ; отнимем из младшего байта
       return    
ZERO   clrf   REZYLTAT
       clrf   REZYLTAT+1
       clrf   REZYLTAT+2
       return

данный алгоритм отлично походит при умножении одного байта  на любую константу  0xFFF….FFF с минимальными изменениями текста программы


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2018 © ChipMK.ru

ChipMk.ru Яндекс Метрика