Для чего нужны сегментные регистры перечислите их
Перейти к содержимому

Для чего нужны сегментные регистры перечислите их

  • автор:

Сегментные регистры

В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs. Их существование обусловлено спецификой организации и использования оперативной памяти микропроцессорами Intel. Она заключается в том, что микропроцессор аппаратно поддерживает структурную организацию программы в виде трех частей, называемых сегментами. Соответственно, такая организация памяти называется сегментной.

Для того чтобы указать на сегменты, к которым программа имеет доступ в конкретный момент времени, и предназначены сегментные регистры. Фактически, с небольшой поправкой, как мы увидим далее, в этих регистрах содержатся адреса памяти с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов:

Сегмент кода. Содержит команды программы. Для доступа к этому сегменту служит регистр cs (code segment register) — сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор (то есть эти команды загружаются в конвейер микропроцессора).

Сегмент данных. Содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр ds (data segment register) — сегментный регистр данных, который хранит адрес сегмента данных текущей программы.

Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком. Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) — сегментный регистр стека, содержащий адрес сегмента стека.

Дополнительный сегмент данных. Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds. Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).

Регистры состояния и управления

В микропроцессор включены несколько регистров (см. рис. 1), которые постоянно содержат информацию о состоянии как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:

регистр флагов eflags/flags;

регистр указателя команды eip/ip.

Используя эти регистры, можно получать информацию о результатах выполнения команд и влиять на состояние самого микропроцессора. Рассмотрим подробнее назначение и содержимое этих регистров:

eflags/flags (flag register) — регистр флагов. Разрядность eflags/flags — 32/16 бит. Отдельные биты данного регистра имеют определенное функциональное назначение и называются флагами. Младшая часть этого регистра полностью аналогична регистру flags для i8086. На рис. 2 показано содержимое регистра eflags.

Рис. 2. Содержимое регистра eflags

Исходя из особенностей использования, флаги регистра eflags/flags можно разделить на три группы:

8 флагов состояния. Эти флаги могут изменяться после выполнения машинных команд. Флаги состояния регистра eflags отражают особенности результата исполнения арифметических или логических операций. Это дает возможность анализировать состояние вычислительного процесса и реагировать на него с помощью команд условных переходов и вызовов подпрограмм. В табл. 1 приведены флаги состояния и указано их назначение;

1 флаг управления. Обозначается df (Directory Flag). Он находится в 10-м бите регистра eflags и используется цепочечными командами. Значение флага df определяет направление поэлементной обработки в этих операциях: от начала строки к концу (df = 0) либо наоборот, от конца строки к ее началу (df = 1). Для работы с флагом df существуют специальные команды: cld (снять флаг df) и std (установить флаг df). Применение этих команд позволяет привести флаг df в соответствие с алгоритмом и обеспечить автоматическое увеличение или уменьшение счетчиков при выполнении операций со строками;

5 системных флагов, управляющих вводом/выводом, маскируемыми прерываниями, отладкой, переключением между задачами и виртуальным режимом 8086. Прикладным программам не рекомендуется модифицировать без необходимости эти флаги, так как в большинстве случаев это приведет к прерыванию работы программы. В табл. 2 перечислены системные флаги, их назначение.

Для чего нужны сегментные регистры перечислите их

Основные регистры процессоров

Обычно процессоры разделены на две части: операционное устройство (ОУ) и шинный интерфейс (ШИ). Роль ОУ заключается в выполнении команд, в то время как ШИ подготавливает команды и данные для выполнения. ОУ содержит АЛУ и устройство управления УУ и регистры общего назначения. Эти устройства обеспечивают выполнение команд, арифметические вычисления и логические операции (см. рис. 4.2).

Три элемента ШИ — блок управления шиной, очередь команд и сегментные регистры — осуществляют три важные функции:

1. ШИ управляет передачей данных на ОУ, в память и на внешние устройства ввода-вывода.

2. Сегментные регистры управляют адресацией памяти.

3. Выборка команд. Все программные команды находятся в памяти, и ШИ должен иметь доступ к ним для выборки их в очередь команд. ШИ должен «заглядывать вперед» и выбирать команды так, чтобы всегда существовала непустая очередь команд, готовых для выполнения.

ОУ и ШИ работают параллельно, причем ШИ опережает ОУ на один шаг. ОУ сообщает ШИ о необходимости доступа к данным в памяти или на устройство ввода-вывода. Кроме того, ОУ запрашивает машинные команды из очереди команд. Пока ОУ занято, ШИ выбирает следующую команду из памяти. Эта выборка происходит во время выполнения, что повышает скорость обработки.

Сегментные регистры

Сегментом называется область, которая начинается на границе параграфа, т.е. по любому адресу, кратному 16. Хотя сегмент может располагаться в любом месте памяти и иметь размер до 64 Кбайт, он требует столько памяти, сколько необходимо для выполнения программы.

