Возник такой чисто теоретический вопрос.
В выражении DDRD |= (1<<4) производится побитовое ИЛИ регистра DDRD с таким байтом 0b00010000. Правильно ли я понимаю что компилятор добавляет локальную переменную - этот самый байт?
Нет, неправильно.
переменные и их имена - абстракции для удобства программиста. Реально у чипа есть несколько регистров, он пишет и читает только в них - работа АЛУ. перемещение в ОЗУ и обратно - работа устройства управления.
Нет, не добавляет. К локальной переменной можно обратиться, переменная хранится на стеке. Ничего такого в твоем случае не происходит.
Т.е. (1<<4) по сути загрузка константы 0b00010000 в какой-то регистр?
йес, милорд.
Нет, это число. Что там будет с регистрами и другими внутренностями машины никак не регламентируется, и зависит от миллиона факторов, и об этом не надо париться, если ты не программист в гугле с зарплатой миллион в месяц.
а число это где будет находиться физически, после того, как эта строчка отработает непосредственно на чипе?
Нигде. После компиляции будет одна команда SBI и всё. Если DDRD находится в пространстве В/В.
это понятно, оптимизация и теде… давайте вот так: где будет храниться результат операции (1<<4) перед тем, как совершить над ним операцию побитовое ИЛИ с регистром DDRD ?
sbi DDRD, 16
Вроде бы так : sbi DDRD, 4
Согласен. Загнался.
Почему? Вы были правы: (1<<4) == 16
ок давайте до конца это приключение размотаем.
Это, очевидно, тоже бинарная операция, вопросы: она однотактная? где хранится значение константы равное 4, перед тем как эта операция будет совершена?
Так set bit. Бит #4
потому што там номер бита нужен, а не его значение в 10тичной системе.
короче, давайте я напишу как я это вижу, а вы меня потом обхаете если я затуплю.
на этапе компиляции ясен пень все подобного рода выражения приводятся к константам.
при старте константы размещаются в ОЗУ.
инструкция SBI это макрос, сначала из ОЗУ в какойнить регистр помещается значение = 16, и на следующем такте в регистре DDRD производится установка соотв бита номер = 4.
На этапе компиляции НИЧЕГО в ОЗУ не перемещается. Его, по сути и нет еще. Это на самом деле просто и на столько сложно, что «на пальцах» не обьяснить.
где я писал, что на этапе компиляции идет работа с ОЗУ?
Да, прошу прощения, быстро читал - не говорили. Приношу свои извинения по своему ошибочному суждению.