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

 
 
> Организация стека в компиляторе 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
Ответов
alexeyv
сообщение Jan 31 2011, 10:39
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 298
Регистрация: 26-01-09
Из: Пермь
Пользователь №: 43 940



Цитата
Вы её не так понимаете. Указатель стека в avr-gcc один - аппаратный. И точка.


А как правильно понимать эту фразу? Помогите немощному!

То есть, хватит меня критиковать - если знаете попробуйте объяснить сами, а не докапываться до чужих слов.

Скомпилировал простую программку и посмотрел ее листинг
пролог функции:
Код
push    r29
push    r28
in    r28, 0x3d; 61
in    r29, 0x3e; 62
sbiw    r28, 0x1f; 31
in    r0, 0x3f; 63
cli
out    0x3e, r29; 62
out    0x3f, r0; 63
out    0x3d, r28; 61


эпилог функции:
Код
adiw    r28, 0x1f; 31
in    r0, 0x3f; 63
cli
out    0x3e, r29; 62
out    0x3f, r0; 63
out    0x3d, r28; 61
pop    r28
pop    r29
ret


Из кода видно что компилятор копирует указатель стека в Y, и поэтому Y - указывает на стек (это так сказать алиас стека). И работает c локальными переменными в функции через указатель Y. Так что мои слова
Цитата
в том числе и указатель стека (r28-r29)=(Y).

не являются ложными , а являются слегка неточными.
Про один аппаратный стек в WinAVR, я полностью согласен. Про наличие двух стеков, я не говорил!

Сообщение отредактировал alexeyv - Jan 31 2011, 11:07
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 31 2011, 11:05
Сообщение #3


Гуру
******

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



QUOTE (alexeyv @ Jan 31 2011, 12:39) *
А как правильно понимать эту фразу? Помогите немощному!
Этот указатель заводится временно внутри функции для доступа к данным на стеке.


--------------------
На любой вопрос даю любой ответ
"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
ReAl
сообщение Jan 31 2011, 13:35
Сообщение #4


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

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



Цитата(Сергей Борщ @ Jan 31 2011, 13:05) *
Этот указатель заводится временно внутри функции для доступа к данным на стеке.
Дополню: и только втом случае, если это нужно для данной функции (не все аргументы или локальные переменные влезли в регистры либо куда-то передаётся адрес локальной переменной).
frame pointer — указатель на кадр в стеке. А сам стек живёт по SP

Совершенно аналогично использованию регистра BP в x86/16 - в той системе команд относительно SP адресоваться было невозможно.


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



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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 19:49
Рейтинг@Mail.ru


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