Чтобы ответить на ваш вопрос о сдвиге, он сдвигает все биты на один влево, добавляя ноль в качестве первого бита. Другими словами, он умножает на 2 высокое (соответственно низкое) значение переменной varclist
.
varclist
здесь в вашей программе - адрес массива байтов [0x01, 0x02, ... 0x00] в памяти => varclist
- указатель на первый байт этого массива. Чтобы получить исходный адрес, нам просто нужно разделить на 2 (обратная операция умножения), и мы получим
0x0070 >> 1 = 0000 0000 0111 0000 >> 1 = 0000 0000 0011 1000 = 0x0038
Таким образом, адрес varclist
был 0x0038
. Я не знаю, как вы думали, что это 0x0100, но я надеюсь, что теперь вы понимаете код.
Я думаю, что этот адрес умножается на 2, потому что адреса в пространстве памяти программы выражаются в смещении слова, и в этом случае вам нужно умножить на 2, чтобы получить адрес в байтовом смещении. Позже вы можете загрузить этот байт (первый байт вашего массива) в r0
благодаря инструкции по сборке LPM
.
Я бы рекомендовал вам прочитать главу 5.2 этого pdf и, возможно, другие главы. Руководство пользователя AVR Assembler также, вероятно, хорошая ставка.