Сегмент кодов ( CS ) содержит машинные команды, которые будут выполняться. Обычно первая выполняемая команда находится в начале этого сегмента и операционная система передает управление по адресу данного сегмента для выполнения программы. Регистр сегмента кодов ( CS ) адресует данный сегмент.

Сегмент данных ( DS ) содержит определенные данные, константы и рабочие области, необходимые программе. Регистр сегмента данных ( DS ) адресует данный сегмент.

Сегмент стека ( SS ) содержит адреса возврата как для программы при возврате в операционную систему, так и для вызовов подпрограмм при возврате в главную программу. Регистр сегмента стека ( SS ) адресует данный сегмент.

Еще один сегментный регистр — дополнительный регистр сегмента ( ES ) — предназначен для специального использования.

Сегментные регистры

В реальном режиме процессора при записи адреса ячейки в памяти используется формат СЕГМЕНТ:СМЕЩЕНИЕ, где СЕГМЕНТ — это номер сегмента (блока памяти), а СМЕЩЕНИЕ — это номер ячейки памяти относительно начала сегмента. Почему так повелось, я рассказал здесь. А в этой статье расскажу о сегментации памяти и сегментных регистрах.

Сегментация памяти

В реальном режиме используется сегментная модель памяти. Суть её заключается в том, что вся память разделена на блоки по 64 КБ. Эти блоки и называются сегментами. У каждого сегмента есть свой адрес. Например, нулевой сегмент имеет адрес 0000. В пределах каждого сегмента каждая ячейка памяти (а в одной ячейке памяти может храниться один байт) также пронумерована, но уже относительно сегмента. Например:

Обратите внимание на последний пример. Почему ячейка номер 21? Да потому что все числа в такой модели памяти представлены в шестнадцатеричной системе. То есть 15 в шестнадцатеричной — это 21 в десятичной.

Допустим, что у нас в разных сегментах записаны данные. Например, буквы:

Для каждого символа в памяти выделен один байт, и у каждого из этих байтов есть свой адрес. Мы можем прочитать байт, зная его адрес, или записать новое значение в этот адрес. В нашем примере, в сегментной модели памяти, у символов будут следующие адреса:

Конечно, в реальной программе никто не будет размещать одну строку в разных сегментах. Но это просто пример. Здесь мы знаем адрес каждого символа нашей строки. Мы можем прочитать из памяти отдельный символ, или записать по данному адресу другой символ, изменив таким образом строку. Например, если мы запишем в адрес 0020:0002 символ Г , то в памяти у нас будет:

Эта ячейка памяти смещена от начала сегмента на три байта. Но, поскольку нумерация начинается с 0 , то мы записываем букву в байт номер 2 от начала смещения.

Таким образом получается, что для работы с памятью в реальном режиме нам надо знать два числа: адрес сегмента и адрес смещения.

Сегментные регистры процессора

Для хранения адресов сегментов используются сегментные регистры: CS, DS, SS, ES. Эти регистры используются для обращения к сегментам данных. Смещения могут храниться в других регистрах (но не в любых).

  • Регистр CS (Code Segment — сегмент кода) используется для хранения сегмента кода программы. То есть в этом сегменте хранится код программы.
  • Регистр DS (Data Segment — сегмент данных) используется для хранения данных программы.
  • Регистр SS (Stack Segment — сегмент стека) используется для хранения сегмента стека.
  • Регистр ES — дополнительный регистр, который может хранить адрес любого сегмента (например, видеобуфера). Именно этот регистр наиболее часто используется в программах для работы с памятью.

Для примера попробуем записать в регистр ES адрес сегмента 0020:

Простое, казалось бы, решение. Но оно не работает! А всё почему? А потому что запись любого числа напрямую в сегментные регистры запрещена! Поэтому вместо одной команды приходится выполнять две:

то есть сначала записываем сегмент в регистр АХ, а только потом можно записать содержимое АХ в сегментный регистр.

На этом пока всё. Подключайтесь к группе Основы программирования в Телеграм, или к другим каналам (ссылки ниже), чтобы ничего не пропустить.

Сегментные регистры

Сегментные регистры используются при формировании линейных адресов памяти. Вторым компонентом для формирования линейного адреса является эффективным адресом (применительно к архитектуре IA-32 эти называния равноправны, хотя первое применяется намного чаще). Способ вычисления линейного адреса зависит от режима работы процессора и подробно описан в разделе Формирование линейного адреса .

В микропроцессоре 8086 было четыре 16-разрядных сегментных регистра:

  • CS — сегментный регистр кода;
  • DS — сегментный регистр данных;
  • ES — сегментный регистр дополнительных данных;
  • SS — сегментный регистр стека.

Начиная с микропроцессора 80386, сегментных регистров стало шесть, но их разрядность не изменилась. «Новичками» стали два сегментных регистра дополнительных данных — FS и GS.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *