реклама на сайте
подробности

 
 
> WinAVR assembler
dimka76
сообщение Feb 14 2012, 05:25
Сообщение #1


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Пишу смешанный проект. Часть файлов на Си, а часть на ассемблере.
В ассемблерном файле возникла следующая проблема.

Код
#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 сохранить, он очень важен ?


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Feb 14 2012, 07:03
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение Feb 14 2012, 10:56
Сообщение #3


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



Спасибо.

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


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

ldi bla-bla, 10



--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 14 2012, 11:09
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
dimka76
сообщение Feb 14 2012, 11:41
Сообщение #5


developer
****

Группа: Свой
Сообщений: 902
Регистрация: 12-04-06
Из: Казань
Пользователь №: 16 032



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


Ясно.
Спасибо.


--------------------
Все может быть и быть все может, и лишь того не может быть-чего уж точно быть не может, хотя..и это может быть.
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 13:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016