вопрос у меня связан с макросами 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 использую этот макрос так:.macro enter aa:vararg
push r0
in r0, _SFR_IO_ADDR(SREG)
push r0
.irp p, \aa
push p
.endr
.endm
Код
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 создается что-то типа .macro leave aa:vararg
.irp p, \aa
pop p
.endr
pop r0
out _SFR_IO_ADDR(SREG), r0
pop r0
.endm
Код
#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
.macro leave
.irp p, ARG
pop p
.endr
pop r0
out _SFR_IO_ADDR(SREG), r0
pop r0
.endm
вопрос как раз в том, как внутри макроса enter из переданных ему параметров собрать символ с обратным перечнем этих параметров? если суметь сделать такой макрос, то уже никогда не возникнут ошибки с неверным порядком извлечения из стека сохраненных регистров! это одна из распространенных ошибок в ассемблерных программах.