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

 
 
 
Reply to this topicStart new topic
> cdecl соглашение в avr gcc
Aesthete Animus
сообщение May 27 2008, 14:48
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Подскажите, как задать в AVR GCC функцию, которая будет вызываться по соглашению cdecl?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 27 2008, 15:56
Сообщение #2


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Выдержка из:
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 - May 27 2008, 16:03


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение May 27 2008, 16:22
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



Цитата(demiurg_spb @ May 27 2008, 19:56) *
А зачем Вам это надо?

Да так... есть одна безумная мысль... wink.gif А для этого мне надо передавать параметры через стек, а не через регистры...
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение May 27 2008, 17:40
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



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


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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Aesthete Animus
сообщение May 27 2008, 21:01
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317



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


Не то... 05.gif
Go to the top of the page
 
+Quote Post
vet
сообщение May 28 2008, 09:43
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



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

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


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
ReAl
сообщение May 28 2008, 21:05
Сообщение #7


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(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);
}


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

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

 


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


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