Тема 3. Сегменты и сегментные регистры
Компьютерные программы, предназначенные для выполнения процессором, размещаются в оперативной памяти. Каждая команда программы храниться в памяти в форме двоичного кода. Для удобства чтения кодов команд, эти коды преобразуются в шестнадцатеричную систему счисления.
Команды компьютерных программ, представленные в двоичной или шестнадцатеричной системах счисления называются машинными кодами.
Для работы процессора необходимо, чтобы область памяти, выделенная компьютерной программе, была разделена на специализированные сегменты: сегмент команд, сегмент данных, сегмент стека и дополнительный сегмент. Определение сегментов должен делать программист при разработке компьютерной программы.
Информация о содержимом ячеек сегмента выводится на экран монитора в виде блока, который называется Дамп. Дамп содержит 16 строк, которые называются Параграфы. В каждом параграфе отображается содержимое 16 ячеек памяти в шестнадцатеричном формате. В каждой ячейке хранится 1 Байт информации, поэтому содержимое ячейки отображается двумя шестнадцатеричными цифрами.
1. Сегмент команд.
Сегмент команд содержит машинные коды команд, которые будут выполняться процессором. Обычно первая выполняемая команда программы находится в начале этого сегмента. Сегмент команд должен быть определен для любой компьютерной программы.
Начальный адрес сегмента команд, в котором размещаются команды программы, загружается в регистр CS процессора. Внутри сегмента все адреса ячеек памяти относительны к началу сегмента. Такие адреса называются относительными адресами или смещением от начала сегмента. Относительный адрес размещается в регистре IP. Двухбайтовое смещение может находится в пределах от 0000Н до FFFFH.
Физический адрес ячейки сегмента команд определяется по формуле:

При отладке программ программист может изменять значение в регистре CS, при этом процессор будет переводится на другой сегмент команд, т.е. на выполнение другой программы.
При отладке программ программист может изменять значение в регистре IP, при этом процессор будет переводится на выполнение другой команды в этой же программе.
2. Сегмент данных.
Сегмент данных содержит данные и константы, необходимые для работы программы. Сегмент команд должен быть определен для любой компьютерной программы, в которой используются входные данные и константы. Если для программы не требуется наличие исходных данных и констант, то сегмент данных можно не определять.
Начальный адрес сегмента данных, в котором размещаются константы, загружается в регистр DS процессора. Внутри сегмента все адреса ячеек памяти относительны к началу сегмента. Если процессор, выполняя конкретную команду, считывает данные из сегмента данных то относительный адрес ячейки-источника определяется в регистре SI. Если процессор, выполняя конкретную команду, записывает данные в сегмент данных то относительный адрес ячейки-приемника определяется в регистре DI. Физический адрес ячейки сегмента команд определяется по одной из формул:
ФА = DS.0 + SI , для режима чтения
ФА = DS.0 + DI , для режима записи
При отладке программ программист может изменять значение в регистре SI, при этом процессор будет переводится на чтение другой константы сегмента данных.
При отладке программ программист может изменять значение в регистре DI, при этом процессор будет переводится на запись данных в другую область сегмента данных.
3. Сегмент стека.
Сегмент стека используется при программных прерываниях, когда процессор прерывает выполнение основной программы и переходит на выполнение подпрограммы, а также при возврате из подпрограммы в основную программу. Сегмент стека должен быть определен для тех программ, в которых предусматривается организация программных прерываний. Если для программы не предусматривается режим программного прерывания, то сегмент стека можно не определять.
Начальный адрес сегмента стека, в котором размещается стековая память, загружается в регистр SS процессора. Внутри сегмента все адреса ячеек памяти относительны к началу сегмента. Относительный адрес определяется только для одной ячейки стека – вершины стека. Относительный адрес вершины стека размещается в регистре SP. Физический адрес вершины стека определяется по формуле:
ФА = SS.0 + BP + SP
При отладке программ программист может изменять значение в регистре BP, это позволяет при необходимости организовать несколько стеков с разными базовыми адресами для одной и той же программы.
При отладке программ программист может изменять значение в регистре SP, это позволяет при необходимости получить доступ к различным ячейкам стековой памяти.
4. Дополнительный сегмент.
Дополнительный сегмент используется как вторичный сегмент данных для хранения промежуточных данных, полученных в результате работы программы, и предназначенных для дальнейшего использования в процессе выполнения программы. Необходимость организации дополнительного сегмента в конкретной программе определяется программистом.
Начальный адрес дополнительного сегмента загружается в регистр ES процессора. Относительные адреса ячеек внутри дополнительного сегмента определяются аналогично как и в сегменте данных, с помощью регистров SI и DI. Физический адрес ячейки дополнительного сегмента определяется по одной из формул:
ФА = ES.0 + SI , для режима чтения
ФА = ES.0 + DI , для режима записи