Шаг 6.
Сегменты

    На этом шаге мы введем понятие сегмента и перечислим часто используемые сегменты.

    Сегментом называется область, которая начинается с адреса, кратного 16. При выполнении программы ЭВМ определяет 3 главных сегмента.

  1. Сегмент кодов. Он содержит машинные команды, которые будут выполняться. Обычно первая выполняемая команда находится в начале этого сегмента и операционная система (ОС) передает управление по адресу данного сегмента для выполнения программы. Начальный адрес этого сегмента находится в регистре сегмента кодов (CS).
  2. Сегмент данных. Он содержит данные, константы, необходимые для работы программы. Его начальный адрес расположен в регистре сегмента данных (DS).
  3. Сегмент стека. Стек содержит адреса возврата как для программы при возврате в операционную систему, так и для вызовов подпрограмм при возврате в главную программу. Регистр сегмента стека (SS) адресует данный сегмент.

    Есть еще один сегментный регистр - регистр дополнительного сегмента (ES) - который используется в специальных случаях. Все эти сегменты располагаются в шинном интерфейсе.


Рис.1. Размещение сегментов в памяти компьютера


    Замечание. Обратите внимание на тот факт, что сегмент стека "растет" сверху вниз, в то время, как остальные сегменты "растут" снизу вверх.

    Внутри программы все адреса памяти относительны к началу сегмента. Такие адреса называются смещением от начала сегмента. Двухбайтовое смещение может быть в пределах от 0000H до FFFFH (от 0 до 65535), поэтому емкость сегмента не превосходит 64 Кб. Для обращения к любому адресу в программе компьютер складывает адрес, находящийся в сегментном регистре, и смещение.


Рис.2. Смещение внутри сегмента


    Рассмотрим пример использования сегментного регистра и смещения для вычисления реального физического адреса.

    Пусть регистр сегмента данных содержит значение 045FH и некоторая команда обращается к ячейке памяти внутри сегмента данных со смещением 0032H. Действительный адрес будет следующим:

           адрес в DS:   045F0H   ;
             смещение:    0032H   ;
       реальный адрес:   04622H   .


    Замечание. Обратите внимание, что перед сложением содержимого сегментного регистра и смещения значение, расположенное в регистре DS, сдвигается на четыре разряда влево, что эквивалентно "приписыванию" слева нуля. Дело в том, что размер регистра 16 бит, и это позволяет хранить в нем только 4 шестнадцатеричных цифры. С другой стороны, адрес начала сегмента данных должен всегда оканчиваться нулем, так как он кратен 16. Поэтому "младший" нуль можно не хранить в регистре, но учитывать его при вычислении реального адреса.

    На следующем шаге мы поговорим о регистрах.


Предыдущий шаг Содержание Следующий шаг