Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: WinAVR assembler
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
dimka76
Пишу смешанный проект. Часть файлов на Си, а часть на ассемблере.
В ассемблерном файле возникла следующая проблема.

Код
#define            ReceiverPin         (0x3F)
#define        FirstReceiverPin    ((ReceiverPin) & (0x01))? (0) : (((ReceiverPin) & (0x02))? (1) : (((ReceiverPin) & (0x04))? (2) :    \
                                                (((ReceiverPin) & (0x08))? (3) : (((ReceiverPin) & (0x10))? (4) : (((ReceiverPin) & (0x20))? (5) :     \
                                                (((ReceiverPin) & (0x40))? (6) : (((ReceiverPin) & (0x80))? (7) : (0))))))))
..........
..........
ldi        r16, (1<<(FirstReceiverPin))


И вот. На строчку ldi... ругается.
Говорит не хватает скобки и мусор в конце строки.

Как можно это обойти, при условии, что #define FirstReceiverPin сохранить, он очень важен ?
Сергей Борщ
QUOTE (dimka76 @ Feb 14 2012, 07:25) *
Говорит не хватает скобки и мусор в конце строки.
А как же еще ассемблеру реагировать на сишный тернарный оператор "? :" ?
Максимум, что тут можно посоветовать - переписать ваш #define во что-то чисто арифметическое, например,
CODE
#define LSB(byte)               ((byte) & -(byte))      // isolate rightmost '1'
#define BIT_WEIGHT(byte,pos)    ((((byte) >> (pos)) & 1) * (pos))
#define CTZ(byte)               (BIT_WEIGHT(byte, 1) + BIT_WEIGHT(byte, 2) + ... + BIT_WEIGHT(byte, 7))

#define FirstReceiverPin        CTZ(LSB(ReceiverPin))
Возможно LSB и BIT_WEIGHT не самые удачные названия для этого макроса, но ничего в голову не приходит.

Хотя... Если вам FirstReceiverPin нужен только в контексте (1 << FirstReceiverPin), то можно упростить задачу:
CODE
#define RX_PIN_MASK        ((ReceiverPin) & -(ReceiverPin))
     ldi    r16, RX_PIN_MASK
dimka76
Спасибо.

Цитата(Сергей Борщ @ Feb 14 2012, 10:03) *
А как же еще ассемблеру реагировать на сишный тернарный оператор "? :" ?


у меня ассемблерный файл имеет расширение S, а как говорит дока,
асемблерные файлы с таким расширением обрабатываются Си препроцессором.
Вот и не понятно, почему препроцессор не обработал и ассемблер ругается.
С другими то дефайнами ошибок нет.
например с
Код
#define bla-bla    r16

ldi bla-bla, 10

Сергей Борщ
QUOTE (dimka76 @ Feb 14 2012, 12:56) *
Вот и не понятно, почему препроцессор не обработал и ассемблер ругается.
Потому что #define - директива препроцессора. А конструкция "A = B ? C : D" явлается оператором языка С, которая для препроцессора является обычным текстом как и весь остальной исходник.
dimka76
Цитата(Сергей Борщ @ Feb 14 2012, 14:09) *
Потому что #define - директива препроцессора. А конструкция "A = B ? C : D" явлается оператором языка С, которая для препроцессора является обычным текстом как и весь остальной исходник.


Ясно.
Спасибо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.