коды программы, и константы - данные, которые не изменяются в процессе выполнения программы микропроцессорной системы.
Соотношение между объемами RAM и ROM в адресном пространстве памяти зависит от назначения микропроцессорной системы. В универсаль ных средствах таких, как персональный компьютер, объем ROM относи тельно небольшой. Из программ, необходимых для работы, в ROM персо нального компьютера постоянно хранится только BIOS - комплекс про грамм, обеспечивающих загрузку в RAM других программ с внешних но сителей информации (например, с hard-диска). Набор задач жестко не огра ничен и для решаемых задач выбираются и загружаются в RAM с помощью BIOS требуемые компоненты программного обеспечения.
Для специализированных микропроцессорных систем, к которым отно сятся и средства автоматизации, обычно и круг задач, и программы, тре буемые для их решения, неизменны и могут постоянно храниться в памяти. Поэтому в таких средствах удельный вес ROM в адресном пространстве практически всегда существенно превышает удельный вес RAM. В даль нейшем будем рассматривать вопросы организации работы микропроцес сорной системы, полагая, что все программы хранятся в ROM и имеется RAM относительно небольшого объема только для хранения данных.
Задание определенных физических адресов для областей RAM и ROM в общем случае может быть произвольным. Однако необходимо учитывать следующую особенность работы микропроцессора: процедура начального сброса (reset), с которой обязательно должна начинаться работа, как прави ло, задает в программном счетчике нулевой начальный адрес программы. По начальному адресу памяти должно размещаться начало рабочей про граммы микропроцессора, которая обеспечивает корректный старт работы микропроцессорной системы. Область памяти с этими начальными адреса ми, следовательно, должна принадлежать области ROM. Чтобы адресные пространства сделать непрерывными, обычно адреса ROM задают, начиная с наименьших адресов, а адреса RAM - в оставшемся диапазоне наиболь ших физических адресов.
Ранее было показано, что адресация кодов программы производится программным счетчиком микропроцессора. Адресация всех остальных данных должна производиться командами программы. Организация работы микропроцессорной системы предполагает использование нескольких спо собов адресации данных. Если память микропроцессорной системы образу ет единое адресное пространство, способы адресации не зависят от того, с какой областью памяти мы работаем.
Применяемые в микропроцессорной системе алгоритмы адресации дан ных можно привести к одному из четырех видов: непосредственная адреса ция, прямая адресация, регистровая адресация, стековая адресация. Осо бенности адресации связаны с разным форматом данных и адресов: данные - один байт, адреса - два байта.
25
Самый простой вид - непосредственная адресация. В этом случае байт данных помещается непосредственно в коде команды. Примеры: команда mvi By D8 производит загрузку в регистр В байта данных D8 (38=08), со держащегося в коде команды; команда sui D8 производит вычитание из байта аккумулятора байта данных D8 (A8=A8-D8). Команды с непосред ственной адресацией часто называют операциями с константами. Так как данные при непосредственной адресации являются элементами кодов про граммы, эти данные не могут быть изменены. Неизменность данных явля ется свойством и основным ограничением этого вида адресации, который в действительности применяется только для операций с константами.
Для прямой адресации физический адрес ячейки памяти (ША) указыва ется в коде команды: например, команда sta A16 производит запись байта данных из аккумулятора в ячейку памяти с двухбайтовым адресом А16 (А8-М(А16)). При такой адресации передаваемые байты данных являются обычными переменными и могут принимать любые допустимые значения. Существенное ограничение - обмен данными по командам с прямой адре сации всегда происходит с одной и той же ячейкой памяти, адрес которой указан в команде. Из-за этого ограничения и громоздкого формата команд, содержащих в своем коде двухбайтовый адрес, прямая адресация также имеет ограниченное применение. В алгоритмах обработки данных доста точно часто требуется адрес сделать переменным, чтобы можно было им программно управлять.
Более универсальна регистровая адресация, называемая также косвенной адресацией. При регистровой адресации в качестве кода адреса использует ся содержимое регистровой пары (два байта). Примеры: команда Шах DE производит загрузку в аккумулятор байта данных из ячейки памяти с адресом, указанным в регистровой паре DE (A8=M(DE)); команда ana M вы полняет конъюнкцию байтов аккумулятора и ячейки памяти с адресом, указанным в регистровой паре HL (A8=(A8)&M(HL)). В большинстве ко манд с регистровой адресацией микропроцессора Intel 8080 код адреса хра нится в регистровой паре HL (H - старший байт адреса, L - младший байт адреса). Регистровая адресация, во-первых, упрощает формат команд - в явном виде код команды не содержит двухбайтового адреса; и, во-вторых, адрес можно изменять, выполняя с байтами адреса любые операции из на бора команд микропроцессора. Возможность преобразования адреса при работе программы является важнейшим свойством этого вида адресации и широко используется в различных алгоритмах.
Очевидно, что регистровая адресация требует предварительной подго товки (загрузки или преобразования) кода адреса в регистровой паре. Для преобразования адресов в регистровых парах система команд содержит специальные операции с двухбайтовыми данными.
26
Например, команда Ixi HL, DLDH производит загрузку двух байт (DJ3 и DH8) в регистры L и Н (L8 = DL8, H8 = Он8), используя непосредственную адресацию, а команда inx HL выполняет инкремент содержимого реги стровой пары HL, как двухбайтовой переменной (HL=HL+1).
Четвертый вид - стековая адресация, в первую очередь, предназначена для работы с подпрограммами. Более подробно процедуры с подпрограм мами будут рассмотрены в следующем разделе. Следует помнить, что стек в микропроцессорной системе - не отдельное запоминающее устройство, а способ адресации RAM с особым алгоритмом формирования адреса. Адрес RAM для операций со стеком всегда определяется специальным адресным регистром - указателем стека (SP) микропроцессора (рис. 2).
В командах, использующих стековую адресацию, адрес в явном виде ни когда не указывается и определяется следующим алгоритмом доступа к данным: "последний вошел - первый вышел". Обычно этот алгоритм реа лизуется преобразованием содержимого указателя стека: при записи дан ных указатель стека (SP) автоматически декрементируется, а при чтении данных указатель стека (SP) автоматически инкрементируется. Такое пре образование адреса в указателе стека обеспечивает в командах чтения сле дующий порядок доступа: первым считывается байт данных, записанный последним, вторым - записанный предпоследним, и т.д. Следовательно, порядок записи данных в стек однозначно определяет порядок поступления данных при чтении, а стековая адресация не позволяет производить незави симый доступ к любым данным, как другие виды адресации.
Стековая адресация применяется из-за упрощенного формата команд и процедур обмена данными в алгоритмах, требующих однократной записи в память и затем однократного считывания данных из памяти в строго задан ной последовательности. Команды со стековой адресацией микропроцессо ра Intel 8080 производят обмен двухбайтовыми данными.
Рассмотрим пример применения стека для хранения данных:
ml: push |
ВС |
; B8-+RAM(SP-1), C8-+RAM(SP~2), |
SP=SP-2 |
m2: push |
DE |
; D8-*RAM(SP~3), E8-+RAM(SP-4), |
SP^SP-4 |
;команды программы, изменяющие данные в
;регистрах В, С, D, Е
|
; однако данные в этих регистрах должны быть восста- |
||
|
; новлены для дальнейшего использования в программе. |
||
тЗ: pop |
DE |
; RAM(SP-4)-+E8, RAM(SP-3)->D8, |
SP=SP-2 |
m4: pop |
ВС |
; RAM(SP-2)-+C8, RAM(SP-1)-+B8, |
SP^SP |
Комментарии в каждой строке примера поясняют характер выполняемых операций.
27
Стековая адресация требует обязательной инициализации указателя сте ка (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