Форматы и способы адресации данных

Микроконтроллер типа 8051 работает с данными битового и байтового формата. При обработке данных можно обращаться не только к байтам во всех ЗУ, но и к отдельным битам функциональных регистров или части адресного пространства внутреннего ОЗУ. Есть несколько команд, рабо­тающих с данными двухбайтового формата. Часть команд обрабатывает каждый из битов байтовых операндов независимо от информации, содер­жащейся в других битах. Другая часть команд работает с байтами как с положительными целыми числами.

В командах обработки информации могут указываться один или два операнда. При явном использовании двух операндов один из них называется источником (source), а второй приемником (destination). Следует обратить внимание на то, что в поле операндов первым записывается обозначение приемника, а вторым — источника. При работе с одним операндом производится чтение операнда, его проверка или изменение и (при необ­ходимости) запись. При работе с двумя операндами производится чтение источника и (при необходимости) приемника, вычисление и (при необхо­димости) запись результата по адресу приемника. Слова "при необходи­мости" означают, что необходимость действия определяется типом команды. После выполнения команды обработки информации содержи­мое слова состояния процессора может измениться в зависимости от результата вычислений. В описаниях команд, которые не осуществляют непосредственную запись в этот регистр, приводятся сведения о влиянии результата выполнения на содержимое отдельных битов PSW.

Адресация данных может быть непосредственной (immediate), реги­стровой (register), прямой (direct), косвенной (indirect), индексной (index) и стековой (stack). В первом случае данные содержатся непосредственно в команде, во втором — в регистре общего назначения, а в остальных — в одном из запоминающих устройств (внутренних или внешних). При адресации к памяти программ операнд может быть только источником, например, непосредственная адресация допускается только для источника. В остальных случаях операнды могут быть как приемниками, так и источниками. Способ адресации операндов определяется кодом опера­ции. Следует обратить внимание, что для некоторых операций одному и тому же мнемокоду соответствует несколько разновидностей машинных команд. Такое разнообразие связано с использованием разных способов адресации для одного и того же способа обработки информации и с использованием части байта кода операции для кодирования адресов операндов.

Для символического обозначения непосредственной адресации в источ­нике используются символ # и числовое выражение, по которому трансля­тор вычисляет и записывает в машинный код команды нужную константу. Допустимое десятичное значение константы от 0 до 255 для байтового формата и от 0 до 65535 для двухбайтового. В качестве непосредственно­го операнда можно записывать числа в десятичной, шестнадцатеричной, восьмеричной или двоичной системах счисления с суффиксами d, h, о(q) или b соответственно. По умолчанию транслятор считает число десятич­ным. Непосредственная адресация удобна тем, что не нужно тратить дополнительное время на чтение операнда, так как он хранится в команде. Увеличение размера машинной команды не столь важно, так как константу все равно нужно где-то хранить.

Для символического обозначения регистровой адресации используется имя любого из восьми регистров общего назначения. При регистровой адресации содержимое регистра обрабатывается как данные. Номер регистра общего назначения указывается в коде операции, вследствие чего для регистровой адресации не требуется увеличивать размер машинной команды. По этой причине регистровая адресация обоих операндов не допускается. Она чаще всего применяется для временного хранения промежуточных результатов вычислений и удобна тем, что на чтение из регистра и на запись в него не тратится дополнительное время.

Для символического обозначения прямой адресации используется имя операнда. В качестве такового можно записать имя какого-либо функционального регистра или имя данных, указанное в поле метки при резервировании адресного пространства ОЗУ, По этому имени транслятор вычисляет фактическое значение адреса и подставляет его в машинный код команды. Таким образом, при использовании прямой адресации размер команды увеличивается. Поскольку при этом способе адресации к коду операции добавляются адресные байты, допускается прямая адресация обоих операндов, Следует иметь в виду, что в большинстве случаев прямая адресация к накопителю указывается только в ассемблерной команде, а в машинном коде нет его адреса. Он может появиться в машинном коде только тогда, когда его имя записано в обоих операндах. При использовании прямой адресации время выполнения команды увеличивается, а при адресации к портам - тем более.

Для обозначения косвенной адресации используется символ @, за которым следует выражение с именем регистра. При косвенной адреса­ции содержимое регистра используется не в качестве данных, а в качестве адреса данных, то есть указателя на данные (pointer). Независимо от того, является ли операнд источником или приемником, содержимое регистра, используемого в качестве операнда, не изменяется. Для косвенной адреса­ции могут использоваться только 2 регистра общего назначения (R0 и R1) или регистр указателя данных DPTR. Последний может использоваться во всем адресном пространстве внешних ЗУ, в то время как для регистров общего назначения максимальный адрес равен 255, При использовании косвенной адресации адреса регистров задаются кодом операции, так что увеличивать размер машинной команды не требуется. По этой причине косвенная адресация обоих операндов не допускается. Нельзя также использовать регистровую адресацию одного операнда и косвенную адресацию другого в одной и той же команде. Поскольку при косвенной адресации перед обращением к ЗУ необходимо сначала прочитать из регистра адрес операнда, то время выполнения команды увеличивается (особенно при обращении к внешним ЗУ).

Для индексной адресации используется сумма содержимого накопи­теля с содержимым программного счетчика или регистра указателя. Индексная адресация используется только для чтения из ПЗУ. Поскольку этот способ аналогичен косвенной адресации, то на Ассемблере он запи­сывается как @А+ с последующим именем используемого регистра PC или DPTR. При выполнении команды с индексной адресацией необходи­мо вычисление адреса, поэтому время ее выполнения по сравнению с косвенной адресацией еще больше.

Стековая адресация также аналогична косвенной в том смысле, что адрес для обращения к ОЗУ берется из регистра, но в этом случае в качестве указателя используется содержимое регистра стека. Отличие состоит в том, что перед записью в ОЗУ содержимое указателя стека автоматически увеличивается на 1, а после чтения из ОЗУ автоматически уменьшается на 1. Из-за автоматической коррекции содержимого указа­теля стека отпадает необходимость в записи одного из операндов коман­ды. Но главное преимущество стековой адресации состоит в том, что в ОЗУ образуется очередь, которая обслуживается по принципу LIFO (Last In First Out— последним пришел, первым вышел). При использовании стекового способа адресации необходимо тщательно следить за балансом операций записи в стек и чтения из стека и правильно оценивать объем ОЗУ, используемый стеком. Надо иметь в виду, что помимо явного использования стековой адресации при обработке данных, некоторые управляющие команды неявно используют стековую адресацию.

Для уменьшения количества команд, приводимых в описаниях, ис­пользованы следующие обозначения. В командах с регистровой адреса­цией буквой n обозначена цифра, значение которой может быть в преде­лах от 0 до 7, а в командах с косвенной адресацией буквой i обозначена цифра, принимающая значение 0 или 1. Операнды с задаваемыми про­граммистом именами в случае битового формата обозначаются flag, а в случае байтового формата — src и dst.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: