При выполнении тех или иных операций над данными в команде должна быть приведена информация о месте нахождения исходных операндов и размещения результата. Для этого используются различные способы адресации, позволяющие определить исполнительный адрес. Следует выделить:
? однокомпонентные способы адресации, при которых исполнительный адрес
задается единственным значением в команде;
? многокомпонентные способы адресации, при которых исполнительный адрес получается в результате суммирования содержимого двух и более источников адресов.
При кодировании адресной информации помимо способа адресации в команде указываются числовые данные. Способ адресации кодируется:
? в явной форме
, при которой используются специальные символы: # — непосредственная адресация; @ — косвенная адресация; % — регистровая адресация; (…)+, –(..) — постинкрементная и предекрементная адресация и др.;
? в неявной форме, при которой способ адресации передается в коде операции.
Дополнительная информация передается явно. Например:
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, а, б. На выборку данных из ячейки ОЗУ затрачивается два машинных цикла.
Стековая адресация.
При стековой адресации текущий адрес ячейки памяти хранится в указателе стека. Этот способ адресации является косвенным и отличается от ранее рассмотренных тем, что необходимость обращения к указателю стека следует непосредственно из кода операции команд работы со стеком.