11
12
13
14
15
16
17
18
19
20
21
22
23
24
R16, Y+ ; Считать первый байт Variables в R16
LD R17, Y+ ; Считать второй байт Variables в R17
LD R18, Y+ ; Ну и третий байт в R18
; Теперь прибавим к ней 1, т.к. AVR не умеет складывать с константой, только
; вычитать, приходиться извращаться. Впрочем,
особых проблем не доставляет.
SUBI R16,(-1) ; вообще то SUBI это вычитание, но -(- дает +
SBCI R17,(-1) ; А тут перенос учитывается. Но об этом потом.
SBCI R18,(-1) ; Математика в ассемблере это отдельная история
ST -Y,R18 ; Сохраняем все как было.
ST -Y,R17 ; Но в обратном порядке
ST -Y,R16
Тут уже использованы операции с постинкрементом и преддекрементом. В
первой сначала читаем, потом прибавляем к адресу 1. Во второй вначале
вычитаем из адреса 1, а потом сохраняем.
Подобными инкрементальными командами удобно перебирать массивы в
памяти или таблицы.
А там есть еще и косвенная относительная запись/чтение LDD/STD и еще
варианты на все три вида индексов (X,Y,Z). В общем, читай даташит и
систему команд.
Стек.
О yes, стек это великая вещь! За что я его люблю, так это за то, что срыв
стека превращает работоспособную программу в полную кашу. За то, что
стековые операции требуют повышенного внимания, за то, что если где-то
стек сорвет, и сразу не отследишь, то потом не отловишь. В общем прелесть,
а не штуковина.