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

●     однокомпонентные способы адресации, при которых исполнительный адрес задается единственным значением в команде;

●     многокомпонентные способы адресации, при которых исполнительный адрес получается в результате суммирования содержимого двух и более источников адресов.

При кодировании адресной информации помимо способа адресации в коман­де указываются числовые данные. Способ адресации кодируется:

●     в явной форме, при которой используются специальные символы: # — непо­средственная адресация; @ — косвенная адресация; % — регистровая адре­сация; (...)+, –(..) — постинкрементная и предекрементная адресация и др.;

●     в неявной форме, при которой способ адресации передается в коде опера­ции.

Дополнительная информация передается явно. Например:

STAX reg ; (reg)<A

Описание способов сопровождается иллюстрациями и примерами команд на языке ассемблера. Команда записывается в виде:

ОРС dst, scr           ; пояснения выполняемой команды

где ОРС (OPeration Code – код операции) — мнемокод команды; dst (destination –назначение, или приемник) — адрес первого операнда, на место которого помеща­ется результат операции; scr (source – источник) — адрес второго операнда. В качестве dst и scr используются: ptr (pointer – указатель); disp (displacement — сме­щение); reg — регистр; breg — базовый регистр; ireg — индексный регистр; (...) — содержимое, например, (reg) — содержимое регистра и др.

