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

 
 
> 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
 
Start new topic
Ответов
ReAl
сообщение May 28 2008, 21:05
Сообщение #2


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

Группа: Свой
Сообщений: 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 Текстовая версия Сейчас: 28th July 2025 - 21:20
Рейтинг@Mail.ru


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