КАТЕГОРИИ: Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748) |
Сегментирование адресов
Сегментированная модель памяти Для работы с оперативной памятью используются шина адреса и шина данных. Физически память устроена таким образом, что возможна адресация как 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. Сегментные префиксы.
Приведем примеры явного указания сегментных регистров. Предположим, требуется записать в регистр АХ содержимое ячейки памяти M, расположенной в сегменте команд. Использовать команду MOV AX,M нельзя, поскольку она воспримется как MOV AX, DS:M и потому запишет в АХ содержимое ячейки, имеющей смещение M, но находящейся в сегменте данных. Поэтому следует явно указать сегментный регистр, т.е. записать команду MOV AX, CS:M. Другой типичный случай – требуется работать с сегментом памяти, отличным от сегментов команд, данных и стека. В этом случае на начало сегмента устанавливается регистр ES и при ссылках на ячейки сегмента используется этот регистр, например: MOV AX, ES:M. Опускать префикс ES: нельзя, т.к. он не подразумевается по умолчанию.
Дата добавления: 2014-11-16; Просмотров: 1786; Нарушение авторских прав?; Мы поможем в написании вашей работы! Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет |