Начальные сведения.
Работу процессора можно представить как непрерывную последовательность исполняемых им команд. Для выполнения каждой команды процессор должен знать:
? какие данные потребуются (и потребуются ли) для исполнения команды, где находятся нужные данные и как их вызвать;
? где искать следующую команду.
Поэтому возникает задача адресации данных и команд. Часть (возможно, все) из требуемых сведений содержится в команде, некоторые сведения поступают в процессе ее исполнения.
В дальнейшем основное внимание уделено адресации данных по следующей причине. При выполнении линейной части программы, когда команды расположены в памяти одна за другой, для их выборки из памяти используется программный счетчик (указатель команд), т. е. адресация полностью возлагается на аппаратные средства и адрес следующей команды в текущей команде не указывается. Необходимость указания адреса следующей команды в текущей возникает при передаче управления подпрограмме (процедуре), расположенной в другом месте памяти. Такие случаи встречаются реже и для их реализации предусмотрен набор команд (
CALL
,
JMP
,
RET
и др.), предназначенный специально для управления программой.
В описании каждой команды должны быть указаны адреса мест расположения исходных операндов (источников), задействованных при выполнении операции, и адрес места расположения операнда результата операции (приемника). Источниками и приемниками операндов могут служить регистровая память
RSEG
(
Register
Segment
), память данных
DSEG
(
Date
Segment
) или порты ввода–вывода
IOSEG
(
Input
/
Out
Segment
).
Адрес, определяющий место расположения операнда при выполнении команды, будем называть исполнительным (эффективным) адресом (
Executive
Address
— ЕА), а способ формирования исполнительного адреса — способом адресации. Известны различные способы адресации, позволяющие:
? обеспечить не только эффективный доступ к структурированным данным (массивам, стекам, спискам, таблицам), но и перемещение программ при загрузке и выполнении;
? сократить длину программного кода и число обращений к магистрали;
? адресовать большой объем памяти при малой разрядности процессора.
Для формирования исполнительного адреса используются сведения, заложенные в команде. Сведения об адресе операнда могут быть представлены в двух формах: явной и неявной.
При явной форме сведения содержатся в адресном поле команды. Эта форма является более гибкой и эффективной, так как позволяет связывать с одной командой множество адресов. Однако ее использование приводит к увеличению длины кода команды.
При неявной форме сведений об адресе операнда исполнительный адрес заложен в именной части команды, т. е. место расположения одного или всех операндов определяется мнемоникой команды или кодом операции (
OPeration
Code
— ОРС). В этом случае для одной и той же операции с операндами, расположенными в другом источнике или приемнике, необходимо задавать другой код операции. Следовательно, использование неявной формы приводит к увеличению числа команд, выполняющих однотипную операцию.
На практике применяются обе формы представления адресной информации. Например, в команде
LDA addr
процессора
Z80,
выполняющей операцию загрузки аккумулятора содержимым ячейки памяти по указанному адресу, адрес операнда–источника
(addr)
задан в явной форме, а адрес приемника (аккумулятора) — в неявной.
Размещение данных в памяти.
Для адресации данных необходимо иметь представление о том, как они размещаются в основной памяти. Любой элемент данных находится внутри сегмента.
Расположение сегмента в памяти определяется:
? базовым адресом (базой), задающим начало сегмента;
? смещением, указывающим сдвиг элемента относительно начала сегмента. Пространство памяти всегда адресуется байтами, поэтому смещение равно числу байт от базового адреса сегмента.
Когда операнд занимает несколько смежных байт, его адресом считается смещение байте с наименьшим адресом. Слова (16–битные операнды) в линейной памяти занимают два любых соседних байта, причем:
? адрес слова может быть как четным, так и нечетным;
? в байте с младшим адресом хранится младшая часть слова;
? младший адрес является адресом всего слова.
Двойные слова (32–битные операнды) размещаются как два соседних слова. Младшее слово располагается по младшему адресу, его адрес служит адресом двойного слова (рис. 2.5.1).
Задание адреса операнда.
Программист оперирует не физическими, а логическими адресами, состоящими из 16–разрядного селектора сегмента (
sot
) и 16–разрядного смещения внутри сегмента (
offset
). Логический адрес записывается в виде
sel
:
offset
, например,
08AFh:0023h, C033h:940Bh, 0000h:0000h.
Селектор
можно рассматривать как указатель сегмента, обладающий возможностью вызова 216 логических сегментов. Для хранения селектора используются сегментные регистры.
Смещение,
определяющее позицию адресуемого байта в сегменте, позволяет адресовать все 64К байт сегмента. Смещение может быть задано в команде или быть содержимым указательных (в том числе программного счетчика) и индексных регистров. Полный объем логического пространства адресов (32 разряда) составляет 4 Г байт (1Г = 230).
Линейный адрес требуемого элемента памяти формируется из логического как сумма базы сегмента и смещения объекта в нем:
addr
20 =
base
20 +
offset
= 16 .
set
+
offset
Один и тот же линейный адрес можно представить множеством логических адресов.
Для организации доступа к основной памяти используются специальные регистры, позволяющие выделить в памяти объемом 1М байт четыре сегмента до 64К байт каждый: кодовый сегмент
CS
, стековый сегмент
SS
, основной
DS
и дополнительный
ES
сегменты данных. Сегменты выровнены по границе 16 байт и могут перекрываться друг с другом.
Функциональная специализация сегментов. Позволяет использовать неявный способ задания селектора адреса операнда, при котором указывается мнемоника регистра и задается смещение, например,
ES
:383
D
,
CS
:05
F
,
DS
:2375 и
SS
:65
D
. При таком способе определения адреса операнда уменьшается разрядность команды, так как селектор задан не 16 битами, всего лишь двумя битами (кодом соответствующего сегментного регистра).
Сегментирование памяти позволяет:
? создавать позиционно независимые и динамически перемещаемые программные модули;
? осуществлять все смешения и переходы в программе относительно неизвестных, но строго фиксированных значений, задаваемых селекторами сегментных регистров.
Средства адресации.
Ниже приведены (стандартные) средства обеспечения
доступа к адресуемому байту:
? для указания кодового сегмента, в котором хранится объектный код, служит регистр
CS
. При выборке объектного кода содержимое
CS
используется для определения начала сегмента
(sel
=
CS),
смещением в сегменте служит значение (содержимое) программного счетчика
(offset =
PC
или
IP
);
? для извлечения стекового сегмента, предназначенного для сохранения состояния процессора при выполнении подпрограмм, используется регистр
SS
(sel
=
SS).
Смещение задается указателем стека
SP
(
offset
=
SP
);
? для доступа к сегменту
DS,
в котором обычно располагаются данные, используется регистр
DS (sel
=
DS).
Смещение в сегменте определяется одним из рассмотренных ниже способов формирования исполнительного адреса
(offset
= ЕА).
Отметим некоторые особенности использования средств:
? при передаче параметров через текущий кадр системного стека указателем сегмента служит
SS,
а в качестве указателя кадра
(FP)
используется адресный регистр
BP
;
? при обработке строк задействованы два регистра
DS
и
ES:
• при обращении к исходной строке регистр данных
DS
служит указателем сегмента
DS
исходной строки» смещение в сегменте извлекается из индексного регистра–источника
SI;
• при размещении результирующей строки в дополнительном сегменте данных
(ES)
регистр
ES
служит указателем. Смещение строки–результата определяется по содержимому индексного регистра–назначения
DI
.
Одновременное применение двух регистров позволяет реализовать эффективную передачу данных между сегментами.
В табл. 2.5.1 приведены используемые по умолчанию средства выбора сегментных регистров. В ряде случаев возможна замена сегментного регистра данных и стека, которая реализуется явным указанием сегментного регистра с помощью специального байта–префикса, предшествующего команде.
Выборка команды, обращение к стеку и размещение результирующей строки всегда выполняется с помощью регистров
CS,
SS
и
ES
соответственно.
В универсальных процессорах достигается компромисс в выборе средств адресации:
? наиболее часто требуемые и используемые способы адресации реализуются аппаратными средствами. Обычно для реализации базового способа адресации требуется один такт синхронизации;
? способы адресации, которые требуются редко или являются сложными, моделируются несколькими командами.