Ревич, Ю.В. Программирование микроконтроллеров AVR: от Arduino к ассемблеру
Глава 7. Система команд АVR SPL SPH- до и после вызова nодnроrраммы RAMEND в начале подпрограммы -sPL -sPH Рис. 7. 1 . Схема содержимого памяти данных до и после вызова подпрограммы и в начале ее выполнения 1 93 В 8-разрядном контроллере такой способ, однако, получается достаточно сложным: из-за двухбайтового характера величины адреса в сочетании с однобайтовыми переменными при адресации легко запутаться . Поэтому мы поступим проще - позволим себе испортить стек в начале подпрограммы, не забыв его восстановить перед выходом (листинг 7 . 1 8) . push var_l ; переменная var_l в программ е помещается в стек push var_2 ; переменная var_2 в программ е помещается в стек rcall procedure ; вызывается процедура рор var_2 ; после нее результат извлекается из стека рор var_l ; второй результат извлекается из стека procedure : рор ZL ; сохраняем младший байт адреса возврата в ZL рор ZH ; сохраняем старший байт адреса возврата в ZH рор var_loc2 ; переменная var_loc2 со значением var_2 рор var_locl ; и переменная var_locl со значением var 1 . . . . . ; расчеты, расчеты . . . push var_locl ; результат - в стек push var_loc2 ; результат - в стек push ZH ; восстанавливаем старший байт адреса возврата из ZH push ZL ; восстанавливаем младший байт адреса возврата из ZL ret ; возврат из процедуры Команды промежуточного сохранения и восстановления регистров var _ 1ос2 и var_loc2 здесь тоже опущены. Как видите, способ довольно громоздкий и в более или менее сложных программах (где как раз подобное и требуется) легко наворо тить ошибок, запутавшись, куда чего вы положили и откуда это надо извлекать. Нечто подобное Применяется в мини-операционных системах для контроллеров, типа RTOS [2] . В наших компактных задачах мы такое не используем - тут реги-
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==