Непосредственная адресация. Суть способа. Требуемые данные (#data — непосредственный операнд, константа или литерал) автоматически вызываются из памяти одновременно с командой. В качестве вызываемых данных использу­ются один, два или четыре последних байта команды. Непосредственная адреса­ция задается определенным значением кода ОРС, содержащегося в первом бай­те этих команд, или поля REG/OPC байта MODR/M (в 32–разрядных процессорах). Разрядность операнда (8, 16 или 32 разряда) зависит от режима работы процес­сора и может изменяться соответствующим префиксом или указателем, в каче­стве которого могут быть использованы #data или imN (N = 8, 16, 32).

 Реализация способа. При этом способе адресации источником данных (#data) является сама команда, поэтому указателем является непосредственный операнд (prt =  #data), который располагается за кодом ОРС команды.

Покажем на примерах способ непосредственной адресации:

●     команда с явным определением данных:

MOV reg, #data               ; reg <—  data — загрузка регистра константой;

●     команда с неявным определением данных:

CLR reg                            ; очистка регистра (всегда загружается нуль);

●     команда с короткой непосредственной адресацией:

INC reg, #sdala                ; reg <—  reg + sdata, где sdata — целое со знаком или без знака.

Достоинство. Не требуется дополнительного цикла обращения к памяти, так как операнд поступает непосредственно в процессор вместе с командой.

Недостатки. Увеличивает размер команды число байт заданного опе­ранда; позволяет вызывать только целочисленные константы.

Применение. Используется во многих архитектурах для определения целочисленных констант при арифметических и логических операциях, а также при выполнении ряда команд пересылки (MOV, PUSH).

Прямая адресация. Суть способа. Операнд выбирается из ячейки памя­ти, полный адрес (addr) которой содержится в команде (указатель ptr = addr). Этот способ также называют абсолютной адресацией.

Реализация способа. В 8–разрядных процессорах с 16–разрядной ши­ной адреса местоположение операнда определяют второй и третий байты, как показано на рис. 2.6.1, а.  Например:

LDA addr                             ; А <— (addr) — загрузка аккумулятора А содержимым

                                               ; ячейки памяти по указанному адресу.

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

рис. 2.6.1

При прямой адресации портов (рис. 2.6.1, б) используется указатель prt = port, где port — адрес порта. Прямая адресация портов возможна тогда, когда архитек­тура микропроцессора имеет изолированное пространство ввода–вывода IOSEG. Для доступа к данным используются специальные команды, например:

IN port ; загрузка аккумулятора из порта OUT port ; пересылка данных из аккумулятора в порт.

Встречаются команды (например, в системе команд К1810ВМ86) прямой ко­роткой адресации портов.

Достоинство. Данными являются переменные, а не константы как при не­посредственной адресации, т. е. допускается изменение значений операнда.

Недостатки. Для задания адреса операнда команда должна содержать не­обходимое количество байт адреса (до 4), что вызывает увеличение объема па­мяти программ и времени выборки команды из памяти. Команда имеет доступ только к одному и тому же адресу памяти. Всякое изменение адреса приводит к изменению объектного кода (программы).

Применение. Способ доступа наиболее эффективен в том случае, когда расположение данных известно заранее и не изменяется в процессе выполнения программы. Поэтому прямая адресация используется только для доступа к гло­бальным переменным, адреса которых известны во время компиляции.

Регистровая адресация. Суть способа. Операнд выбирается из внутреннего

регистра микропроцессора, адрес (reg) которого указан в команде (ptr = reg). Этот способ отличается от прямого способа тем, что:

●     данные хранятся во внутреннем регистре процессора, т. е. источником или приемником операнда является регистр (рис. 2.6.2);

●     в мнемокоде используются специальные имена, зарезервированные для обо­значения регистров (например, A, Rn).

рис. 2.6.2

Для повышения эффективности регистровой адресации во многих микропро­цессорах имеется специальный регистр — аккумулятор, который в отличие от ре­гистров общего назначения наделен рядом дополнительных функций:

●     содержимое аккумулятора служит исходным операндом для выполнения очередной операции;

●     в него же заносится результат выполненной опе­рации;

●     с помощью специальных команд осуществляется обмен между аккумулятором и внешними устрой­ствами.

Реализация способа. Примерами команд с регистровой адресацией яв­ляются:

MOV reg,addr                ;reg < (addr) — загрузка в регистр содержимого

                                          ; ячейки памяти данных с адресом addr

NEG reg                           ; логическое отрицание содержимого регистра

Часто используется неявная форма регистровой адресации. Например,

IDAaddr                         ; А <— (addr) — загрузка в аккумулятор А содержимого

                                          ; ячейки памяти данных с адресом addr .

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

Недостаток. Необходимость использования команд пересылки для загруз­ки внутренних регистров (включая аккумулятор) новыми операндами и сохране­ния полученных результатов приводит в некоторых случаях к замедлению выпол­нения программы.

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

Косвенная и косвенно–регистровая адресация. Суть способа. Адрес операнда содержится в основной памяти или регистре, т.е. указан в команде косвенно (prt = @addr). Он не зафиксирован жестко в команде, как при прямой ад­ресации, и поэтому может быть легко модифицирован.

Реализация способа. Различают следующие разновидности косвенной адресации.

рис. 2.6.3

Косвенная абсолютная адресация, при которой исполнительный адрес ЕА операнда определяется содержимым (addr) ячейки памяти с адресом addr (рис. 2.6.3, а). В команде используется указатель prt = @addr. Изменением содер­жимого (addr) ячейки можно модифицировать исполнительный адрес. Недостат­ком абсолютной адресации является двойное обращение к памяти данных DSEG и большая разрядность косвенного адреса, поэтому она не находит практическо­го применения.

Косвенная регистровая адресация (prt  =  @reg) отличается от абсолютной ад­ресации тем, что для хранения адреса ЕА операнда вместо памяти данных ис­пользуется регистр (рис. 2.6.3, б). Примеры:

●     явная форма адресации

CLR@reg                             ; очистка ячейки памяти, адрес которой находится

                                               ; в регистре reg

●     неявная форма адресации

LDAXB                                ; загрузка аккумулятора А содержимым,

                                               ; находящимся в регистровой паре ВС

 

Косвенная регистровая адресация портов (prt = @reg. В этом случае в поле операнда указывается регистр, содержащий адрес порта (рис. 2.6.3, б), однако назначением служит порт IOSEG и используются команды ввода/вывода:

IN @reg                     ; пересылка операнда в аккумулятор А из порта,

                                    ; адрес которого находятся в регистре reg OUT @reg       

                                    ; пересылка операнда из аккумулятора А в порт,

                                    ; адрес которого находится в регистре reg

Достоинство. Команды косвенно–регистровой адресации имеют неболь­шой размер, так как в них указываются только номер регистра, используемого в качестве адресного.

Недостаток. Выборка операнда (операции чтения из основной памяти или запись в нее) требует выполнения циклов передачи по системной шине, что за­медляет выполнение программы.

Применение. В микропроцессорах используются различные варианты косвенно–регистровой адресации.

Автоинкрементная и автодекрементная адресация. Суть способов. Ис­полнительный адрес ЕА формируется автоматически путем увеличения или уменьшения содержимого регистра с определенным шагом, длина которого рав­на числу N байтов в адресуемом операнде. Например, команда MOVB адресуется к операнду длиной в один байт, поэтому N = 1.

Реализация способов. Рассмотрим некоторые возможные варианты реа­лизации способа.

Постинкрементная адресация (рис. 2.6.4, а). Содержимое регистра, хранящего адрес ЕА, автоматически увеличивается на N после его выборки — prt = (reg)+, например:

рис. 2.6.4

MOVB А, (reg)+      ; А <— (reg), reg <— reg + 1 — в аккумулятор А

                                   ; загружается содержимое ячейки памяти, адрес

                                   ; которой хранится в регистре reg, после чего

                                   ; содержимое reg увеличивается на единицу.

Предекрементная адресация (рис. 2.6.4, б). Содержимое регистра, хранящего адрес ЕА, автоматически уменьшается на длину операнда N до его выборки —

prt = –(reg), например:

MOVB А, –(reg)        ; reg <— reg – 1, А <— (reg) — содержимое reg

                         ; уменьшается на единицу, после чего в аккумулятор

                         ; загружается содержимое ячейки памяти,

                         ; адрес которой содержится в регистре reg.

Эти варианты автоинкрементной и автодекрементной адресации могут быть использованы для работы со (стандартным) стеком, который заполняется в сторону уменьшения адресов:

MOV –(reg), scr       ; загрузка в стек содержимого источника scr;

MOV dst, (reg)+      ; выталкивание содержимого стека в приемник dst.

где источником и приемником являются внутренние регистры процессора.

При этом для доступа к вершине стека можно использовать косвенную адре­сацию: MOV dst, @геg.

В специальных стековых командах микропроцессоров используется неявная форма предекрементной и постинкрементной адресации:

PUSHsrc                 ; –(SP) <— src. Загрузка стека

POPdst                    ; dst <— (SP)+. Освобождение стека

Согласованность операций доступа с операцией выборки объектного кода, а также прямая адресуемость вершины стека TOS по содержимому указателя SP определили широкое использование предекрементной и постинкрементной адре­сации для организации стандартного стека микропроцессорных систем.

Приведенные варианты ин/декрементной адресации требуют размещения на­чального значения исполнительного адреса ЕА в команде, что увеличивает ее длину. Если исполнительный адрес ЕА хранить во внутреннем регистре процессо­ра, то получим следующие два варианта адресации:

косвенная постинкрементная адресация (рис. 2.6.5, а) — prt = @(reg)+;

●  косвенная предекрементная адресация (рис. 2.6.5, б) — pit = @–(reg).

рис. 2.6.5

Возможны также варианты преинкрементной (prt = + (reg); prt = @ + (reg) и пост­декрементной (prt = (reg)–; prt = @(reg)–) адресации. Отличительная особенность преинкрементной адресации — увеличение исполнительного адреса ЕА до вы­борки операнда.

При постдекрементной адресации происходит уменьшение ЕА после вы­борки операнда. Совместное использование преинкрементной и постдекремент­ной адресации позволяет организовать стек с загрузкой в сторону увеличения

адресов.

Применение. Рассмотренные способы адресации находят широкое приме­нение при обработке массивов данных и в стековых операциях.

Базовая адресация. Суть способа. Переменный адрес блока данных (база) располагается в базовом регистре breg (ВХ, BP), а известный относитель­ный адрес (index — индекс) элемента памяти — в коде команды, т. е. указатель

prt = (breg), index.

Короткий индекс (|index| ≤ |EA| воспринимается как смещение без знака (offset) либо со знаком (disp). Во втором случае можно адресоваться относительно базы в обе стороны.

рис. 2.6.6

Реализация способа. Этот способ позволяет сформировать исполни­тельный адрес (рис. 2.6.6)

ЕА = (breg) + index,

где (breg) — содержимое ячейки памяти, адрес которой указан в базовом регист­ре breg; index — индекс, который хранится в объектном коде.

Применение. Адресация по базе используется для организации доступа к конкретным элементам динамического блока данных, когда его размещение в памяти не остается постоянным и даже может быть неизвестным при создании программы. Способ находит применение для передачи операндов блока (базовый регистр breg служит указателем блока) и данных через стек (базовый регистр яв­ляется указателем кадра FP); для передачи данных и организации перехода в программах, не зависящих от места их размещения в памяти (базовый регистр указывает на начало программы).

Индексная адресация. Суть способа. Известный базовый адрес (base) блока данных располагается в коде команды, а переменный адрес вызываемых из памяти элементов блока — в индексном регистре (ireg), т. е. указатель ptr = base, (ireg). Отличительной особенностью индексной адресации является то, что в объектном коде должен хранится полный адрес памяти, а в качестве ireg может быть использован регистр меньшей длины (обычно SI, DI).

рис. 2.6.7

Реализация способа. При этом способе адресации (рис. 2.6.7) испол­нительный адрес определяется по формуле:

ЕА = base + (ireg),

где base — база, значение которой хра­нится в объектном коде; (ireg) — содер­жимое индексного регистра ireg.

Адрес элементов блока (индекс) яв­ляется переменным и вычисляется по ходу программы. При |ireg| = |ЕА| индекс­ная адресация включает адресацию по базе. По этой причине базовую адреса­цию часто называют индексной.

В случае нулевой базы индексная адресация с полноразмерным индексом со­впадает с косвенной, тогда регистр косвенной адресации называется индексным.

Применение. Индексная адресация применяется при последовательном доступе к элементам блока (массив, таблица, очередь), адрес (база) размещения которого известен.

Относительная адресация. Суть спо­соба. Переменный адрес блока данных (база) располагается в базовом регистре breg в каче­стве которого используется программный счетчик РС, а известный относительный адрес (.disp — смещение) элемента памяти — в коде команды, т. е. указатель prt  = .disp (или d8, d16).

Реализация способа. Этот способ (рис. 2.6.8) является разновидностью адресации по базе. Пример команды с относительной адресацией:

рис. 2.6.8

MOV reg,  .disp            ; reg <(PC + disp) — загрузка регистра с адресом reg

                                       ; содержимым ячейки памяти, адрес которой 

                                       ; равен сумме значений счетчика PC и смещения disp.

Применение. Относительная адресация используется для создания пози­ционно–независимых программ, исполнение которых не зависит от их размещения в памяти.

Комбинированные способы адресации. К комбинированным способам следует отнести базово–индексную адресацию (рис. 2.6.9), при кото­рой исполнительный адрес ЕА образуется путем сложения содержимого базового (BX, BP) и индексного регистров (SI, DI).

рис. 2.6.9

Каждому из приведенных выше трех последних способов адресации соответствует вариант косвенной адресации:

@(breg).index         Косвенная адресация по базе;

@base(ireg)             Косвенная индексная адресация;

@.disp                      Косвенная относительная

В табл. 2.6.1 приведены наиболее распространенные способы адресации.

табл 2.6.1

табл 2.6.1-2

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

Прямая адресация памяти. При этом способе адресации назначение (фиксированный адрес) задается как:

●     селектор:смещение, если следующая команда находится вне текущего сегмен­та кода — далекая, или межсегментная ссылка (FAR). Например, при вызове подпрограммы (команда CALL) новые значения CSMP формируются путем за­грузки селектора в сегментный регистр кода CS и смещения в программный счетчик, или указатель команды IP. При вызовах подпрограмм в стеке сохра­няется пара CS:IP;

●     смещение, если следующая команда находится в пределах текущего сегмен­та кода — близкая, или внутрисегментная ссылка (NEAR). В этом случае пе­редача управления связана с изменением только содержимого IP, которое со­храняется в стеке при вызове подпрограммы.

Косвенная адресация. Этот способ действует следующим образом (рис. 2.6.10). В основной памяти в виде массивов хранятся таблицы указателей, каждый из которых определяет адрес назначения. При поступлении команды вызова или перехода (CALL, JMP) в процессоре формируется адрес обращения к памяти для выбора требуемого указателя. Выбранный указатель автоматически загружается в программный счетчик IP, для выполнения следующей команды.

рис. 2.6.10

Косвенно–регистровая адресация. При этом способе адресации код следующей команды хранится во внутреннем регистре процессора и при не­обходимости загружается в указатель команд IP. Он используется (сравнительно редко) для вызова динамических указателей назначений.

Способы адресации микропроцессора 8080. В микропроцессоре исполь­зуется пять различных способов адресации. Рассмотрим каждый из них, иллюст­рируя на примере загрузки аккумулятора А данными D.

Непосредственная адресация. При этом способе адресации не требуется указания какого–либо адреса для выборки данных из памяти (оперативного запоминаю­щего устройства — ОЗУ), так как они разме­щаются в самой команде (во втором или во втором и третьем байтах).

На рис. 2.6.11 показана загрузка аккумуля­тора А вторым байтом B2 = D с помощью ко­манды: MVI dst, В2, где dst = А.

рис. 2.6.11

Ссылка (показана стрелкой) на аккуму­лятор содержится в коде операции КО ко­манды, хранящейся в регистре команд РК.

Прямая адресация. При прямом способе адресации младший байт адреса АM содержится во втором байте команды В2, а старший байт адреса АC — в третьем байте В3. Адресный код АCАM помещается в регистровую пару WZ и выводится на адресную  шину через регистр адреса. Этот способ используется для адресации внешней  памяти и устройств. Его недостаток — большие затраты времени, так как длина   команды составляет три байта.

Команда LDA addr  загрузки аккумулятора А операндом D, хранящимся а ячейке ОЗУ с адресом АCАM, исполняется в такой последовательности (рис. 2.6.12):

●     первый байт команды В1, содержащий код операции КО, загружается в РК;

●     второй В2 = АMи третий В3 = АC байты записываются в регистры W  и Z (указывает код операции КО);

●     по выставленному на адресной шине коду АCАM данные из ячейки ОЗУ пе­реписываются в аккумулятор А.

рис. 2.6.12

Команда выполняется за четыре машинных цикла.

Косвенно–регистровая адресация. При необходимости многократ­ного обращения к какой–либо ячейке памяти ее адрес удобнее хранить во внут­ренних регистрах микропроцессора.

Для адресации к ячейке в этом случае необходимо указать номер внутреннего регист­ра, в котором хранится адрес. Для хранения 16–разрядных адресов используются регист­ровые пары ВС, DЕ, НL и указатель стека SР. Пары кодируются (ВС —> 00, DЕ —> 01, HL —>10, SР —> 11). Код регистровой пары размещает­ся в адресной части однобайтных команд, ко­торые выбираются за один машинный цикл и поэтому требуют меньше временных затрат. Исполнение той же операции загрузки акку­мулятора данными D из ячейки ОЗУ с адре­сом АCАM (хранящимся в регистровой паре DЕ) показано на рис. 2.6.13.

рис. 2.6.13

Регистровая и регистрово–косвенная адресация. Если подле­жащие обработке данные размещены во внутренних регистрах микропроцессора, то для адресации к ним достаточно указать двоичные коды R регистров (табл. 2.6.2) в первом байте команды. К внутренним регистрам помимо POH отнесены также аккумулятор А и ячейка внешней памяти М, адрес которой хранится в регистро­вой паре HL.

табл 2.6.2

Обращение к регистрам В, С, D, Е, Н, L, А называется регистровой адресаци­ей, а к ячейке М — регистрово–косвенной адресацией. Использование обоих ви­дов регистровой адресации для загрузки (с помощью команды MOV dst, src) акку­мулятора А данными D, хранящимися в регистре С и ячейке памяти М с адресом АCАM (находится в регистровой паре HL), проиллюстрировано на рис. 2.6,14, а, б. На выборку данных из ячейки ОЗУ затрачивается два машинных цикла.

рис. 2.6.14

 

Стековая адресация. При стековой адресации текущий адрес ячейки памяти хранится в указателе стека. Этот способ адресации является косвенным и отличается от ранее рассмотренных тем, что необходимость обращения к указа­телю стека следует непосредственно из кода операции команд работы со стеком.