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

 
 
> 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
 
Start new topic
Ответов
_Pasha
сообщение Oct 8 2010, 07:16
Сообщение #2


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Ну, не знаю... когда я делаю что-то крупное на ассемблере, то организую либо единый пролог-эпилог, либо число этих push/pop настолько мало, что никаких ошибок породить не может. А перевернуть список можно только введя какую-то новую сущность и прогнав текст SED"ом до асма. Как-то сложно это.
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 29th July 2025 - 08:09
Рейтинг@Mail.ru


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