Файл: Микропроцессорные устройства систем управления (Ю.И. Иванов, 2005).pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 16.06.2025
Просмотров: 1564
Скачиваний: 1
Стековая адресация требует обязательной инициализации указателя сте ка (SP) в начале работы микропроцессорной системы. В качестве начально го адреса в SP обычно загружается наибольший физический адрес RAM, запись данных в стек автоматически производится от больших адресов к меньшим адресам. Корректное выполнение рабочей программы микропро цессорной системы требует, чтобы количество команд записи данных в стек было строго равно количеству команд чтения из стека. Кроме того, ад ресное пространство RAM, выделенное для стека, не должно использовать ся остальными компонентами программы. Другие особенности организа ции обработки данных в микропроцессорной системе рассматриваются в следующем разделе.
1.4.Организация обработки данных
Вразделе 1.1 показано, что в микропроцессорной системе естественный порядок выполнения команд рабочей программы, определяющийся автома тическим инкрементированием программного счетчика, - последователь ный, выполняемые команды размещены в ячейках ROM с последовательно нарастающими адресами. При необходимости этот порядок может быть изменен командами управления, основные функции которых и заключают ся в изменении адресов выполняемых команд в программном счетчике, С помощью команд управления можно производить обработку данных с раз личной организацией алгоритмов выполнения.
Один из стандартных алгоритмов организации обработки данных - за мена линейной последовательности однотипных операций циклическим повторением одного и того же фрагмента программы, так называемая орга низация циклов. Циклы в программах могут быть с заданным числом по вторений или с завершением цикла по заданному условию. Рассмотрим ор ганизацию циклов на примерах.
Пример 1 (цикл с фиксированным числом повторений):
Вычислить сумму массива из 16 чисел (целые числа без знака), которые хранятся в последовательных ячейках памяти, начиная с адреса А1, и за писать в память по адресу А2.
Примечание 1. Задачу можно решить линейным алгоритмом, выполнив 16 команд с прямой адресацией для чтения из памяти каждого байта данных и соответствующее число команд суммиро вания, получив простую, но громоздкую программу.
Примечание 2. При суммировании 16 байтов довольно высока вероятность того, что сумма выйдет за однобайтовый формат. Про грамма должна предусматривать формирование двухбай товой суммы.
Для решения задачи определим функции регистров микропроцессора: ре гистр В - второй байт суммы, регистр С — счетчик числа циклов сумми-
28
рования, регистровую пару HL используем для адресации, так как в каж дом следующем цикле суммирования байт данных должен поступать из следующей ячейки памяти.
ml: Ixi HL, Al; |
начальный адрес массива чисел в HL, |
|
т2: mvi С, 0x10 ; количество чисел массива (количество циклов), |
||
тЗ: xra A |
; очистка аккумулятора (А8=0), |
|
т4: mov В, А |
; очистка регистра В (В8-А8=0), |
|
т5: addM |
; сложение (A8=A8+M(HL)), |
|
тб: jnC т8 |
; перейти к т8, если флаг переноса О, |
|
ml: inr В |
; увеличить старший байт на 1 (если флаг переноса 1), |
|
т8: inx HL |
; инкрементировать адрес в HL для следующего |
|
; |
цикла суммирования, |
|
т9: dcr С |
; декрементировать количество оставшихся циклов |
|
; суммирования, |
||
mlO.jnZmS |
; вернуться к т5, если цикл суммирования не последний, |
|
mil: sta A2 |
; сохранить в памяти младший байт суммы, |
|
ml2: mov А, В |
; переслать в аккумулятор старший байт суммы, |
|
т!3: sta (A2+1) ; сохранить в памяти старший байт суммы, |
||
ml4:. . . . |
||
Команды ml-m4 |
выполняют инициализацию (подготовку параметров) цик |
|
ла; команды т5-т10 составляют тело цикла с формированием двух бай-
тов суммы, повторяющееся 16 раз; команды mll-ml3 |
производят сохра |
нение полученной суммы в памяти по завершению цикла. |
|
Пример 2 (цикл с завершением по условию): |
|
Дополним задачу примера 1 следующим условием: |
суммирование чисел |
должно производиться только до появления переноса в старший байт. Следовательно, суммирование может быть выполнено и для всех чисел массива, если нет переноса, и может быть прервано раньше при ненуле вом переносе. Сумма в любом случае имеет однобайтовый формат.
Назначение регистров С, HL микропроцессора аналогично примеру 1, ре гистр В будем использовать для сохранения промежуточного значения суммы.
ml: Ixi HL, Al |
; начальный адрес массива чисел в HL, |
|
т2: mvi С, 0x10 |
; количество чисел массива (количество циклов), |
|
тЗ: хга А |
; очистка аккумулятора (А8-0), |
|
т4: mov В, А |
; сохранение предыдущей суммы в регистре В (В8=А8), |
|
т5: addM |
; сложение (A8=A8+M(HL)), |
|
тб: JC mil |
; перейти к завершению по mil, если флаг переноса 1, |
|
т7: inx HL |
; инкрементировать адрес в HL для следующего |
|
; |
цикла суммирования, |
|
29
m8: dcr С |
; декрементироватъ количество оставшихся циклов |
||
; |
суммирования, |
||
т9: jnZ |
m4 |
; вернуться к т4, если цикл суммирования не последний, |
|
mlO: jmp |
ml2 |
; перейти к завершению по ml2 для последнего цикла |
|
; суммирования, |
|||
ml I: movA, |
В |
; переслать в аккумулятор предыдущее значение |
|
; суммы при переносе, |
|||
ml2: sta Л2 |
; сохранить в памяти сумму, |
||
т!3: |
. . . . |
||
В примере 2 цикл может завершиться по тб при появлении переноса, и по ml2, если перенос при суммировании не формируется.
Еще одной важной процедурой обработки данных является подпрограм ма. Для выполнения этой процедуры в командах управления имеются спе циальные команды: "call A16" - вызов подпрограммы и "ret" - возврат из подпрограммы. При вызове подпрограммы работа основной программы временно приостанавливается, выполняются команды подпрограммы, за тем работа основной программы продолжается. Подпрограммы обычно применяют для реализации повторяющихся в разных частях основной про граммы функций.
Корректное продолжение работы приостановленной программы требует восстановления данных в определенных регистрах микропроцессора. Этот набор данных, необходимых для работы программы, принято называть век тором состояния программы. В общем случае компонентами вектора со стояния являются:
•адрес очередной команды в программном счетчике;
•регистр флагов, так как флаги могут измениться при выполнении под программы;
•аккумулятор, его содержимое практически всегда изменяется при вы полнении подпрограммы;
•регистры блока РОН, содержимое регистров также может измениться при выполнении подпрограммы.
Следовательно, любые компоненты вектора состояния, изменяющиеся при выполнении подпрограммы, должны сохраняться в памяти и при заверше нии подпрограммы восстанавливаться в регистрах микропроцессора. Как правило, эти операции с вектором состояния производят с помощью стека, поэтому стековая адресация всегда поддерживается в микропроцессорных системах.
Очевидно, что вызываемая подпрограмма также требует формирования своего вектора состояния. Вектор состояния вызываемой подпрограммы принято называть вектором прерывания. Так как подпрограмма только на чинает работать с момента вызова, в векторе прерывания обычно указыва-
30
ют только начальный адрес вызываемой подпрограммы для программного счетчика.
Таким образом, процедура использования подпрограммы включает сле дующие операции: остановка выполнения и сохранение вектора состояния программы, загрузка вектора прерывания и выполнение подпрограммы по вектору прерывания, восстановление вектора состояния и продолжение ра боты программы. Выполнение всех этих операций поддерживается систе мой команд микропроцессора.
Команда вызова подпрограммы "call A16" производит автоматическое сохранение в стеке текущего адреса команды из программного счетчика микропроцессора и загрузку адреса А16 вектора прерывания в программ ный счетчик, а команда завершения прерывания "ret" - такое же автомати ческое восстановление адреса в программном счетчике из стека. Из-за та кого алгоритма вызова и завершения прерывания задача сохранения и вос становления остальных компонентов вектора состояния программы обычно решается в подпрограмме прерывания. Подпрограмма должна начинаться с сохранения в стеке содержимого тех регистров микропроцессора, которые будут использоваться при ее работе. А перед командой возврата из подпро граммы (ret) должно выполняться восстановление содержимого этих же ре гистров из стека. Коды подпрограммы могут храниться в любой области адресного пространства памяти микропроцессорной системы.
Работу с подпрограммой рассмотрим на следующем примере:
ml
т2: callAsbl ; вызов подпрограммы по адресу Asbl с
; сохранением в стеке адреса тЗ из программного счетчика,
тЗ
;текст подпрограммы с командами сохранения и восстановления
;вектора состояния,
Asbl: push PSW; сохранение в стеке аккумулятора и регистра флагов, Asb2: push ВС ; сохранение в стеке регистровой пары ВС,
Asb3: push HL ; сохранение в стеке регистровой пары HL,
. . . .; команды преобразования данных в подпрограмме,
Asb4: |
pop HL ; восстановление из стека регистровой пары HL, |
Asb5' |
pop ВС ; восстановление из стека регистровой пары ВС, |
Asb6' |
pop PSW ; восстановление из стека аккумулятора |
; и регистра флагов, |
|
Asbl: |
ret ; возврат из подпрограммы с восстановлением |
; из стека адреса тЗ; в программном счетчике |
31