Перейти к содержанию
    

Почему dsPIC IAR генерит такой код

Добрый день.

Из основной программы 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:

 

 

Только опубликовал вопрос, и сразу пришло понимание :biggrin: Всё вопрос снят: переменную нужно объявить как unsigned int.

Нужно себе на стол поставить какого-нить деревянного "божка" и ему изливать душу: формулировка вопроса вслух упорядочивает мысли :yeah:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...