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

 
 
> GNU ASSEMBLER, макросы
ARV
сообщение Oct 7 2010, 11:07
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



сразу прошу прощения, если не в ту тему: подумалось, что 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 из переданных ему параметров собрать символ с обратным перечнем этих параметров? если суметь сделать такой макрос, то уже никогда не возникнут ошибки с неверным порядком извлечения из стека сохраненных регистров! это одна из распространенных ошибок в ассемблерных программах.


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 21:52
Рейтинг@Mail.ru


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