Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Микропроцессорные средства и системы.doc
Скачиваний:
56
Добавлен:
13.11.2019
Размер:
15.2 Mб
Скачать

6.3. Организация памяти вм86

В МП ВМ86 существует два уровня представления памяти. На нижнем физическом уровне память организована в виде монолитного 1M-байтового блока 1М8, каждый байт которого может быть адресован отдельно. Такое пространство и его адрес называют линейными. В МП ВМ86 линейный адрес эквивалентен физическому, т. е. тому, который присутствует на адресной шине.

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

Для адресации блока в 1 Мбайт необходим 20-разрядный линейный адрес addr20. Однако программист оперирует не этими физическими адресами, а так называемыми логическими адресами. Каждый логический адрес—это пара sel: offset, состоящая из 16-разрядного селектора сегмента sel и 16-разрядного смещения внутри сегмента offset.

Множество логических адресов образует сегментированное адресное пространство логической памяти, состоящей из ряда изолированных друг от друга частей—сегментов. Селектор может рассматриваться как указатель сегмента. Всего возможно 216 логических сегментов. Каждый сегмент хранит функционально законченную часть объектного кода или отдельный набор данных к нему. Отдельный сегмент должен быть отведен для стека той или иной программы. В общем случае сегментированная память отображает модульную организацию программ, что может быть использовано для поддержки модульного программирования. Размер логического сегмента не фиксирован и зависит от его конкретного функционального назначения.

Второй компонент логического адреса—смещение—определяет расстояние от начала сегмента до объекта, расположенного внутри него. Разрядность данной компоненты определяет максимально возможный размер сегмента 64К байт. В целом объем логического пространства адресов составляет 4 Гбайт (Г = 230).

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

base20 = 16 • sel

Линейный адрес объекта формируется из логического как сумма базы сегмента и смещения объекта в нем:

addr20 = base20 + offset = 16 • sel + offset

Один и тот же линейный адрес представляется множеством логических адресов.

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

Сегментные регистры CS—ES выделяют в памяти объемом 1 Мбайт четыре сегмента до 64К байт каждый. Сегменты выравнены по границе 16 байт (граница параграфа) и могут частично или полностью перекрываться друг с другом, как показано на рис. 6.3. Эти сегменты в отличие от остальных будем называть открытыми для доступа, вкладывая в это понятие тот смысл, что их селекторы хранятся в сегментных регистрах и, следовательно, доступ к ним открыт.

Рис. 6.3. Схема преобразования адресов

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

Регистр CS служит для указания кодового сегмента, который хранит объектный код. Содержимое CS используется для определения базы сегмента всякий раз, когда выполняется выборка объектного кода. При этом смещением в сегменте выступает значение программного счетчика IP.

При обращении к стеку (offset = SP) селектор извлекается из регистра SS. Поэтому указываемый им сегмент называется стековым и служит для организации системного стека.

Данные обычно располагаются в основном сегменте данных, база которого хранится в DS. Смещение offset в сегменте определяется одним из традиционных способов формирования исполнительного адреса.

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

При обработке строк регистр DS служит указателем сегмента исходной строки, смещение в сегменте извлекается из индексного регистра SI. При этом результирующая строка размещается в дополнительном сегменте данных, указателем которого служит ES. Смещение строки-результата определяется по содержимому DI. Одновременное применение двух сегментов позволяет реализовать эффективную передачу данных между сегментами.

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

Таблица 6.1

Вид обращения к памяти

Селектор

по умолчанию

Возможные

варианты

Смещение offset

Выборка команды

Обращение к стеку

Обращение к переменной кроме нижеуказанных

Обращение к переменной по базе ВР

Обращение к исходной строке

Обращение к результирующей строке

CS

SS

DS

SS

DS

ES

CS, ES, SS

CS, ES, DS

CS, ES, SS

Исполнительный адрес

Исполнительный адрес

SI

DI

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