Я готовлюсь к экзамену по микропроцессорам, и возник такой примерный вопрос:
Таким образом, после кода в памяти программы есть массив:
array: .db 11,12,13,14,15,16,17,18,19,20
и в коде указатель загружается как:
ldi ZL, low(array<<1);
Мой вопрос в том, почему этот сдвиг на 1 присутствует в коде, который мне дали. На мой взгляд, метка «массив» должна указывать прямо на байт памяти, содержащий число 11. Если я правильно понимаю, сдвиг влево на 1 умножит на 2. Не отбросит ли это его далеко? Мне дали неверный код или я чего-то не понимаю?
avr-as
. - person Jester   schedule 13.12.2019lpm
(загрузить память программы) вместо обычной памяти данных. - person Peter Cordes   schedule 13.12.2019*2
совпадает с<<1
, сделано по той же причинеlpm
). Я не понимаю, почему такое поведение может быть полезным; корректно ли работают метки для меток в разделах данных? Или есть что-то еще, что вы можете сделать с адресами меток, где вы хотите, чтобы они были разделены на 2? - person Peter Cordes   schedule 13.12.20190x01010101
(32-битное шестнадцатеричное число), а0b01010101
(8-битное двоичное число). В исходном коде это правильно:0x55
. И да,x & mask == mask
— это то, как вы проверяете, установлены ли все интересующие вас биты. (Возможно, вы могли бы сделать это более эффективно, добавив константу, которая устанавливает флаг переноса, если все биты маски установлены, иначе нет. Тогда используйтеadc
вместо перехода черезinc
) - person Peter Cordes   schedule 13.12.2019