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

Контрольные вопросы

  1. Опишите структуру команды на языке ассемблера.

  2. Приведите примеры объявления числовых и символьных данных на языке ассемблера.

  3. Перечислите допустимые операции над адресами.

  4. Приведите примеры адресных выражений.

4. Сегментированная модель памяти

4.1. Сегментирование адресов

Для работы с оперативной памятью используются шина адреса и шина данных. Физически память устроена таким образом, что возможна адресация как 16-битовых слов, так и отдельных байтов памяти. Ширина шины адреса определяет максимальный объём физической памяти, непосредственно адресуемой процессором. Из рассмотрения формата машинной команды становится понятно, что большой объем оперативной памяти ведет к увеличению размера команд. Для их уменьшения поступают следующим образом.

Оперативную память разделяют на логические участки – сегменты. Причем начальные адреса сегментов могут быть любыми, но размер любого сегмента не должен превосходить 2mячеек (m < k, k – разрядность шина адреса). Тогдаабсолютный(физический)адреснекоторой ячейки памяти A можно представить в виде суммы:

где B – база сегмента, к которому относится ячейка A, disp – относительный адрес ячейки, отсчитанный от начала сегмента (адреса В) или смещение(displacement).

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

Размер памяти в вычислительной системе на базе микропроцессора 8086 составляет 1 Мб, т.е. 220байтов (адреса 20-разрядные, k=20), а размер сегмен­тов не должен превышать 64 Кб, т.е. 216байтов (сме­щения 16-разрядные адреса, m=16). Адреса принято записывать в шестнадцатеричной форме, поэтому физические адреса для 20-разрядной шины адреса находятся в пределах:

00000h [физический адрес]FFFFFh

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

В качестве сегментных регистров можно использовать регистры CS, DS, SS и ES. Начальные адреса сегментов памяти можно хранить и в других регистрах, однако использовать их для сегментирования адресов не удастся.

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

Рис. 16. Схема формирования физического адреса.

Например, если адресом начала сегмента является число 12340h, то в сегментном регистре будет храниться величина 1234h. Процессор учитывает такую особенность и при сегментировании адреса к содержимому сегментного регистра добавляет справа 0 и затем прибавляет смещение, указанное в команде. Поскольку добавление справа нуля к шестнадцатеричному числу эквивален­тно умножению числа на 16, то формула вычисления абсолютного адреса по адресной паре CS:disp имеет вид:

При записи ко­манд на ассемблере конструкция вида:

<сегментный регистр>:<адресное выражение>

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

Логический адрес может находиться в пределах:

0000h:0000h <= [логический адрес] <= FFFFh:000Fh

На рис. 17 изображено все доступное адресное пространство оперативной памяти. Показан некоторый сегмент (он может относиться к сегменту кода, данных, стека или к дополнительному сегменту), расположенный по адресу 0010h. В самом сегменте указан адрес с помощью смещения 0120h. Таким образом, логический адрес 0010h:0120h соответствует физическому адресу 00120h.

Рис. 17. Соответствие физического адреса логическому.

Запись вида CS:, DS:, SS: и ES: принято называть префиксом сегментного регистра. Префикс указывается перед адресом, который должен быть просегментирован. С помощью префикса замены сегмента можно обратиться к операнду с использованием любого из четырёх сегментных регистров. Функциональное распределение сегментных регистров следующее (рис. 18).

Ре­гистр CS всегда должен указывать на начало сегмента команд. Адрес очередной подлежащей выполнению команды, указы­вается регистровой парой CS:IP. Указатель команд IP содержит смещение команды, отсчитанное от начала сегмента команд. Регистр DS должен указывать на начало сегмен­та данных, а SS – на начало сегмента стека. Регистр ES (а также позднее введенные FS и GS) может указывать на любой сегмент памяти. Например, инструкция MOV AX, [BP] загружает в регистр AX содержимое слова памяти по адресу SS:BP, однако, инструкция MOV AX, ES:[BP] загрузит содержимое слова по адресу ES:BP.

Рис. 18. Распределение памяти с помощью сегментных регистров.

Коды сегментных префиксов приведены в табл. 5. Вместо сегментного регистра DS может использоваться любой сегментный регистр, для чего необходимо задать соответствующий префикс замены сегмента. Доступ к стековой памяти с использованием указателя стека SP всегда подразумевает использование только сегментного регистра SS.

Табл. 5. Сегментные префиксы.

Код

Префикс

Описание

26

ES:

Использование сегмента ES.

2E

CS:

Использование сегмента CS.

36

SS:

Использование сегмента SS.

3E

DS:

Использование сегмента DS.

Приведем примеры явного указания сегментных регистров. Предположим, требуется записать в регистр АХ содержимое ячейки памяти M, расположенной в сегменте команд. Использовать команду MOV AX,M нельзя, поскольку она воспримется как MOV AX, DS:M и потому запишет в АХ содержимое ячейки, имеющей смещение M, но находящейся в сегменте данных. Поэтому следует явно указать сегментный регистр, т.е. записать команду MOV AX, CS:M.

Другой типичный случай – требуется работать с сегментом памяти, отличным от сегментов команд, данных и стека. В этом случае на начало сегмента уста­навливается регистр ES и при ссылках на ячейки сегмента используется этот регистр, например: MOV AX, ES:M. Опускать префикс ES: нельзя, т.к. он не подразумевается по умолчанию.