Форум по микроконтроллерам: Сложение двух n-байтных чисел - Форум по микроконтроллерам

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

Сложение двух n-байтных чисел

#1 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 22 Октябрь 2011 - 12:25

Последняя статья в обмене КЕА подтолкнула меня написать данный макрос, дабы избежать циркуляра с кучей ПП для каждого кол-ва байт.
Сам макрос:
Add_M     MACRO     _var_size, _v_1, _v_2, _res
local     byte_cnt=.1
     movf      _v_2, W
     addwf     _v_1, W
     movwf     _res
          while (byte_cnt<_var_size)
               movf      _v_1 + byte_cnt, W
               movwf     _res + byte_cnt
               movf      _v_2 + byte_cnt, W
               btfsc     STATUS, C
               incfsz    _v_2 + byte_cnt, W
               addwf     _res + byte_cnt, F
          byte_cnt ++
          endw
ENDM

Пример использования:
cblock 20h
     var_1     :.5  
     var_2     :.5
     result    :.5
endc

........
........
........

Add_M     .5, var_1, var_2, result
Складываем 5 байт из переменных var_1 и var_2 и помещаем результат в переменную result.

Проект с примером:
Прикрепленный файл  summ.rar (10,62К)
Количество загрузок:: 189

Кстати, автору последней статьи "обмена", для справочки. Его код занял 39 команд, а этот макрос, с пятью байтами, разворачивается в код из 27 команд. Возможно, он что-то отсюда подчеркнёт для себя ;)
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#2 Пользователь офлайн   Bigor 

  • Знаток
  • PipPip
  • Группа: SuperMod
  • Сообщений: 65
  • Регистрация: 15 Февраль 11
  • ГородКиев

Отправлено 22 Октябрь 2011 - 12:39

Alex поясни эти две строки:

Просмотр сообщенияAlex (22 Октябрь 2011 - 12:25) писал:


while (byte_cnt<_var_size)

byte_cnt ++

Не стреляйте в пианиста, он играет как умеет
0

#3 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 22 Октябрь 2011 - 12:53

local     byte_cnt=.1
Создана локальная переменная для макроса byte_cnt, и ей присвоено значение .1. Она будет считать байты, переданные в макрос.

while (byte_cnt<_var_size)
....
byte_cnt ++
endw
Это создан цикл, в котором переменная будет прибавляться на единицу (byte_cnt ++). Условием выхода из цикла будет неравенство условия в скобках директивы while. Т.е. пока переменная byte_cnt меньше _var_size (кол-во байт, переданное макросу), в исходник будет печататься код, находящийся в теле цикла. Т.е., грубо говоря, он (код) повторится столько раз, сколько байтов обрабатывается.
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#4 Пользователь офлайн   Bigor 

  • Знаток
  • PipPip
  • Группа: SuperMod
  • Сообщений: 65
  • Регистрация: 15 Февраль 11
  • ГородКиев

Отправлено 22 Октябрь 2011 - 13:00

:i-m_so_happy: Спасибо
Не стреляйте в пианиста, он играет как умеет
0

#5 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 22 Октябрь 2011 - 13:02

Нема за шо :friends:
Не говорите что мне делать, и я не скажу куда Вам идти !
0

#6 Пользователь офлайн   Alex 

  • Убиватель МК
  • PipPipPipPip
  • Группа: Пользователи
  • Сообщений: 1 891
  • Регистрация: 15 Февраль 11

Отправлено 22 Октябрь 2011 - 13:18

Во что разворачивается макрос:
2 байта
0822     MOVF 0x22, W                 46:    Add_M     .2, var_1, var_2, result
0720     ADDWF 0x20, W
00A4     MOVWF 0x24
0821     MOVF 0x21, W
00A5     MOVWF 0x25
0823     MOVF 0x23, W
1803     BTFSC 0x3, 0
0F23     INCFSZ 0x23, W
07A5     ADDWF 0x25, F


5 байт
0825     MOVF 0x25, W                   46:    Add_M     .5, var_1, var_2, result
0720     ADDWF 0x20, W
00AA     MOVWF 0x2a
0821     MOVF 0x21, W
00AB     MOVWF 0x2b
0826     MOVF 0x26, W
1803     BTFSC 0x3, 0
0F26     INCFSZ 0x26, W
07AB     ADDWF 0x2b, F
0822     MOVF 0x22, W
00AC     MOVWF 0x2c
0827     MOVF 0x27, W
1803     BTFSC 0x3, 0
0F27     INCFSZ 0x27, W
07AC     ADDWF 0x2c, F
0823     MOVF 0x23, W
00AD     MOVWF 0x2d
0828     MOVF 0x28, W
1803     BTFSC 0x3, 0
0F28     INCFSZ 0x28, W
07AD     ADDWF 0x2d, F
0824     MOVF 0x24, W
00AE     MOVWF 0x2e
0829     MOVF 0x29, W
1803     BTFSC 0x3, 0
0F29     INCFSZ 0x29, W
07AE     ADDWF 0x2e, F

Не говорите что мне делать, и я не скажу куда Вам идти !
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей