Шаг 6.
Сегменты
На этом шаге мы введем понятие сегмента и перечислим часто
используемые сегменты.
Сегментом называется область, которая начинается с адреса, кратного 16.
При выполнении программы ЭВМ определяет 3 главных сегмента.
- Сегмент кодов. Он содержит машинные команды, которые будут выполняться.
Обычно первая выполняемая команда находится в начале этого сегмента и операционная система
(ОС) передает управление по адресу данного сегмента для выполнения программы. Начальный
адрес этого сегмента находится в регистре сегмента кодов (CS).
- Сегмент данных. Он содержит данные, константы, необходимые для работы программы.
Его начальный адрес расположен в регистре сегмента данных (DS).
- Сегмент стека. Стек содержит адреса возврата как для программы при
возврате в операционную систему, так и для вызовов подпрограмм при возврате в главную программу.
Регистр сегмента стека (SS) адресует данный сегмент.
Есть еще один сегментный регистр - регистр дополнительного сегмента (ES) - который
используется в специальных случаях. Все эти сегменты располагаются в шинном интерфейсе.
Рис.1. Размещение сегментов в памяти компьютера
Замечание.
Обратите внимание на тот факт, что сегмент стека "растет" сверху вниз, в то время, как
остальные сегменты "растут" снизу вверх.
Внутри программы все адреса памяти относительны к началу сегмента. Такие адреса
называются смещением от начала сегмента. Двухбайтовое смещение может быть в
пределах от 0000H до FFFFH (от 0 до 65535), поэтому емкость сегмента не
превосходит 64 Кб. Для обращения к любому адресу в программе компьютер складывает адрес,
находящийся в сегментном регистре, и смещение.
Рис.2. Смещение внутри сегмента
Рассмотрим пример использования сегментного регистра и смещения для вычисления
реального физического адреса.
Пусть регистр сегмента данных содержит значение 045FH и некоторая команда обращается
к ячейке памяти внутри сегмента данных со смещением 0032H. Действительный адрес
будет следующим:
адрес в DS: 045F0H ;
смещение: 0032H ;
реальный адрес: 04622H .
Замечание.
Обратите внимание, что перед сложением содержимого сегментного регистра и смещения
значение, расположенное в регистре DS, сдвигается на четыре разряда влево,
что эквивалентно "приписыванию" слева нуля. Дело в том, что размер регистра 16 бит,
и это позволяет хранить в нем только 4 шестнадцатеричных цифры. С другой стороны, адрес
начала сегмента данных должен всегда оканчиваться нулем, так как он кратен 16. Поэтому "младший"
нуль можно не хранить в регистре, но учитывать его при вычислении реального адреса.
На следующем шаге мы поговорим о регистрах.
Предыдущий шаг
Содержание
Следующий шаг