Нубский вопрос про битовые операции

Возник такой чисто теоретический вопрос.
В выражении DDRD |= (1<<4) производится побитовое ИЛИ регистра DDRD с таким байтом 0b00010000. Правильно ли я понимаю что компилятор добавляет локальную переменную - этот самый байт?

Нет, неправильно.

1 лайк

переменные и их имена - абстракции для удобства программиста. Реально у чипа есть несколько регистров, он пишет и читает только в них - работа АЛУ. перемещение в ОЗУ и обратно - работа устройства управления.

Нет, не добавляет. К локальной переменной можно обратиться, переменная хранится на стеке. Ничего такого в твоем случае не происходит.

Т.е. (1<<4) по сути загрузка константы 0b00010000 в какой-то регистр?

йес, милорд.

1 лайк

Нет, это число. Что там будет с регистрами и другими внутренностями машины никак не регламентируется, и зависит от миллиона факторов, и об этом не надо париться, если ты не программист в гугле с зарплатой миллион в месяц.

1 лайк

а число это где будет находиться физически, после того, как эта строчка отработает непосредственно на чипе?

Нигде. После компиляции будет одна команда SBI и всё. Если DDRD находится в пространстве В/В.

это понятно, оптимизация и теде… давайте вот так: где будет храниться результат операции (1<<4) перед тем, как совершить над ним операцию побитовое ИЛИ с регистром DDRD ?

sbi DDRD, 16

Вроде бы так : sbi DDRD, 4

Согласен. Загнался.

Почему? Вы были правы: (1<<4) == 16

ок давайте до конца это приключение размотаем.
Это, очевидно, тоже бинарная операция, вопросы: она однотактная? где хранится значение константы равное 4, перед тем как эта операция будет совершена?

Так set bit. Бит #4

потому што там номер бита нужен, а не его значение в 10тичной системе.

короче, давайте я напишу как я это вижу, а вы меня потом обхаете если я затуплю.
на этапе компиляции ясен пень все подобного рода выражения приводятся к константам.
при старте константы размещаются в ОЗУ.
инструкция SBI это макрос, сначала из ОЗУ в какойнить регистр помещается значение = 16, и на следующем такте в регистре DDRD производится установка соотв бита номер = 4.

На этапе компиляции НИЧЕГО в ОЗУ не перемещается. Его, по сути и нет еще. Это на самом деле просто и на столько сложно, что «на пальцах» не обьяснить.

где я писал, что на этапе компиляции идет работа с ОЗУ?

Да, прошу прощения, быстро читал - не говорили. Приношу свои извинения по своему ошибочному суждению.