Перейти к содержанию
    

cdecl соглашение в avr gcc

Подскажите, как задать в AVR GCC функцию, которая будет вызываться по соглашению cdecl?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Выдержка из:

C:/WinAVR/doc/gcc/HTML/gcc-4.3.0/gcc/Function-Attributes.html

 

cdecl

On the Intel 386, the cdecl attribute causes the compiler to assume that the calling function will pop off the stack space used to pass arguments. This is useful to override the effects of the -mrtd switch.

 

 

Получается, что для AVR вроде не применяется, хотя могу ошибаться...

А зачем Вам это надо?

Изменено пользователем demiurg_spb

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А зачем Вам это надо?

Да так... есть одна безумная мысль... ;) А для этого мне надо передавать параметры через стек, а не через регистры...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да так... есть одна безумная мысль... ;) А для этого мне надо передавать параметры через стек, а не через регистры...

 

Понятно.

Создайте отдельный "класс" стек и используйте его в хвост и гриву...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да так... есть одна безумная мысль... ;) А для этого мне надо передавать параметры через стек, а не через регистры...

если не смущают накладные расходы на вызов функций, передавайте несколько незначащих аргументов, чтобы занять регистры - полезные аргументы поместятся в стек.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подскажите, как задать в AVR GCC функцию, которая будет вызываться по соглашению cdecl?
А нельзя ли всё-таки узнать - что за безумная мысль?

Ну интересно.

А я взамен скажу как ;)

 

Стандарт вроде бы ни к чему не обязывает и stdarg.h уже не макросы содержит, а объявления встроенных функций компилятора.

Но переменное число параметров как минимум проще реализовать через стек не используя регистры вообще. По способу использования va_start - последний "нормальный" аргумент перед эллипсисом тоже надо на стеке держать. Всё, что перед ним - в принципе можно и на регистрах.

Но оказывается, что avr-gcc - по крайней мере и 3.4.6 (WinAVR-20060421) и прочие до 4.2.2 (WinAVR-20071221) и 4.3.0 - на всех уровнях оптимизации для функций с переменным числом аргументов ВСЕ аргументы передаёт через стек.

 

Итого опишите функцию, добавив после необходимых аргументов троеточие

int foo(unsigned char a, unsigned b, signed char c, ...)
{
    return a+b+c;    
}

И спокойно вызывайте, ничего не посылая на три точки.

int moo(void)
{
    return foo(0, 1, 2);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...