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

Глава 7. Система команд АVR 191 Отметим, что в Pascal также возможен цикл с произвольными границами, анало- гичный FOR . . . NEXT в Basic, даже две разновидности таких циклов: for . . . to . . . do • • . и for • . . downto . . . do . . . А вот задание шага итераций FOR . . . то . . . STEP, как в Basic, в Pascal невозможно - такой цикл приходится организовывать с помощью whi le . • • do. В С, конечно, все проще, потому что там цикл for допус­ кает любые издевательства над параметрами. Но ассемблер тут тоже на высоте, т. к. с легкостью позволяет выстраивать произвольные циклические конструкции, ими­ тируя любую из этих разновидностей . Здесь мы не приводим все возможные вари­ анты только потому, что это заняло бы много места, но по приведенным образцам читатель, без сомнения, сам сумеет выстроить ту конструкцию, которая лучше всего подходит к задаче. Другие типовые процедуры, из которых наиболее важны различные арифметиче­ ские действия, мы рассмотрим в последующих главах по ходу дела. Стоит обратить внимание на классическую книгу [ 1 4] , в которой вы сможете найти реализации практически всех типовых математических алгоритмов с примерами (правда, ино­ гда изложенных излишне «математично») . О стеке, локальных и глобальных п еременных Как мы уже говорили, стек - одно из самых употребительных понятий в програм­ мировании. Наличие программного стека позволяет, например, организовать при­ вычное для языков высокого уровня разделение переменных на локальные и гло­ бальные. Однако постарайтесь забыть о такой привычке, к которой вас, несомнен­ но, приучила среда Arduino, - там это действительно оправданно по многим причинам, а здесь нас это деление будет лишь путать . Во всех последующих про­ граммах в этой книге мы будем пользоваться только глобальными переменными и, если регистров общего назначения для них не хватает, - задействовать ячейки SRAM. (Привычку пользоваться преимущественно глобальными переменными ав­ тор даже перенес в свой стиль программирования на Delphi, отчего неоднократно создавал себе там излишние сложности.) Однако в больших проектах без локальных переменных бывает просто не обойтись (например, когда одна и та же процедура вызывается в разных местах с исходными данными, хранящимися в различных регистрах). Наиболее просто организовывать передачу параметров в процедуру через стек, если ее оформить в виде макроса (листинг 7 . 1 7) . . macro procedure рор var_loc2 ; переменная var_loc2 со значением var_2 рор var_locl ; и переменная var_locl со значением var_l . . . . . ; расчеты, расчеты . . . push var_locl ; результат - в стек push var_loc2 ; результат - в стек . endm

RkJQdWJsaXNoZXIy MTExODQxMg==