BOB51 писал(а):во первых вложенные циклы так не делаются:
Делаются. Просто надо "в полном объёме знать"

BOB51 писал(а):Loop: dec Temp1; На этом месте отладка в Студии зависает, зацикливается
brne Loop; тут тоже виснет
Если так — то это её личные проблемы. В железе работает.
BOB51 писал(а):Во вторых - декремент нуля приведет к результату 0xff и вместо останова отмотать 255 циклов
Отлично, это и нужно. Тот первый цикл плюс оставшиеся 255 — это 256.
Скажем, нужно отмотать 512 циклов. Это как раз два раза по 256, в старший счётчик "троесчётчика" грузится 1, в средний 2, в младший 0.
А если 513, то в старший грузится 1 (два внутренних пройти 1 раз), в средний 3 (самый внутренний пройти три раза, один раз с начальным значением и еще два раза с 0, т.е. с 256), в младший грузится 1.
BOB51 писал(а):сделай хотя-бы как-то так:
Код: Выделить всё
;Задержка
ldi Temp1,1
Loop2:
ldi Temp2,5
Loop1:
ldi Temp3,4
Loop:
; допустим, тут делаем импульс на ножке
dec Temp3
brne Loop
dec Temp2
brne Loop1
dec Temp1
brne Loop2
ret
Так тоже можно, конечно. Но через место, отмеченное комментарием
«допустим, тут делаем импульс на ножке», этот «троецикл» пройдёт 4*5*1 = 20 раз. Зачем для этого три регистра?
Из-за того, что полное число проходов внутреннего цикла равно произведению загружаемых значений, таким способом можно получить только числа, раскладывающиеся на три множителя.
Такой цикл:
Код: Выделить всё
ldi r16, XXX
ldi r17, YYY
ldi r18, ZZZ
loop:
dec r16
brne loop
dec r17
brne loop
dec r18
brne loop
отлично работает, даёт любые значения, а не только произведения трёх сомножителей.
Просто нужно правильно инициализировать. Я в бытность на 51-ом настолько часто такой цикл использовал, что у меня и для асма, и для С были макроса для загрузки начальных значений.
Для асма на AVR будет выглядеть как-то так (нотация avr-as из avr-binutils, идёт в комплекте с avr-gcc/WinAVR):
Код: Выделить всё
.macro ldcnt3 rg0, rg1, rg2, value
ldi \rg0, lo8( \value )
ldi \rg1, lo8( (\value+0xFF) >> 8 )
ldi \rg2, lo8( (\value+0xFFFF) >> 16 )
.endm
foo:
ldcnt3 r16, r17, r18, 123456
loop:
dec r16
brne loop
dec r17
brne loop
dec r18
brne loop
ret
BOB51 писал(а):не всегда в полном объеме его знает
Да-да… Чтобы что-то ругать или
хвалить — это надо знать.
Лень в виде мании величия: «ты гений, зачем стараться?». В виде комплекса: «всё равно не выйдет, зачем упираться?». Как логика: «если достаточно, зачем знать и уметь больше?». Цель одна: остановить. Не любит тепло работающих мышц и шум работающего мозга.