Адресация в микропроцессоре. Способы и виды.

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

однокомпонентные способы адресации, при которых исполнительный адрес

задается единственным значением в команде;

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

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

● в явной форме

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

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

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

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, б) используется указатель

prt =

port, где

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

IOSEG

. Для доступа к данным используются специальные команды, например:

IN

port

; загрузка аккумулятора из порта

OUT

port

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

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

Достоинство.

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

Недостатки.

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

Применение.

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

Регистровая адресация.

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

регистра микропроцессора, адрес

(reg)

которого указан в команде

(ptr

=

reg).

Этот способ отличается от прямого способа тем, что:

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

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

A

,

Rn).

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

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

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

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

Реализация способа.

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

MOV reg,

addr

;reg <

(addr)

— загрузка в регистр содержимого

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

addr

NEG reg

;

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

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

IDA

addr

; А

<

— (

addr

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

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

addr

.

Достоинства.

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

Недостаток.

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

Применение.

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

Косвенная и косвенно–регистровая адресация.

Суть способа. Адрес операнда содержится в основной памяти или регистре, т.е. указан в команде косвенно (

prt

= @

addr

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

Реализация способа.

Различают следующие разновидности косвенной

адресации.

Косвенная

абсолютная адресация, при которой исполнительный адрес ЕА операнда определяется содержимым (

addr

) ячейки памяти с адресом

addr

(рис. 2.6.3, а). В команде используется указатель

prt

= @

addr

. Изменением содер­жимого (

addr

) ячейки можно модифицировать исполнительный адрес. Недостат­ком абсолютной адресации является двойное обращение к памяти данных

DSEG

и большая разрядность косвенного адреса, поэтому она не находит практическо­го применения.

Косвенная регистровая

адресация (

prt

= @

reg

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

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

CLR@reg

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

; в регистре

reg

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

LDAX

B

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

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

Косвенная регистровая адресация

портов (

prt

= @

reg

. В этом случае в поле операнда указывается регистр, содержащий адрес порта (рис. 2.6.3, б), однако назначением служит порт

IOSEG

и используются команды ввода/вывода:

IN

@

reg

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

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

reg

OUT

@

reg

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

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

reg

Достоинство.

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

Недостаток.

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

Применение.

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

Автоинкрементная и автодекрементная адресация.

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

MOVB

адресуется к операнду длиной в один байт, поэтому N = 1.

Реализация способов.

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

Постинкрементная адресация

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

prt

=

(reg)+,

например:

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

.

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

PUSH

src

;

–(SP)

<—

src

. Загрузка стека

POP

dst

;

dst

<— (

SP

)+. Освобождение стека

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

TOS

по содержимому указателя

SP

определили широкое использование предекрементной и постинкрементной адре­сации для организации стандартного стека микропроцессорных систем.

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

косвенная постинкрементная адресация (рис. 2.6.5, а) —

prt =

@(reg)+;

косвенная предекрементная адресация (рис. 2.6.5, б) —

pit

= @–(

reg

).

Возможны также варианты преинкрементной (

prt

= + (

reg

);

prt

= @ + (

reg

) и пост­декрементной (

prt

= (

reg

)–;

prt

= @(

reg

)–) адресации. Отличительная особенность преинкрементной адресации — увеличение исполнительного адреса ЕА до вы­борки операнда.

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

адресов.

Применение.

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

Базовая адресация.

Суть способа. Переменный адрес блока данных (база) располагается в базовом регистре

breg

(ВХ,

BP

), а известный относитель­ный адрес (

index

— индекс) элемента памяти — в коде команды, т. е. указатель

prt

= (

breg

),

index

.

Короткий

индекс (|

index

| ≤ |

EA

| воспринимается как смещение без знака (

offset

) либо со знаком (

disp

). Во втором случае можно адресоваться относительно базы в обе стороны.

Реализация способа.

Этот способ позволяет сформировать исполни­тельный адрес

(

рис

.

2.6.6)

ЕА = (

breg

) +

index

,

где (

breg

) — содержимое ячейки памяти, адрес которой указан в базовом регист­ре

breg

;

index

— индекс, который хранится в объектном коде.

Применение.

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

breg

служит указателем блока) и данных через стек (базовый регистр яв­ляется указателем кадра

FP

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

Индексная адресация.

Суть способа. Известный базовый адрес (

base

) блока данных располагается в коде команды, а переменный адрес вызываемых из памяти элементов блока — в индексном регистре (

ireg

), т. е. указатель

ptr

=

base

, (

ireg

). Отличительной особенностью индексной адресации является то, что в объектном коде должен хранится полный адрес памяти, а в качестве

ireg

может быть использован регистр меньшей длины (обычно

SI

,

DI

).

Реализация способа.

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

ЕА =

base

+ (

ireg

),

где

base

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

ireg

) — содер­жимое индексного регистра

ireg

.

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

ireg

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

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

Применение.

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

Относительная адресация.

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

breg

в каче­стве которого используется программный счетчик РС, а известный относительный адрес (.

disp

— смещение) элемента памяти — в коде команды, т. е. указатель

prt

= .

disp

(или

d

8,

d

16).

Реализация способа.

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

MOV reg,

.disp

;

reg <

(PC

+

disp)

— загрузка регистра с адресом

reg

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

; равен сумме значений счетчика

PC

и смещения

disp.

Применение.

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

Комбинированные способы адресации.

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

BX

,

BP

) и индексного регистров (

SI

,

DI

).

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

@(

breg

).

index

Косвенная адресация по базе;

@

base

(

ireg

)

Косвенная индексная адресация;

@.

disp

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

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

Особенности адресации команд.

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

CALL

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

Прямая адресация памяти.

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

селектор:смещение, если следующая команда находится вне текущего сегмен­та кода — далекая, или межсегментная ссылка (

FAR

). Например, при вызове подпрограммы (команда

CALL

) новые значения

CSMP

формируются путем за­грузки селектора в сегментный регистр кода

CS

и смещения в программный счетчик, или указатель команды

IP

. При вызовах подпрограмм в стеке сохра­няется пара

CS

:

IP

;

смещение, если следующая команда находится в пределах текущего сегмен­та кода — близкая, или внутрисегментная ссылка (

NEAR

). В этом случае пе­редача управления связана с изменением только содержимого

IP

, которое со­храняется в стеке при вызове подпрограммы.

Косвенная адресация.

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

CALL

,

JMP

) в процессоре формируется адрес обращения к памяти для выбора требуемого указателя. Выбранный указатель автоматически загружается в программный счетчик

IP

, для выполнения следующей команды.

Косвенно–регистровая адресация.

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

IP

. Он используется (сравнительно редко) для вызова динамических указателей назначений.

Способы адресации микропроцессора 8080.

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

D.

Непосредственная адресация.

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

На рис. 2.6.11 показана загрузка аккумуля­тора А вторым байтом

B2 = D

с помощью ко­манды:

MVI dst,

В2, где

dst

= А.

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

Прямая адресация.

При прямом способе адресации младший байт адреса А

M

содержится во втором байте команды В2, а старший байт адреса А

C

— в третьем байте В3. Адресный код А

C

А

M

помещается в регистровую пару

WZ

и выводится на адресную шину через регистр адреса. Этот способ используется для адресации внешней памяти и устройств. Его недостаток — большие затраты времени, так как длина команды составляет три байта.

Команда

LDA

addr

загрузки аккумулятора А операндом

D

, хранящимся а ячейке ОЗУ с адресом А

C

А

M

, исполняется в такой последовательности (рис. 2.6.12):

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

● второй В2 = А

M

и третий В3 = А

C

байты записываются в регистры

W

и

Z

(указывает код операции КО);

● по выставленному на адресной шине коду А

C

А

M

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

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

Косвенно–регистровая адресация.

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

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

D

Е, Н

L

и указатель стека

S

Р. Пары кодируются (ВС —> 00,

D

Е —> 01,

HL

—>10,

S

Р —> 11). Код регистровой пары размещает­ся в адресной части однобайтных команд, ко­торые выбираются за один машинный цикл и поэтому требуют меньше временных затрат. Исполнение той же операции загрузки акку­мулятора данными

D

из ячейки ОЗУ с адре­сом А

C

А

M

(хранящимся в регистровой паре

D

Е) показано на рис. 2.6.13.

Регистровая и регистрово–косвенная адресация.

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

R

регистров (табл. 2.6.2) в первом байте команды. К внутренним регистрам помимо

POH

отнесены также аккумулятор А и ячейка внешней памяти М, адрес которой хранится в регистро­вой паре

HL.

Обращение к регистрам В, С,

D

, Е, Н,

L

, А называется регистровой адресаци­ей, а к ячейке М — регистрово–косвенной адресацией. Использование обоих ви­дов регистровой адресации для загрузки (с помощью команды

MOV

dst

,

src

) акку­мулятора А данными

D

, хранящимися в регистре С и ячейке памяти М с адресом А

C

А

M

(находится в регистровой паре

HL

), проиллюстрировано на рис. 2.6,14, а, б. На выборку данных из ячейки ОЗУ затрачивается два машинных цикла.

Стековая адресация.

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

Понравилась статья? Поделиться с друзьями:
Все об энергетике, электротехнике и электронике
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: