Белов, А.В. Микроконтроллеры AVR: от азов программирования до создания практических устройств
92 Микроконтроллеры AVR от азов программирования... Для работы со стеком в системе команд микроконтроллера есть две специальные команды: ♦ команда записи в стек (push); ♦ команда извлечения из стека (pop). Выполняя команду push , микроконтроллер записывает содержимое одного из РОН в ОЗУ по адресу, на который указывает указатель стека, а затем уменьшает значение указателя на единицу. Новая команда push запишет значение другого РОН в следующую ячейку ОЗУ. А указатель передвинется еще дальше. Таким образом происходит заполнение стека. Выполняя команду pop, микроконтроллер сначала увеличивает содержимое указателя стека на единицу, а затем извлекает содержимое ячейки ОЗУ, на которое указывает указатель. Считанное значение поме щается в один из РОН. В результате из стека считывается последнее записанное туда число. Следующая команда pop опять сначала увели чит указатель стека и прочитает предпоследнее записанное туда число. Благодаря регистру-указателю стека и описанному выше алгоритму реа лизуется полноценная стековая память. Сразу после сброса микроконтроллера содержимое указателя стека равно нулю. Если оставить это содержимое без изменений, то все команды, связанные со стеком, работать не будут. Если вы собираетесь использовать стек в вашей программе, то в самом ее начале вам необхо димо записать в регистр-указатель стека значение его вершины. Обычно вершину стека устанавливают равной адресу самой старшей ячейки ОЗУ Кроме того, при составлении программы вы должны сле дить, чтобы она не использовала в процессе своей работы область ОЗУ, выделенную вами для стека. Одной из команд, активно использующих стековую память, является команда перехода к подпрограмме. При вызове подпрограммы текущий адрес из счетчика программ автоматически записывается в стек. При выходе из подпрограммы микроконтроллер извлекает адрес из стека и продолжает выполнение программы с этого адреса. Команда перехода к подпрограмме использует тот же самый стек, что и команды push и pop. Это нужно обязательно учитывать при составлении программы. Если записать данные в стек, а затем перейти к подпрограмме, то в теле под программы прочитать эти данные из стека будет уже невозможно. Если вы все же попытаетесь в данной ситуации извлечь данные из стека, вме сто записанных данных вы получите адрес возврата из подпрограммы. Мало того, что вы не получите нужные вами данные, так вы еще и сде лаете невозможным правильный выход из подпрограммы, так как в стеке уже не будет адреса выхода.
Made with FlippingBook
RkJQdWJsaXNoZXIy MTExODQxMg==