Главная | |
Материал взят из книги![]() Скачать оригинал КНИГИ в хорошем качествеЛюбой микропроцессор обязательно имеет в своем составе несколько внутренних регистров, которые он использует для хранения промежуточных данных. Микросхема АТ89С2051 не исключение. В связи с тем, что она является аналогом микросхемы MSC-51, то набор ее внутренних регистров полностью повторяет набор регистров MSC-51. На рис. 39 приведено схематическое изображение основных рабочих регистров микроконтроллера АТ89С2051. Цифры в верхней части рисунка помогают понять, сколько разрядов имеет каждый из регистров, а также относительное расположение старших и младших разрядов. Из рисунка видно, что процессор имеет два шестнадцатиразрядных регистра: PC и DPTR, и четыре восьмиразрядных: А, В, PSW и SP. Шестнадцатиразрядный регистр DPTR может использоваться как два восьмиразрядных. Эти регистры имеют название DPH и DPL. Регистр DPH — это старшая половинка регистра DPTR. Она объединяет с 8 по 15 разряды своего родителя. Регистр DPL — младшая часть. Она объединяет с 7 по 0 разряды. Регистры А и В расположены рядом по той причине, что в некоторых случаях они работают совместно. Но они никогда не используются, как единый шестнадцатиразрядный регистр. Рассмотрим назначение и особенности применения каждого регистра. ![]() Регистр РС. Регистр — указатель адреса. В этом регистре всегда хранится адрес текущей выполняемой команды. В процессе выполнения программы микроконтроллер читает по этому адресу коды команд из памяти, выполняет их и увеличивает содержимое регистра. Команды условного и безусловного перехода, а также программы организации цикла и перехода к подпрограмме записывают адрес перехода в регистр РС, осуществляя тем самым передачу управления. Регистр ОРП. Используется как регистр косвенной адресации в операциях пересылки данных из памяти программ в память данных и в специальной операции передачи управления. Что такое адресация и какие существуют виды адресации, мы рассмотрим в разделе, посвященном организации ОЗУ микроконтроллера. Регистр ОРТЯ может также использоваться для промежуточного хранения шестнадцатиразрядных чисел. Кроме того, каждая из его половин может использоваться самостоятельно, как два обычных восьмиразрядных регистра. Регистр А (аккумулятор) и вспомогательный регистр В. Вся система регистров микроконтроллера АТ89С2051 относится к классу аккумуляторных. Это значит, что в системе регистров имеется специальный регистр, называемый аккумулятором. Особенностью этого класса регистров является то, что результаты большинства команд преобразования данных, таких, как арифметические, логические операции, операции сдвига и так далее, всегда помещаются в аккумулятор. В системах без аккумулятора, после кода операции нужно всегда указывать не только коды источников данных, но и код приемника результатов. Например, команда сложения двух чисел в такой системе обычно состоит из трех байт: ![]() Первый байт — это код .... „.орои байт — адрес ячейки памяти или код регистра первого слагаемого. Третий байт — адрес ячейки или код регистра второго слагаемого. Сумма, обычно в таком случае, помещается в регистр (ячейку) АДР1. В аккумуляторной системе подобная команда будет состоять всего из двух байтов: кода операции и адреса второго слагаемого: ![]() Первое слагаемое всегда хранится в аккумуляторе. Туда же помещается и результат. Регистр аккумулятора традиционно обозначается буквой А. Он имеет восемь разрядов и именно поэтому процессор считается восьмиразрядным. При выполнении операций умножения и деления, в паре с аккумулятором участвует специальный вспомогательный регистр В. Для выполнения операции умножения один из множителей заносится в аккумулятор (А), а второй — во вспомогательный регистр (В). Результаты выполнения операции умножения заносятся в оба этих регистра. В регистр А — младшие восемь разрядов, а в регистр В — старшие. Процесс деления происходит аналогично. Делимое заносится в А, делитель — в В. В результате деления в накопителе оказывается частное, а в регистре В — остаток от целочисленного деления. Большинство современных процессоров имеют систему регистров аккумуляторного типа. Регистр PSW. Регистр с таким названием вы также найдете в составе любого современного процессора. PSW — это так называемый регистр флагов. С одной стороны это обычный регистр. Процессор может, как читать из него информацию, так и записывать в него. Однако это не основное его назначение. На рисунке вы видите, что регистр разделен на отдельные биты. Каждый бит регистра PSW имеет самостоятельное значение. Каждый бит предназначен для хранения признака свершения какого-либо события. Поэтому эти биты называют системными флагами. Рассмотрим подробнее назначение каждого системного флага и те события, признаком которых они являются. Флаг CY — признак переноса. Если в процессе выполнения операции сложения (вычитания) возникает перенос из старшего разряда, то значение этого флага устанавливается в единицу. Зачем же нужен такой флаг? Дело в том, что в системе команд микроконтроллера АТ89С2051 для операций сложения и вычитания предусмотрены только такие команды, которые работают с двумя восьмиразрядными числами. Для того, чтобы сложить числа, имеющие 16, 32 и более разрядов, программист должен написать небольшую специальную программу, которая будет производить поэтапное сложение этих чисел. На первом этапе складываются младшие восемь разрядов обоих чисел. На втором — следующие восемь разрядов. Вот тут-то и учитывается бит переноса. Кроме того, флаг переноса может служить признаком отрицательного результата в операции вычитания. Флаг OV — служит для хранения признака арифметического переполнения результата. Флаг Р — хранит признак четности содержимого аккумулятора. Флаг АС — это флаг дополнительного переноса из младшей тетрады АЛУ в старшую (тетрада — это половинка байта — четыре бита). Два бита, обозначенные как RS, служат для определения текущего банка регистров общего назначения. Что такое регистры общего назначения и как они делятся на банки, мы рассмотрим чуть позже. Флаг F0 — отдан в полное распоряжение программиста. Здесь он может хранить любой признак, нужный ему по ходу выполнения программы. Младший бит регистра PSW не используется. Значение любого флага можно использовать в качестве условия в операции условного перехода. Например, значение флага переноса используется для сравнения двух чисел. Для этого сначала из первого такого числа вычитают второе. В результате этой операции флаг переноса либо установится в единицу, либо сбросится в ноль. Это будет зависеть от того, какое из чисел окажется больше. Далее применяется оператор условного перехода по значению флага. Существует два таких оператора: «Перейти, если флаг установлен» и «Перейти, если флаг сброшен». Применение первого из этих операторов будет в этом случае эквивалентно переходу по условию «первое число меньше второго». Второй оператор будет означать переход по условию: «Первое число больше или равно второму». Большинство операторов условного перехода использует значения различных флагов. Размещение всех основных флагов в одном регистре позволяет легко сохранять их всех одной командой, где-нибудь во временной ячейке памяти. Например, на время действия программы обработки запроса на прерывание. К моменту поступления запроса на прерывание текущее значение флагов соответствует текущей выполняемой операции. В самом начале процедуры обработки прерывания необходимо предусмотреть команду сохранения текущего значения регистра PSW. В процессе выполнения процедуры обработки прерывания, состояние флагов непременно изменится. В конце процедуры должна быть предусмотрена команда восстановления значения PSW. Соблюдение этого условия гарантирует правильную работу условных операторов после выхода из прерывания. Регистр SP — указатель стека. На этом регистре нужно остановиться подробнее. Любой современный микропроцессор широко использует так называемую стековую память. Что же это такое? Стековая память — это особый способ организации памяти. По принципу магазина в автомате Калашникова. Сначала вы вкладываете в магазин патроны один за другим. А затем автомат извлекает их из магазина в обратном порядке. По принципу «первый вошел — последний вышел». Тот же принцип является основной идеологией стековой памяти. На рис. 40 схематично изображен процесс записи информации в стек и чтения из стека. Квадратиками обозначены ячейки памяти. Каждая из них хранит одно восьмиразрядное число. При записи информации в стек новый байт всегда помещается в самую первую ячейку стека. Одновременно, содержимое этой ячейки, занесенное туда в предыдущем цикле записи, перемещается во вторую ячейку. Содержимое второй — в третью, и так далее. То есть, все содержимое стека сдвигается на один шаг вправо. Так можно делать до тех пор, пока все ячейки не заполнятся полезной информацией. На рис. 40 изображен стек, состоящий из шести ячеек (говорят — стек глубиной в шесть ячеек). Это значит, что в него без вреда можно записать последовательно шесть байт. При записи седьмого байта, вся информация в стеке снова сместится вглубь стека. В результате самый первый байт будет потерян. Поэтому при использовании стековой памяти всегда нужно следить, чтобы его глубина была достаточной. Процесс считывания информации из стека происходит в обратном порядке. В каждом цикле чтения, извлекается содержимое самой крайней ячейки памяти. Содержимое остальных ячеек сдвигается в обратную сторону так, что число из ячейки 2 переписывается в ячейку 1, из ячейки 3 — в ячейку 2, и т.д. В микропроцессорной технике стековая память используется очень широко. Обычно она применяется для временного хранения каких-либо данных, пока выполняется некая операция. Например, часто стоит задача — сохранить содержимое некоторых регистров процессора на время работы какой-либо подпрограммы или процедуры обработки прерывания. Для этого в начале подпрограммы помещают несколько операторов, последовательно сохраняющих содержимое всех важных ![]() регистров в стековой памяти. После того, как регистры сохранены, подпрограмма может свободно использовать их для любых своих целей. В конце подпрограммы данные извлекаются из стека в обратном порядке и помещаются в те же самые регистры. Типичный набор инструкций, с которых начинается любая подпрограмма, выглядит следующим образом: • занести содержимое регистра А в стек; • занести содержимое регистра В в стек; • занести содержимое регистра PSW в стек. Затем идут команды, составляющие тело подпрограммы. Заканчивается подпрограмма рядом команд восстановления регистров: • извлечь из стека число и поместить в регистр РБХУ; • извлечь из стека число и поместить в регистр В; • извлечь из стека число и поместить в регистр А. Еще раз обращаю внимание, что восстановление регистров идет в по рядке обратном порядку их записи. Реальный механизм реализации стековой памяти любого современного микропроцессора немного отличается от схемы, изображенной на рис. 40. Стек организуется в обычной памяти данных. Для этого и применяется регистр — указатель стека (5Р). В начале работы программы в этот регистр необходимо записать некий начальный адрес, называемый «вершина стека». Это тот адрес, по которому будет записываться самое первое число, посылаемое в стек. В системе команд процессора имеется две специальные команды работы со стеком. Это команда записи в стек и команда извлечения из стека. Рассмотрим подробнее, как процессор выполняет эти команды. По команде записи в стек процессор записывает информацию в ячейку, адрес которой хранится в регистре БР, а затем увеличивает содержимое 5Р на единицу. Если теперь снова подать команду записи в стек, то новое число запишется уже по новому адресу, а содержимое указателя стека еще раз увеличится на единицу. По команде чтения из стека процессор сначала уменьшает содержимое регистра указателя стека на 1, а затем читает байт по этому адресу. В результате такой последовательности действий, процессор читает именно тот байт, который был записан последним. Как нетрудно убедиться, добавляя всего один лишний регистр, мы получаем возможность организовать стековую память, используя обычную память процессора. Преимущество такого построения в том, что, меняя начальный адрес вершины стека (то есть содержимое регистра 5Р), мы можем использовать для стековой памяти любую область ОЗУ. Необходимо лишь следить за тем, чтобы для стека было отведено достаточное пространство. И это пространство не использовалось бы для других целей. Кроме регистров, показанных на рис. 39, микроконтроллер АТ89С2051 имеет еще несколько видов внутренних регистров. Специальные регистры, предназначенные исключительно для хранения промежуточных данных, называются регистрами общего назначения (сокращенно РОН). На рис. 41 схематично изображены эти регистры. ![]() Описываемый микроконтроллер имеет 32 регистра общего назначения. Но они не могут использоваться все одновременно. Регистры разделены на четыре части — так называемые банки регистров. В каждый момент времени включен только один из банков. Если включен банк О, то программе доступны первые восемь регистров. Программа обращается к ним по именам ЯО, Ш, Я2 ... Я7. Регистры общего назначения могут использоваться программистом для хранения любых промежуточных значений наравне с ячейками памяти (ОЗУ). Однако любые команды, в которых участвуют регистры общего назначения, занимают места в программной памяти меньше, чем аналогичные команды с ячейками ОЗУ. Возьмем, например, команду пересылки числа из регистра в аккумулятор. Эта команда кодируется всего одним байтом. Для каждого из восьми РОН имеется свой отдельный код операции. Аналогичная команда пересылки из ячейки ОЗУ в аккумулятор кодируется двумя байтами. Первый байт — это код операции, а второй — адрес ячейки ОЗУ. Поэтому любой программист всегда старается использо- вать РОН для хранения самых часто используемых данных. И лишь в том случае, когда все регистры уже заняты, используют ОЗУ. Переключение банков РОН расширяет объем доступной регистровой памяти. Специальной команды на переключение банков не существует. За выбор одного из банков отвечают два специальных бита в регистре PSW. На рис. 39 эти биты обозначены, как поле RS. Двухразрядное двоичное число, записанное в это поле, равно номеру активного банка РОН. Для того, чтобы включить тот или иной банк, нужно в регистр PSW записать такое число, у которого два средних бита соответствуют номеру выбранного банка. Как это сделать, показано в табл. 3 (символом «X» отмечены те разряды, которые могут иметь любое значение). ![]() Если включить банк 1, то, как и прежде, процессор будет обращаться к восьми регистрам общего назначения, имеющим имена R0...R7, используя при этом те же самые команды. Однако это будут совсем другие регистры. Значения, записанные в регистры банка 0, останутся в полной сохранности. Затем можно выбрать банк 2, и, наконец, банк 3. В результате, при неизменном количестве базовых команд, мы получаем возможность в четыре раза расширить количество применяемых регистров. На практике разные банки РОН закрепляются за разными процедурами. Например, основная программа работает с банком 0. Какая-нибудь крупная подпрограмма с большим количеством расчетов работает с банком 1. Одна из процедур обработки прерывания работает с банком 2, а вторая процедура — с банком 3. При использовании разных банков РОН нужно внимательно следить за всеми переключениями банков. Если при входе в какую-либо процедуру вы подали команду на выбор другого банка, то перед выходом из этой процедуры не забудьте восстановить старое значение выбора банка. Для этого достаточно в начале процедуры, перед тем как менять банк, сохранить значение регистра PSW в стековой памяти, а перед тем как закончить процедуру, нужно восстановить значение PSW. Используются технологии uCoz
|