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

 
 
> Принудительное размещение локальной переменной в стеке, Компилятор IAR EW3.30A (MSP430F449)
Petrooo
сообщение Feb 12 2007, 17:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 27
Регистрация: 21-10-05
Пользователь №: 9 922



Добрый день, уважаемые коллеги!
Компилятор размещает локальные переменные, определенные в теле функции либо в регистрах, либо в стеке.
Код
void Func(char Var1) {
char Var2;
...
Var2 = Var1;
...
}

Если переменная 1 или 2-х байтная, то скорее всего компилятор ее разместит в регистрах.
А мне нужно, чтобы он принудительно разместил ее (Var2) в сегменте стека.
А еще лучше, если сразу Var1 будет размещаться в стеке.
Как мне его это заставить сделать?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vmp
сообщение Feb 12 2007, 18:13
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Цитата(Petrooo @ Feb 12 2007, 17:31) *
А мне нужно, чтобы он принудительно разместил ее (Var2) в сегменте стека.


Вызвать подпрограмму, которой передать в качестве аргумента адрес Var2.


void dummy(int *p)
{
}

void func(void)
{
int Var2;
dummy(&var2);
}
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 12 2007, 18:55
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(vmp @ Feb 12 2007, 19:13) *
Вызвать подпрограмму, которой передать в качестве аргумента адрес Var2.

Компилятор может точно так же поместить в регистры указатель.
Поэтому встает вопрос о целях автора. Какая разница, где переменная, указатель и прочее?
По большому счету задай оптимизацию - по коду или быстродействию и отдайся компилятору, закрыв глаза. wink.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
vmp
сообщение Feb 12 2007, 19:21
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 20-01-05
Из: Зеленоград
Пользователь №: 2 070



Цитата(Dog Pawlowa @ Feb 12 2007, 18:55) *
Цитата(vmp @ Feb 12 2007, 19:13) *

Вызвать подпрограмму, которой передать в качестве аргумента адрес Var2.

Компилятор может точно так же поместить в регистры указатель.

В вызываемой подпрограмме - да. А в вызывающей переменная будет создана на стеке, ибо регистры (по крайней мере в данной архитектуре) адреса не имеют.
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 12 2007, 20:50
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(vmp @ Feb 12 2007, 21:21) *
Цитата(Dog Pawlowa @ Feb 12 2007, 18:55) *

Цитата(vmp @ Feb 12 2007, 19:13) *

Вызвать подпрограмму, которой передать в качестве аргумента адрес Var2.

Компилятор может точно так же поместить в регистры указатель.

В вызываемой подпрограмме - да. А в вызывающей переменная будет создана на стеке, ибо регистры (по крайней мере в данной архитектуре) адреса не имеют.

Это зависит от компилятора. В IAR, например, передача параметров функции производится через регистры R15-R12. Если же размер параметров функции превышает совокупный размер этих регистров то тогда да, параметры передаются через стек.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 12 2007, 21:06
Сообщение #6


Гуру
******

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



Цитата(rezident @ Feb 12 2007, 19:50) *
Если же размер параметров функции превышает совокупный размер этих регистров то тогда да, параметры передаются через стек.
Для того, чтобы передать адрес переменной, эта переменная должна иметь адрес, т.е. находиться в памяти а не в регистрах. Что и требовалось.


--------------------
На любой вопрос даю любой ответ
"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
rezident
сообщение Feb 12 2007, 22:31
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(Сергей Борщ @ Feb 12 2007, 23:06) *
Цитата(rezident @ Feb 12 2007, 19:50) *

Если же размер параметров функции превышает совокупный размер этих регистров то тогда да, параметры передаются через стек.
Для того, чтобы передать адрес переменной, эта переменная должна иметь адрес, т.е. находиться в памяти а не в регистрах. Что и требовалось.

Извиняюсь, невнимательно прочитал сообщения топика.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 12 2007, 23:07
Сообщение #8


Гуру
******

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



Цитата(rezident @ Feb 12 2007, 21:31) *
Извиняюсь, невнимательно прочитал сообщения топика.
Похоже я тоже невнимательно читал. Если передавать Var1 прямо в стеке, можно попробовать что-то вроде
Код
typedef struct
{
   char Value;
} char_struct_t;

void Func(char_struct_t Var1)
По идее структура должна передаваться через стек, но никто не гарантирует, что оптимизатор не окажется слишком умным и не решит, что такая структура влезет и в регистр.


--------------------
На любой вопрос даю любой ответ
"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

Сообщений в этой теме
- Petrooo   Принудительное размещение локальной переменной в стеке   Feb 12 2007, 17:31
|- - Dog Pawlowa   Цитата(Сергей Борщ @ Feb 13 2007, 00:07) ...   Feb 13 2007, 10:37
|- - Petrooo   ссори за долгое отсутствие Цитата(Dog Pawlowa ...   Feb 13 2007, 15:15
|- - rezident   Цитата(Petrooo @ Feb 13 2007, 17:15) Кста...   Feb 13 2007, 15:30
||- - Petrooo   Цитата(rezident @ Feb 13 2007, 15:30) ИМХ...   Feb 13 2007, 17:32
|- - АДИКМ   Цитата(Petrooo @ Feb 13 2007, 16:15) ссор...   Feb 13 2007, 16:08
|- - Dog Pawlowa   Цитата(Petrooo @ Feb 13 2007, 16:15) Кста...   Feb 13 2007, 16:34
|- - Petrooo   Цитата(Dog Pawlowa @ Feb 13 2007, 16:34) ...   Feb 13 2007, 18:13
|- - Dog Pawlowa   Цитата(Petrooo @ Feb 13 2007, 19:13) Изви...   Feb 13 2007, 20:16
- - _Bill   Цитата(Petrooo @ Feb 12 2007, 17:31) Добр...   Feb 13 2007, 17:08


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

 


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


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