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

 
 
> Сохранение регистров в fies.asm IAR_AVR, Как указать компилятору на использование?
fmdost
сообщение Mar 10 2008, 01:06
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Доброго времени суток Уважаемые!
Прицепил к проэкту асм файл с програмкой проверки crc. Разъясните пожалуйста, как указать компилятору на неоюходимость сохранения используемых в асм файле регистров?
Спасибо.
Файл тут.Прикрепленный файл  crc.rar ( 889 байт ) Кол-во скачиваний: 124
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
fmdost
сообщение Mar 10 2008, 16:23
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Спасибо. По англицки читаю. Про согдлашение по передаче параметров вкурсе.
Повторяю вопрос
Код
main()
{
unsigned char i;
for(i=0;i>100;i++)
  crc_asm(* pointer); // <- вот сдесь может портится(и портится) i  
}

Как сделать что-бы i не портился в АСМ функции?
Например crc_asm() использует ВСЕ доступные регистры, а main() только 1, в котором хранится i.
Очень бы хотелось, что-бы ИАР САМ решил что из регистров надо сохранять. А то выходит, что в АСМ функции придётся сохранять ВСЕ используемые в ней же регистры, или ковырять листинг всей main() на предмет выискивания регистра в котором хранится i .
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Mar 10 2008, 17:12
Сообщение #3


Гуру
******

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



Цитата(Т.Достоевский @ Mar 10 2008, 18:23) *
Спасибо. По англицки читаю. Про согдлашение по передаче параметров вкурсе.
Повторяю вопрос
Повторяем ответ - читайте вдумчиво про соглашение о передаче параметров. Есть регистры, которые можно портить в функции - они сохраняются в вызывающей функции. Есть регистры, которые надо сохранять в вызываемой функции. Подумайте сами логически - нафига компилятор будет при каждом вызове функции сохранять какой-то из регистров, если он не портится в вызываемой функции. Нет уж - ваша функция знает, какие регистры портит - пусть она их (только нужные и никакие другие) и сохраняет.


--------------------
На любой вопрос даю любой ответ
"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
fmdost
сообщение Mar 10 2008, 17:31
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 479
Регистрация: 8-05-07
Из: г. Ставрополь. Северный Кавказ. Россия
Пользователь №: 27 606



Цитата(Сергей Борщ @ Mar 10 2008, 20:12) *
нафига компилятор будет при каждом вызове функции сохранять какой-то из регистров, если он не портится в вызываемой функции. Нет уж - ваша функция знает, какие регистры портит - пусть она их (только нужные и никакие другие) и сохраняет.

Нихрена он(ИАР) не знает какие надо сохранять. А если функция портит все, а вызвавшаая её функция и вся программа использует только 1 или 2 !? Зачем сохранять всё, когда можно и нужно только эти 2 ? ИАР прекрасно это делает если всё это сделано на С.
Если вызывать функцию через указатель то-же не видит, и сохраняет ВСЕ регистры, а не только те что используются в вызываемой функции.
Пробовал дефайнить по разному, надеялся что увидит, не увидил. Вот думаю а если как __интринсик, или ещё как, ну что-бы понял как свою С функцию?

Пока отвечал Сергею пропустил.
Цитата(Baser @ Mar 10 2008, 20:25) *
...под ИАРом использую только инлайн-функции (макросы).

Можно поподробней ?
Цитата
p.s. А если настолько лень в асм функции самому сохранить в стеке регистры, то пишите функции на Си, тогда компилятор сделает это за вас - на то но и Си компилятор biggrin.gif

Очень уж много сохранять придётся.
Согласен, что мои простые асм функции проще переписать на С. Но вопрос не праздный, пригодится!
Go to the top of the page
 
+Quote Post
Baser
сообщение Mar 10 2008, 21:19
Сообщение #5


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Цитата(Т.Достоевский @ Mar 10 2008, 19:31) *
(Baser @ Mar 10 2008, 20:25) ...под ИАРом использую только инлайн-функции (макросы).

Можно поподробней ?

Можно... Как я уже писал, в ИАРе лучше не применять функции в обработчиках прерывания, т.к. компилятор не считает нужным отслеживать применяемые в функции регистры и сохраняет ВСЕ scratch-регистры. А нужда применить бывает. Пример - то же вычисление CRC для приема и передачи в нескольких местах. Поэтому я эту функцию пишу как макрос и далее спокойно применяю в различных прерываниях столько, сколько мне нужно:
Код
#define RS_ByteCRC(byte)                                    \
  {                                                         \
  (byte) ^= CRC16.C[0];                                     \
  (byte) ^= ((byte) << 4);                                  \
  CRC16.C[0] = CRC16.C[1] ^((byte) >> 4) ^ ((byte) << 3);   \
  CRC16.C[1] = (byte) ^ (((byte) >> 4) >> 1);               \
  }
...
RS_ByteCRC(data);
...

При этом препроцессор просто копирует этот код энное кол-во раз. Но оптимизатор у ИАРа очень хороший! Он находит все эти одинаковые куски кода и сам заменяет их на ОДНУ функцию. В результате получаем то, что написали бы на асме, но только написанное на Си.
Вот такой ход из-за угла smile.gif
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Т.Достоевский   Сохранение регистров в fies.asm IAR_AVR   Mar 10 2008, 01:06
- - Baser   Цитата(Т.Достоевский @ Mar 10 2008, 03:06...   Mar 10 2008, 10:37
|- - Т.Достоевский   Цитата(Baser @ Mar 10 2008, 13:37) Попроб...   Mar 10 2008, 15:05
|- - Baser   Цитата(Т.Достоевский @ Mar 10 2008, 17:05...   Mar 10 2008, 15:59
- - Rst7   Не пойму, какие проблемы это на Си написать?   Mar 10 2008, 11:18
|- - Baser   Цитата(Т.Достоевский @ Mar 10 2008, 18:23...   Mar 10 2008, 16:35
||- - Т.Достоевский   Вот что бывает если нет конкуренции Подымал сдес...   Mar 10 2008, 16:51
||- - Baser   Цитата(Т.Достоевский @ Mar 10 2008, 18:51...   Mar 10 2008, 17:25
- - Rst7   ЦитатаUse it. Вот именно к Вам это и относится. Ч...   Mar 10 2008, 18:37
|- - Т.Достоевский   Цитата(Rst7 @ Mar 10 2008, 21:37) ...Спис...   Mar 10 2008, 19:31
- - Rst7   ЦитатаА разве в GCC не RTL? RTL это кажется станда...   Mar 11 2008, 06:43
|- - Т.Достоевский   Цитата(Rst7 @ Mar 11 2008, 09:43) Чем??? ...   Mar 11 2008, 13:30
- - Rst7   ЦитатаRTL. Это вы про язык распределения регистро...   Mar 11 2008, 14:27


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

 


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


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