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

 
 
> Организация стека в компиляторе WinAVR
Giekelberri
сообщение Jan 28 2011, 13:41
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 18
Регистрация: 28-01-11
Пользователь №: 62 532



Добрый день всем!

Дано:
Компилятор WinAVR-20090313 в связке со средой разработки AVRStudio 4.
МК - ATMega1280, но это не важно.

Пусть есть программа на ЯВУ Си:

int SumEvaluate(int a, int b, int c)
{
int sum = 0;
sum = a + b + c;
return sum;

}
void main(void)
{
int i;
char ch1;
char ch2;
i = evaluate(5,4,10);
printf("%d",i);

}

Известно, что стек начинается с конца SRAM и растет в сторону уменьшения адреса.
Возникает вопрос где сохраняются переменные i, ch1, ch2? В соответствии с документацией на WinAVR, они могут сохраниться в двух местах:
Call-used registers (r18-r27)
или
Call-saved ergisters (r2-r17)

Если бы переменных было много (ch3, ch4, ch5, ch6, ...), места в регистрах РОН не хватило бы и тогда был бы задействован стек. В этом случае на вершину стека указывал бы указатель стека, хранящийся в Z-регистре или Y-регистре соответственно. А каким образом в этом случае известна глубина стека?

Повторю вопрос: а где на самом деле сохраняются эти переменные в Call-used registers или Call-saved ergisters? И как становиться известна глубина стека когда для размещения переменных не хватает регистров общего назначения ?

И второй вопрос, аналогичен первому - что происходит при вызове функции? Счетчик PC помещается в стек, это понятно. а куда помещаются локальные переменные для данной функции? Сначала в регистры общего назначения или сразу в стек? Куда помещается значение, возвращаемое функцией?
Какое максимальное количество параметров, которое возможно передать функции? Непанятна sm.gif

Сообщение отредактировал Giekelberri - Jan 28 2011, 13:43
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Jan 28 2011, 16:19
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Giekelberri @ Jan 28 2011, 15:41) *
Возникает вопрос где сохраняются переменные i, ch1, ch2?
Поскольку переменные локальные, они создаются на стеке. Однако, если в регистрах есть свободное место - оптимизатор выкинет сохранение на стек и восстановление, таким образом переменная будет жить в регистре. До тех пор, пока вы не попытаетесь взять и передать куда-то адрес переменной - в этом случае компилятор положит ее на стек.
QUOTE (Giekelberri @ Jan 28 2011, 15:41) *
Если бы переменных было много (ch3, ch4, ch5, ch6, ...), места в регистрах РОН не хватило бы и тогда был бы задействован стек. В этом случае на вершину стека указывал бы указатель стека, хранящийся в Z-регистре или Y-регистре соответственно.
Это у ИАРа указатель на стек данных хранится в Y. GCC использует один стек и на него указывает регистр спец. назначения (SFR) SP.

QUOTE (Giekelberri @ Jan 28 2011, 15:41) *
А каким образом в этом случае известна глубина стека?
Неизвестна. А зачем?
QUOTE (Giekelberri @ Jan 28 2011, 15:41) *
Повторю вопрос: а где на самом деле сохраняются эти переменные в Call-used registers или Call-saved ergisters?
Могут быть и в тех и в других. На время вызова функций переменные из call-used регистров временно выгружаются на стек, после возврата - вынимаются из стека обратно в регистры.
QUOTE (Giekelberri @ Jan 28 2011, 15:41) *
И как становиться известна глубина стека когда для размещения переменных не хватает регистров общего назначения ?
Компилятору она неизвестна.
QUOTE (Giekelberri @ Jan 28 2011, 15:41) *
Счетчик PC помещается в стек, это понятно. а куда помещаются локальные переменные для данной функции? Сначала в регистры общего назначения или сразу в стек?
Вы имеете ввиду параметры? В зависимости от типа и количества - могут передаваться или в регистрах, или на стеке или и там и там.
QUOTE (Giekelberri @ Jan 28 2011, 15:41) *
Куда помещается значение, возвращаемое функцией?
Аналогично. Какие-то типы возвращаются в регистрах, другие - через стек.
QUOTE (Giekelberri @ Jan 28 2011, 15:41) *
Какое максимальное количество параметров, которое возможно передать функции?
По стандарту их там столько, что вы устанете набирать исходник sm.gif


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
MaxiMuz
сообщение Jun 29 2011, 12:40
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 253
Регистрация: 15-04-10
Из: Волгоград
Пользователь №: 56 658



Цитата(Сергей Борщ @ Jan 28 2011, 19:19) *
... Это у ИАРа указатель на стек данных хранится в Y. GCC использует один стек и на него указывает регистр спец. назначения (SFR) SP.
...
Всегда считал что для организации стека в AVR используется указ.стека SP.
А РОН Y - в качестве указателя стека - это уже самодеятельность я был лучшего мнения о ИАР )
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jun 29 2011, 13:41
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (MaxiMuz @ Jun 29 2011, 14:40) *
А РОН Y - в качестве указателя стека - это уже самодеятельность я был лучшего мнения о ИАР )

Думаю, что они Вам этот упрек простят и разрешат Вам еще подумать над сказанным sm.gif после того, как перечитаете (можно несколько раз) предыдущие посты.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



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

 


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


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