Цитата(SAAl @ Jul 1 2010, 19:33)

#if в AVRASM2 принимает, но результат сравнения не зависит от переданного параметра, что совсем уже не понятно.
#if — это от С-шного препроцессора элементы взяты, они отрабатывают до того, как файл начинает анализировать "именно ассемблер".
avrasm2 вроде бы существенно расширяли по сравнениию с avrasm, но я на тот момент уже перестал интересоваться "родными" инструментами от Атмел, даже не смотрел.
Для поставенной задачи со списком типичный инструмент — макроинструкция IRP (блок повтора по списку аргументов). Ищите это в AVRASM2.
Для gcc-шного ассемблера это выглядит так
Код
.irp cmd, push, pop, clr
.macro _\cmd regs : vararg
.irp r, \regs
\cmd \r
.endr
.endm
.endr
Тут первым блоком IRP генерируется три макроса — _push, _pop, _clr, каждый из которых принимает список аргументов, т.е. пишется так
Код
_push r0, r1, r16
_clr r0, r1
_pop r16, r1, r0
У gcc квалификатор
: vararg к аргументу макроса означает, что в него идут все "лишние" аргументы вызова макроса, в других ассемблерах это решается макроскобками. Для AVR я не пользоваля, но для 51-го у Кейла это выглядит так:
Код
_push MACRO list
IRP dst,<list>
push dst
ENDM
ENDM
_pop MACRO list
IRP dst,<list>
pop dst
ENDM
ENDM
Тут уголки и есть макроскобки, которые "маскируют" разделители-запятые. Макроскобками могут быть также
{ }, это надо смотреть
Вызов макроса тоже со скобками
Код
_push <PSW,ACC,AR0>
Вот что-то подобное и надо искать у AVRASM2.
Врядли у него будет что-то похожее на красоту от AVOCET ASM51

Код
_push %MACRO list
%FOR dst IN list
push dst
%ENDFOR
%ENDM
Вдогонку — если ассемблер позволяет рекурсивные макросы (т.е. вызывающие сами себя), то задачу тоже можно решить, просто надо ограничиться каким-то разумным максимальным количеством аргументов. Как-то так (это тоже от 51-го контроллера, асм от 2500A.D.)
Сами себе делаем IRP с ограниченным количеством аргументов
Код
_irp .macro instr,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10
.ifma 12
.exit "Only 10 _irp arguments allowed"
.endif
instr a1
.ifma 3
_irp instr,a2,a3,a4,a5,a6,a7,a8,a9,a10
.endif
.endm
И используем его в других макросах.
Код
_push .macro a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
_irp push,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
.endm
_pop .macro a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
_irp pop,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
.endm
_clr .macro a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
_irp clr,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
.endm
_setb .macro a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
_irp setb,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11
.endm