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

 
 
> Почему dsPIC IAR генерит такой код, com_flags&=254 ===> dec2.b
MicroDiP
сообщение Apr 18 2015, 09:23
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 104
Регистрация: 31-07-05
Из: Shenzhen, China (深圳市, 中国)
Пользователь №: 7 233



Добрый день.
Из основной программы main() вызывается функция. В этой функции побитно проверяется глобальная переменная типа unsigned char com_flags, т.е. фактически хотелось попробовать сделать глобальную переменную флагов (раньше использовал структуру однобитных полей, но вот решил попробовать, как будет себя вести компилятор в случае с целой переменной). Далее после проверки каждого разряда, в случае если бит установлен, выполняется ряд простейших операций и далее этот бит должен сбрасываться в ноль. Биты с первого по седьмой сбрасываются и устанавливаются замечательно. А вот нулевой бит…
Строчки вида
Код
com_flags&=254;
com_flags&=~1;
com_flags&=~(1<<0);

стабильно компилируются в вычетание двойки из переменной:
Код
dec2.b [0x0004],[0x0004] //в регистре W2 (0x0004) находится адрес этой самой переменной

Игры с оптимизацией и/или объявлением переменной как volatile ничего не меняют. Если же насильно вычитаю единицу из переменной - естественно это всё решает: команда dec2.b превращется в dec.b. Но как-то это не изящно. Структура с однобитными полями тоже вопрос решает. Но почему при работе с целой переменной происходит такое ? wacko.gif


Только опубликовал вопрос, и сразу пришло понимание biggrin.gif Всё вопрос снят: переменную нужно объявить как unsigned int.
Нужно себе на стол поставить какого-нить деревянного "божка" и ему изливать душу: формулировка вопроса вслух упорядочивает мысли yeah.gif


--------------------
Все языки несут в себе черты своих обладателей. И идиомы каждого языка повторяются снова и снова: "Он чужеземец, а значит - варвар". (Роберт Хайнлайн)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


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


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