Aesthete Animus 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба Подскажите, как задать в AVR GCC функцию, которая будет вызываться по соглашению cdecl? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 27 мая, 2008 Опубликовано 27 мая, 2008 (изменено) · Жалоба Выдержка из: 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 вроде не применяется, хотя могу ошибаться... А зачем Вам это надо? Изменено 27 мая, 2008 пользователем demiurg_spb Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aesthete Animus 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба А зачем Вам это надо? Да так... есть одна безумная мысль... ;) А для этого мне надо передавать параметры через стек, а не через регистры... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
demiurg_spb 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба Да так... есть одна безумная мысль... ;) А для этого мне надо передавать параметры через стек, а не через регистры... Понятно. Создайте отдельный "класс" стек и используйте его в хвост и гриву... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Aesthete Animus 0 27 мая, 2008 Опубликовано 27 мая, 2008 · Жалоба Создайте отдельный "класс" стек и используйте его в хвост и гриву... Не то... :05: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 28 мая, 2008 Опубликовано 28 мая, 2008 · Жалоба Да так... есть одна безумная мысль... ;) А для этого мне надо передавать параметры через стек, а не через регистры... если не смущают накладные расходы на вызов функций, передавайте несколько незначащих аргументов, чтобы занять регистры - полезные аргументы поместятся в стек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 28 мая, 2008 Опубликовано 28 мая, 2008 · Жалоба Подскажите, как задать в 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); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться