Шаг 6.
Сегменты
   
На этом шаге мы введем понятие сегмента и перечислим часто 
используемые сегменты.
   
Сегментом называется область,  которая начинается с адреса, кратного 16. 
При выполнении программы ЭВМ определяет 3 главных сегмента.
- Сегмент кодов. Он содержит машинные команды, которые будут выполняться. 
Обычно первая выполняемая команда находится в начале этого сегмента и операционная система 
(ОС) передает  управление по адресу данного сегмента для выполнения программы. Начальный 
адрес этого сегмента находится в регистре сегмента кодов (CS).
- Сегмент данных. Он содержит данные, константы, необходимые для работы программы.  
Его начальный адрес расположен в регистре сегмента данных  (DS).
- Сегмент стека. Стек содержит адреса возврата как для программы при  
возврате в операционную систему,  так и для вызовов подпрограмм при возврате в главную программу. 
Регистр сегмента стека (SS) адресует данный сегмент.
   
Есть еще один сегментный регистр - регистр дополнительного сегмента (ES) - который 
используется в специальных случаях. Все эти сегменты располагаются в шинном интерфейсе.

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

Рис.2. Смещение внутри сегмента
   
Рассмотрим пример использования сегментного регистра и смещения для вычисления 
реального физического адреса.
   
Пусть регистр сегмента данных содержит значение  045FH и некоторая команда обращается 
к ячейке памяти внутри сегмента данных со смещением 0032H.  Действительный адрес 
будет следующим:
           адрес в DS:   045F0H   ;
             смещение:    0032H   ;
       реальный адрес:   04622H   .
   
Замечание. 
Обратите внимание, что перед сложением содержимого сегментного регистра и смещения 
значение, расположенное в регистре DS, сдвигается на четыре разряда влево, 
что эквивалентно "приписыванию" слева нуля. Дело в том, что размер регистра 16 бит, 
и это позволяет хранить в нем только 4 шестнадцатеричных цифры. С другой стороны, адрес 
начала сегмента данных должен всегда оканчиваться нулем, так как он кратен 16. Поэтому "младший" 
нуль можно не хранить в регистре, но учитывать его при вычислении реального адреса.
   
На следующем шаге мы поговорим о регистрах.
Предыдущий шаг  Содержание
Содержание  Следующий шаг
Следующий шаг