Цитата(Александр Куличок @ May 12 2007, 19:33)

Ничего странного, если использовать в IAR битовые поля:
.............
Правда, IAR странно читает 7-й бит в флаг Т - через флаг С перемещает его в 0-й бит регистра(при этом обнуляя сам регистр) и уже потом делает bst Rxx,0. Если в вышеприведенном примере менять местами не 3 и 4-й биты, а 6 с 7-м, то результат получается следующий:
...............
Все правильно, в варианте с битом 7, компилятор поступает правильно,
тк значение tt.Bit7 есть не что иное как unsigned char (0 или 1, то есть полный байт),
и если далее в коде будет работа с этим битом через обращение tt.Bit7, то он
будет пользоваться значением временной регистровой переменной в которой хранится 0 или 1.
А в варианте с битами 3 и 4 оптимизатор понял что дальше обращения к этим битам не будет
и смог соптимизировать это на конструкцию bst/bld
Вы спросите почему он не проделал тоже самое с битами 6 и 7 ?
Так собственно по тому, что (8бит) это не только unsigned char(byte) но еще и просто
char, для которого правила арифметики чуть-чуть отличаются...(старший бит может быть знаком)
Да, и еще, в Вашем варианте для перестановки битов получилось использование
двух временных регистров, что не есть гуд...
то есть в тестовом варианте это конечно выглядит неплохо, но в реальной задачке,
когда другие регистры тоже чем то заняты, это будет приводить к
дополнительным(нежелательным) операциям сохранения регистров или в младших
регистрах или в памяти/стеке.
Ну и в конечном итоге, нужно понимать/помнить что все эти варианты
оптимизации(и мои в том числе) в достаточной степени компиляторозависимы,
то есть пишем код на С, компилим, если непонравилось, начинаем сначала,
и так неколько итераций...