Ревич, Ю.В. Программирование микроконтроллеров 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
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==