Добрый день.
Из основной программы 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. Но как-то это не изящно. Структура с однобитными полями тоже вопрос решает. Но почему при работе с целой переменной происходит такое ?
Только опубликовал вопрос, и сразу пришло понимание

Всё вопрос снят: переменную нужно объявить как unsigned int.
Нужно себе на стол поставить какого-нить деревянного "божка" и ему изливать душу: формулировка вопроса вслух упорядочивает мысли
Все языки несут в себе черты своих обладателей. И идиомы каждого языка повторяются снова и снова: "Он чужеземец, а значит - варвар". (Роберт Хайнлайн)