Цитата(Exstreem @ Jul 7 2010, 18:24)

Верно, на пустоту не проверить.
Макрос в асме, как функция в С; должны быть перечислены все параметры.
Если на пустоту не проверить, то можно проверить на 0 (.if @0<>0). Конечно, при объявлении макроса будет лишняя информация, зато получишь то что хотел.
Точно не помню как обозначается "не равно" - <>, либо еще как.
если быть точным то в AVRASM2 как в Си "не равно" это "!=". Однако вот результаты, заметьте, во втором случае в передаче параметра использовалась константа и ошибка произошла уже в строке 7.
В первом случае вызов:
pushl r1, r2, r3
Цитата
AVRASM: AVR macro assembler 2.1.2 (build 99 Nov 4 2005 09:35:05)
Copyright © 1995-2005 ATMEL Corporation
asm.asm(3): error: syntax error, unexpected REGISTER
asm.asm(20): info: macro 'pushl' called here
Во втором случае вызов:
pushl 10, r2, r3
Цитата
AVRASM: AVR macro assembler 2.1.2 (build 99 Nov 4 2005 09:35:05)
Copyright © 1995-2005 ATMEL Corporation
asm.asm(7): error: syntax error, unexpected REGISTER
asm.asm(20): info: macro 'pushl' called here
Макрос выглядит так:
Код
.MACRO pushl
.if @0!=0
push @0
.endif
.if @1!=0
push @1
.endif
.if @2!=0
push @2
.endif
.ENDM
unexpected REGISTER явно свидетельствует о том что условное макросредство .if ожидает не регистр, и косвенно подтверждает что в AVRASM параметры макрокоманды типизированы на константы и регистры

Цитата(ReAl @ Jul 6 2010, 18:12)

#if — это от С-шного препроцессора элементы взяты, они отрабатывают до того, как файл начинает анализировать "именно ассемблер".
Да действительно при сравнении #if препроцессора происходит сравнения @0 а не то что туда передается, препроцессор тут бессмысленно применять.
Цитата(ReAl @ Jul 6 2010, 18:12)

avrasm2 вроде бы существенно расширяли по сравнениию с avrasm, но я на тот момент уже перестал интересоваться "родными" инструментами от Атмел, даже не смотрел.
да вот так получается что расширение коснулось пару операций и внедрения препроцессора Си, остальное осталось от AVRASM.
Цитата(ReAl @ Jul 6 2010, 18:12)

Для поставенной задачи со списком типичный инструмент — макроинструкция IRP (блок повтора по списку аргументов). Ищите это в AVRASM2.
увы... такового нет
Цитата(ReAl @ Jul 6 2010, 18:12)

Вдогонку — если ассемблер позволяет рекурсивные макросы (т.е. вызывающие сами себя), то задачу тоже можно решить, просто надо ограничиться каким-то разумным максимальным количеством аргументов. Как-то так (это тоже от 51-го контроллера, асм от 2500A.D.)
рекурентность возможна и выход Вы нашли из положения просто "супер", но... портит все одна вещь как вывалиться из рекурсии? Только при проверке параметра, а тут такой "облом" как регистр проверить параметр не позволяет специфика условных директив.
Сообщение отредактировал SAAl - Jul 7 2010, 13:15