сразу прошу прощения, если не в ту тему: подумалось, что GAS и GCC идут рядом.
вопрос у меня связан с макросами GAS. есть желание сделать макрос автоматически восстанавливающий из стека все, что другой макрос туда запихал. запихивание в стек делаю так:
Код
.altmacro
.macro enter aa:vararg
push r0
in r0, _SFR_IO_ADDR(SREG)
push r0
.irp p, \aa
push p
.endr
.endm
чтобы сохранить в стеке
r0,
r1 и
r22 использую этот макрос так:
Код
enter r0, r1, r22
аналогичный макрос
leave сделал тоже:
Код
.altmacro
.macro leave aa:vararg
.irp p, \aa
pop p
.endr
pop r0
out _SFR_IO_ADDR(SREG), r0
pop r0
.endm
однако логично предположить, что если бы строку аргументов мароса
enter каким-то образом отреверсить, то в макросе
leave можно было бы обойтись без параметров. то есть предположим, каким-то образом во время работы макроса
enter создается что-то типа
Код
#define ARG r22, r1, r0
, тогда макрос leave превращается в
Код
.altmacro
.macro leave
.irp p, ARG
pop p
.endr
pop r0
out _SFR_IO_ADDR(SREG), r0
pop r0
.endm
вопрос как раз в том,
как внутри макроса enter из переданных ему параметров собрать символ с обратным перечнем этих параметров? если суметь сделать такой макрос, то уже никогда не возникнут ошибки с неверным порядком извлечения из стека сохраненных регистров! это одна из распространенных ошибок в ассемблерных программах.
Я бы взял частями... но мне надо сразу.