Провел кое какие исследования. И получил вот что.
На уровне ассемблера эта команда PORTA&=~(1‹‹1) выглядит как
CBI 0x18,1. Эта команда PORTA|=(1‹‹1) выглядит как SBI 0x18,1.
Эти команды обращаются на прямую к регистру PORTA (так же и к другим физическим регистрам).
То есть в системе команд atmeg-и команды сделаны прямо для этого.
http://www.gaw.ru/html.cgi/txt/doc/m.../asm/start.htm
CBI 0x18,1 это 2 байта
SBI 0x18,1 это тоже 2 байта
Теперь рассмотрим эту операцию
это в си;
unsigned char temp=4;
temp&=~(1‹‹1);
в ассемблере ;
LDS R24,0x0060;занимает 4 байта. Загружаем содержимое по адресу 0x0060 в R24. То есть число 4.
ANDI R24,0xFD ;занимает 2 байта. Делаем логическое and
STS 0x0060,R24 ;занимает 4 байта. Выгружаем обратно.
То есть получается все верно. Эта операция занимает temp&=~(1‹‹1); занимает 10 байт. Все по честному.
И по другому ни как я не могу в своей переменной очистить бит.
Если конечно представить ,что R26(например) будет моя переменная temp и сделать вставку ассемблера
,то я могу делать так
ORI R26,0x01 ; то это займет 2 байта.
но кто знает как компилятор распорядится этим регистром
Команд,которые могут работать с битами ячеек ОЗУ на прямую я не нашёл.
Значит если нужен очень компактный код, то шлепать надо на асме. И работать только с регистровым файлом. Не создавая ни каких переменных в озу.
Человек который писал на ассемблере похожую программу работал только с регистровым файлом. Вся программа заняла 2490 байт. На си моя программа должна будет занять примерно 5 кБайт. Но она будет гибче и понятнее. За удобство надо платить.
У Microchip такая возможность как изменить один бит в ОЗУ есть.
Это взято с реально работающей программы.
Контроллер PIC12F629
begin:
mask1 EQU 21h ; называем ячейку в ОЗУ по адресу 21h как mask1
инициализация
start:
bsf GPIO,1 ;команда занимает 1 байт. Установить в 1 "ногу порта"
bsf mask1,1;команда занимает 1 байт. Установить бит 1 в mask1
То есть команда bsf может работать как с регистрами так и с ОЗУ
Почему ATMEL так не сделал.
Комментируйте и исправляйте если я ,что то не так сообразил...
Хочу выслушать Ваше мнение уважаемые форумчане.