Тема 3.10. Сегментная структура программ

Важнейшей характеристикой любого микропроцессора (МП) является разрядность его внутренних регистров, а также внешних шин адресов и данных. МП Intel 8086 имеет 16-разрядную внутреннюю архитектуру и такой же разрядности шину данных. Таким образом, максимальное целое число (данное или адрес), с которым может работать микропроцессор, составляет 216–1 = 65535 (64К–1). Однако адресная шина МП 8086 содержит 20 линий, что соответствует адресному пространству 220 = 1 Мбайт. Для того, чтобы с помощью 16-разрядных адресов можно было обращаться в любую точку 20-разрядного адресного пространства, в микропроцессоре предусмотрена сегментная адресация памяти, реализуемая с помощью четырех сегментных регистров.

Сегментная организация памяти (segmentation) - схема распределения памяти в виде сегментов переменной длины, соответствующая пользовательской трактовке распределения памяти, т.е. логической структуре программ и данных. С точки зрения пользователя (разработчика программы), программа – это набор модулей кода и данных, каждому из которых должен соответствовать свой сегмент в памяти. Сегмент – логическая единица распределения памяти, предназначенная для размещения в памяти одного модуля программного кода или данных. Например, в виде сегментов памяти могут быть представлены:

- основная программа;

- процедура;

- функция;

- метод;

- объект;

- набор локальных переменных;

- набор глобальных переменных;

- общий блок данных (например, COMMON-блок в языке FORTRAN);

- стек;

- таблица символов;

- массив.

Суть сегментной адресации заключается в следующем, физический 20-разрядный адрес любой ячейки памяти вычисляется процессором путем сложения начального адреса сегмента памяти, в котором располагается эта ячейка, со смещением к ней (в байтах) от начала сегмента, которое иногда называют относительным адресом (рис. 27). Сегментный адрес без четырех младших битов, т.е. деленный на 16, хранится в одном из сегментных регистров. При вычислении физического адреса процессор умножает содержимое сегментного регистра на 16 и прибавляет к полученному 20-разрядному адресу относительный адрес. Умножение базового адреса на 16 увеличивает диапазон адресуемых ячеек до величины 64 Кбайт * 16 = 1 Мбайт.

Рис. 27 Образование физического адреса из сегментного адреса и смещения

Современные 32-разрядные процессоры Intel, в частности, процессоры Pentium, имеют 32-разрядную адресную шину, что соответствует адресному пространству 232= 4 Гбайт. Однако описанный выше способ сегментной адресации памяти не позволяет выйти за пределы 1 Мбайт. Для преодоления этого ограничения в 32-разрядных процессорах используются два режима работы: реального адреса (реальный режим) и виртуального защищенного адреса (защищенный режим). В реальном режиме процессор функционирует фактически так же, как МП 8086 с повышенным быстродействием и может обращаться лишь к 1 Мбайт адресного пространства. Оставшаяся память, даже если она установлена на компьютере, использоваться не может.

Итак, обращение к любым участкам памяти осуществляется исключительно посредством сегментов — логических образований, накладываемых на требуемые участки физического адресного пространства. Размер сегмента должен находиться в пределах 0 байт – 64 Кбайт (допустимы и иногда используются сегменты нулевой длины). Начальный адрес сегмента, деленый на 16, т.е. без младшей шестнадцатиричной цифры, заносится (как правило, программистом с помощью соответствующих программных строк) в один из сегментных регистров. При обращении к памяти процессор извлекает из сегментного регистра этот базовый адрес, умножает его на 16 и складывает с заданным каким-либо образом смещением, получая 20-разрядный физический адрес адресуемой ячейки памяти (слова или байта). Этот процесс проиллюстрирован на рис. 28.

Рис. 28 Формирование физического адреса

Поскольку младшая шестнадцатеричная цифра базового адреса сегмента должна быть равна 0, сегмент всегда начинается с адреса, кратного 16, т.е. на границе 16-байтового блока памяти (параграфа). Число, хранящееся в сегментном регистре, называют сегментным адресом. Следует помнить, что сегментный адрес в 16 раз меньше соответствуюшего ему физического адреса.

Наличие в микропроцессоре четырех сегментных регистров определяет структуру программы. В типичной, не слишком сложной программе имеются сегмент команд, сегмент данных и сегмент стека, которые адресуются с помощью сегментных регистров CS, DS и SS соответственно. Дополнительный сегментный регистр ES часто используется для обращения к полям данных, не входящим в программу, например к видеобуферу или системным ячейкам. Однако при необходимости его можно настроить и на один из сегментов программы. В частности, если программа работает с большим объемом данных, для них можно предусмотреть два сегмента и обращаться к одному из них через регистр DS, а к другому — через ES.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: