Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: cdecl соглашение в avr gcc
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Aesthete Animus
Подскажите, как задать в AVR GCC функцию, которая будет вызываться по соглашению cdecl?
demiurg_spb
Выдержка из:
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 вроде не применяется, хотя могу ошибаться...
А зачем Вам это надо?
Aesthete Animus
Цитата(demiurg_spb @ May 27 2008, 19:56) *
А зачем Вам это надо?

Да так... есть одна безумная мысль... wink.gif А для этого мне надо передавать параметры через стек, а не через регистры...
demiurg_spb
Цитата(Aesthete Animus @ May 27 2008, 20:22) *
Да так... есть одна безумная мысль... wink.gif А для этого мне надо передавать параметры через стек, а не через регистры...


Понятно.
Создайте отдельный "класс" стек и используйте его в хвост и гриву...
Aesthete Animus
Цитата(demiurg_spb @ May 27 2008, 21:40) *
Создайте отдельный "класс" стек и используйте его в хвост и гриву...


Не то... 05.gif
vet
Цитата(Aesthete Animus @ May 27 2008, 20:22) *
Да так... есть одна безумная мысль... wink.gif А для этого мне надо передавать параметры через стек, а не через регистры...

если не смущают накладные расходы на вызов функций, передавайте несколько незначащих аргументов, чтобы занять регистры - полезные аргументы поместятся в стек.
ReAl
Цитата(Aesthete Animus @ May 27 2008, 17:48) *
Подскажите, как задать в AVR GCC функцию, которая будет вызываться по соглашению cdecl?
А нельзя ли всё-таки узнать - что за безумная мысль?
Ну интересно.
А я взамен скажу как wink.gif

Стандарт вроде бы ни к чему не обязывает и 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);
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.