Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру

1 68 Часть 11. Программирование микроконтроллеров АVR на ассемблере c lr temp ; обнулить temp back_loop : inc temp ; увеличиваем temp на 1 <что-то делаем, необязательно с помощью temp> cpi temp , 1 0 brne back_loop Обратите внимание : если требуется, чтобы temp начинала с нулевого значения, то фрагмент «что-то делаем» следует вставить до команды inc (цикл с постусловием), но тогда последним рабочим значением temp в цикле будет 9, а не 1 0 (а по выходу из процедуры - все равно 1 О) . Иногда проще построить декрементный цикл - когда переменная уменьшается от заданного значения до нуля (листинг 7 . 3) . ldi temp , 1 0 ; загружаем 1 0 в temp back_loop : dec temp ; уменьшаем temp на 1 <что-то делаем с помощью temp или без нее> brne back_loop Как мы уже отмечали в предыдущей главе, при использовании для обнаружения нулевого значения команды dec, вообще никакой специальной команды сравнения не требуется, потому что она при достижении нуля сама установит флаг z (то же относится к команде tst, которая проверяет на условие «равно или меньше нуля», к командам вычитания suЬ и suЬi, и т. д. ) . И если даже при наличии dec задейство­ вать регистр из первой половины регистрового файла (где команды загрузки непо­ средственного значения или сравнения с константой не работают), то лишняя команда понадобится не в каждом цикле, а только один раз - для загрузки предва­ рительного значения : ldi temp , 1 0 ; загружаем 1 0 в temp mov r05 , temp / * загружаем 1 0 в r05 и далее его используем в команде dec* / Кроме этих команд перехода по равенству (неравенству), проверяющих значение флага z, есть команды, которые осуществляют переход по значениям других разря­ дов в регистре флагов SREG, устанавливаемых в зависимости от результатов опера­ ции ер или cpi . Например, команды brlo (перейти, если меньше) и brsh (перейти, если больше или равно, - не следует путать ее с командой brhs, проверяющей флаг н на равенство единице) осуществляют переход в зависимости от состояния флага переноса с. Если в команде suЬ r l , r2 (или ер r l , r2 ) первый регистр окажет­ ся содержащим значение меньше, чем у второго, то флаг переноса будет установ­ лен, а по команде brlo произойдет переход. По команде brsh переход произойдет в противоположном случае - если флаг с оказался сброшен из-за того, что rl � r2 .

RkJQdWJsaXNoZXIy MTExODQxMg==