Добрый день всем!
Дано:
Компилятор 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 помещается в стек, это понятно. а куда помещаются локальные переменные для данной функции? Сначала в регистры общего назначения или сразу в стек? Куда помещается значение, возвращаемое функцией?
Какое максимальное количество параметров, которое возможно передать функции? Непанятна
Сообщение отредактировал Giekelberri - Jan 28 2011, 13:43