Все, что до сих пор говорилось об адресации, относится к генерации так называемого смещения (offset) адреса. Смещение имеет 16-битовое значение. 8088 сегментирует память таким образом, что можно адресоваться к памяти большей чем 64K. В этом пункте будет показан способ сегмента у ии 8088.
Поскольку размер слова в микропроцессоре 8088 равен 16 бит, для него естественно генерировать адреса в 16 бит длиной. Это делает доступными для прямой адресации 2**16 элементов или 65 535 байт памяти.Однако для некоторых программ 64K ячеек памяти недостаточно. Поэтому фирма INTEL сконструировала 8088 для адресации 2**20 байт или одного мегабайта памяти.
Для получения 20-битовой адресации требуется еще четыре бита к имеющимся 16-ти. Добавочные 4 бита адресной информации берутся из сегментных регистров. Сегментные регистры сами имеют размер 16 бит. 8088 комбинирует 16-битовый адрес смещения и 16-битовый регистр сегмента как показано на Фиг.3.5. Процессор дополняет сегментный регистр 4-мя нулевыми битами, что составляет вместе полное 20-битовое значение. К расширенному значению сегмента процессор добавляет адрес смещения, определяемый через вычисление адреса. 20-битовый результат является указателем на исполнительный адрес.
ЪДДДДДДДДДї
і Сегмент і 0000
АДДДДДДДДДЩ
ЪДДДДДДДДДДДї
+ і Смещение і
АДДДДДДДДДДДЩ
----------------
ЪДДДДДДДДДДДДДДДДї
і20-битовый адресі
АДДДДДДДДДДДДДДДДЩ
Фиг.3.5 Вычисление адреса с сегментом и смещением
Каждая обращающаяся к памяти команда может сформировать только 16-битовый адрес операнда. В действительности процессор применяет этот адрес внутри определенного сегмента. Фиг. 3.6 иллюстрирует такой способ применения сегментации.
ЕДДДДДДДДДДДДДДДДДДґ ДДДДДВДДДДСегментный регистр
іі і і
іі і смещение
іі і і
Сегмент іГДДДДДДДДДДДДДДДДДДЕ ДДДДДБДДДДАдресуемая область
64К ГДДДДДДДДДДДДДДДДДДґ
іі і
іі і
іі і
ЕДДДДДДДДДДДДДДДДДДґ
і і
Фиг.3.6 Сегментация.
Начальный адрес сегмента всегда имеет нули в младших четырех битах. Адрес с этим свойством имеет каждая шестнадцатая ячейка памяти. Конструируя расположение данных в своей программе помните, что сегмент всегда должен приходиться на такую 16-битовую границу. Эти границы называются также границами параграфов.