fl
МИКРОКОНТРОЛЛЕРЫ
и
байта указателя). Этот регистр хранит адрес байта в ОЗУ,
который в данный момент будет использован как вершина
стека. При сохранении данных в стек командой PUSH, или
вызове подпрограммы командами CALL/ICALL, именно по
этому адресу будет записана сохраняемая информация (либо
адрес возврата из подпрограммы). При занесении данных в
стек значение указателя, хранящееся в регистре стека, ав-
томатически уменьшается на единицу (при выполнении ко-
манды PUSH) либо на два (при вызове подпрограмм - пото-
му что в этом случае в стек записываются два байта адреса
возврата из подпрограммы). Соответственно при выполне-
нии команды POP указатель стека после ее выполнения
увеличивается на единицу, а при выполнении команды RET
или RETI - увеличивается на два. Такая дисциплина работы
стека практически снимает ограничения на глубину вложен-
ности вызовов подпрограмм (в разумных пределах, разуме-
ется). Основное назначение стека, помимо организации воз-
вратов из подпрограмм - временное хранилище данных для
рабочих регистров, а также средство выделения памяти под
т.н. локальные переменные в языках высокого уровня. Вспом-
ните, сколько проблем нам доставляла нехватка рабочих ре-
гистров в микроконтроллере АТПпу15. При наличии аппа-
ратного стека в микроконтроллере ATMegal 28 проблема не-
хватки регистров решается элементарно просто:
push
r30
; Сохраняем прежние значения, хранящиеся в регистре
7,
в стек
push
r31
Idi
гЗО,.
. . ; Портим значения в регистре
7
Idi
г31.
..
pop
r31
; Восстанавливаем испорченные значения в регистре Z
pop
гЗО
Как видите, стиль использования стека для хранения
данных - в точности такой же, как в микроконтроллере
КР1878ВЕ1. И точно так же восстановление данных из сте-
ка должно выполняться в порядке, обратном тому, в кото-
ром происходило их сохранение. Использование же стека
для выделения памяти под локальные переменные мы раз-
берем позже, когда дойдем до применения языков высо-
кого уровня. Для обеспечения правильной работы аппа-
ратного стека первое, что должна сделать любая програм-
ма - установить корректное значение регистра ЗР. Опе-
рация эта настолько важна, что в языках программирова-
ния высокого уровня компилятор самостоятельно включа-
ет в программу соответствующий код независимо от же-
лания программиста. Поскольку при сохранении данных в
стек указатель ЗР уменьшается (стек “растет вниз”, как
принято писать в литературе), начальное значение регис-
тра указателя стека ЗР устанавливают равным адресу
последнего байта ОЗУ.
Для того, чтобы выполнить операцию с каким-либо бай-
том из ОЗУ, нам необходимо предварительно считать его в
один из рабочих регистров. После выполнения операции
результат ее также бывает необходимо сохранить в соот-
ветствующий байт ОЗУ. Для передачи данных между бай-
тами ОЗУ и рабочими регистрами используется группа ко-
манд иэ.
.. , а для сохранения данных в ОЗУ - группа ко-
манд ЗТ.
.. Отличаются эти команды различными способа-
ми адресации памяти. Если в микроконтроллере.АТПпу15
существовало всего 3 способа адресации данных (непос-
редственная, прямая и косвенная с использованием регис-
тра
7),
то в микроконтроллере АТМеда128 этот список зна-
чительно расширен. В отличие от АТПпу15, в микроконт-
роллере АТМеда128 существует не один, а три регистра кос-
венной адресации - X, У и Z. Регистры эти образованы из
регистровых пар г26, г27 (регистр X), г28, г29 (регистр У) и
гЗО, г31 (регистр
7)
соответственно. Во всех случаях стар-
ший байт адреса хранится в регистре с меньшим номе-
ром, а младший - в регистре с большим номером. Итак,
вот какие способы адресации используются в микроконт-
роллере ATMegal 28:
• непосредственная адресация, когда загружаемый опе-
ранд расположен непосредственно в самой команде, напри-
мер LDI г16,0x01 (загружает в регистр г16 число 0x01);
• прямая адресация к регистру, например MOV r16,r17
(загружает в регистр г16 значение из регистра г17);
• прямая адресация к байту ОЗУ, например LDS
г16,0x0060 (загружает в регистр г16 содержимое байта ОЗУ,
расположенного по адресу 0x0060);
• косвенная адресация с использованием регистров X,
У или Z, например LD г16,Х (загружает в регистр И 6 содер-
жимое байта ОЗУ, адрес которого записан в регистре X -
т.е. в Г26.
.Г27);
• косвенная адресация с пост-инкрементом с исполь-
зованием регистров X, У или Z, например LD г16,Х+ (загру-
жает в регистр г16 содержимое байта ОЗУ, адрес которого
записан в регистре X - т.е. в г26.
.г27. После того, как байт
был загружен, содержимое регистра X увеличивается на
единицу);
• косвенная адресация с пред-декрементом с исполь-
зованием регистров X, У или Z, например LD г16,-Х (загру-
жает в регистр г16 содержимое байта ОЗУ, адрес которого
записан в регистре X - т.е. в г26.
.г27. Перед тем, как загру-
зить байт, содержимое регистра X уменьшается на едини-
цу, и именно этот адрес используется при загрузке байта);
• косвенная адресация со смещением с использовани-
ем регистров У или
7
(но не X!), например LDS r16,Z+8 (заг-
ружает в регистр г16 содержимое байта ОЗУ, адрес кото-
рого вычисляется как значение из регистра
7
плюс смеще-
ние - в данном случае 8).
Для команд сохранения данных в ОЗУ используются
те же самые методы адресации, за исключением непос-
редственной. Читатели, думается, без труда увидят анало-
гии со способами адресации микроконтроллера КР1878ВЕ1
с применением регистров косвенной адресации IR0 и IR1 ,'а
также аналогии адресов вида %аЗ и косвенной адресации
Р ад и о л ю б и тел ь - 0 . 8 / 2 0 0 8 У
39
предыдущая страница 39 Радиолюбитель 2008-08 читать онлайн следующая страница 41 Радиолюбитель 2008-08 читать онлайн Домой Выключить/включить текст