Gudd-Head писал(а):Ну, это для косвенного перехода.
Ну там раньше обсуждлся косвенный переход. Тут ближе - выборка из массива по индексу. Разницы никакой -- есть фиксированный адрес (16-бит константа) и есть смещение к нему (8-бит переменная), надо сложить.
Можно складывать сначала загружая константу, потом прибавляя переменную и перенос. Тогда, действительно, регистр удобен, хотя
Код: Выделить всё
ldi ZL, Low(ARRAY*2)
ldi ZH, High(ARRAY*2)
add ZL, razr
brcc no_carry ; эти две команды вместе с меткой можно для упрощения написания
inc ZH ; оформить в макрос add_carry, принимающий регистр, к которому добавить
no_carry:
ни по тактам, ни по словам не длиннее, чем
Код: Выделить всё
clr r17
ldi ZL, Low(ARRAY*2)
ldi ZH, High(ARRAY*2)
add ZL, razr
adc ZH, r17
так что обнулённый регистр имеет смысл только тогда, когда он обнуляется в начале программы и всегда таким поддерживается. Используется везде без обнуления каждый раз.
Благо, часто не жалко какой-то из «нижних» регистров выделить под ZERO.
Ну а если вспонить, что вместо прибавления к константе можно вычесть минус-константу, то выйдет показанное выше.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.