Перейти к содержимому

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

  • автор:

Регистры процессора

Начиная с модели 80386 процессоры Intel предоставляют 16 основных регистров для пользовательских программ и ещё 11 регистров для работы с мультимедийными приложениями (MMX) и числами с плавающей точкой (FPU/NPX). Все команды так или иначе изменяют содержимое регистров. Как уже говорилось, обращаться к регистрам быстрее и удобнее, чем к памяти. Поэтому при программировании на языке Ассемблера регистры используются очень широко.

В этом разделе мы рассмотрим основные регистры процессоров Intel. Названия и состав/количество регистров для других процессоров могут отличаться. Итак, основные регистры процессоров Intel.

Таблица 2.1. Основные регистры процессора.

Название Разрядность Основное назначение
EAX 32 Аккумулятор
EBX 32 База
ECX 32 Счётчик
EDX 32 Регистр данных
EBP 32 Указатель базы
ESP 32 Указатель стека
ESI 32 Индекс источника
EDI 32 Индекс приёмника
EFLAGS 32 Регистр флагов
EIP 32 Указатель инструкции (команды)
CS 16 Сегментный регистр
DS 16 Сегментный регистр
ES 16 Сегментный регистр
FS 16 Сегментный регистр
GS 16 Сегментный регистр
SS 16 Сегментный регистр

Регистры EAX, EBX, ECX, EDX – это регистры общего назначения. Они имеют определённое назначение (так уж сложилось исторически), однако в них можно хранить любую информацию.

Регистры EBP, ESP, ESI, EDI – это также регистры общего назначения. Они имеют уже более конкретное назначение. В них также можно хранить пользовательские данные, но делать это нужно уже более осторожно, чтобы не получить «неожиданный» результат.

Регистр флагов и сегментные регистры требуют отдельного описания и будут более подробно рассмотрены далее.

Пока для вас здесь слишком много непонятных слов, но со временем всё прояснится)))

Когда-то процессоры были 16-разрядными, и, соответственно, все их регистры были также 16-разрядными. Для совместимости со старыми программами, а также для удобства программирования некоторые регистры разделены на 2 или 4 «маленьких» регистра, у каждого из которых есть свои имена. В таблице 2.2 перечислены такие регистры.

Вот пример такого регистра.

Структура регистра EAX

Из этого следует, что вы можете написать в своей программе, например, такие команды:

MOV AX, 1 MOV EAX, 1

Обе команды поместят в регистр AX число 1. Разница будет заключаться только в том, что вторая команда обнулит старшие разряды регистра EAX, то есть после выполнения второй команды в регистре EAX будет число 1. А первая команда оставит в старших разрядах регистра EAX старые данные. И если там были данные, отличные от нуля, то после выполнения первой команды в регистре EAX будет какое-то число, но не 1. А вот в регистре AX будет число 1. Сложно? Ну это пока… Со временем вы к таким вещам привыкните.

Мы пока не говорили о разрядах (битах). Эту тему мы обсудим в разделах, посвящённых системам счисления. А сейчас пока вам достаточно знать, что нулевой разряд (бит) – это младший бит. Он крайний справа. Старший бит – крайний слева. Номер старшего бита зависит от разрядности числа/регистра. Например, в 32-разрядном регистре старшим битом является 31-й бит (потому что отсчёт начинается с 0, а не с 1).

Ниже приведён список регистров общего назначения, которые можно поделить описанным выше способом и при этом к «половинкам» и «четвертинкам» этих регистров можно обращаться в программе как к отдельному регистру.

Таблица 2.2. «Делимые» регистры..

Регистр Старшие разряды Имена 16-ти и 8-ми битных регистров
31…16 15…8 7…0
EAX . AX
AH AL
EBX . BX
BH BL
ECX . CX
CH CL
EDX . DX
DH DL
ESI . SI
EDI . DI
EBP . BP
ESP . SP
EIP . IP

На этом мы закончим наше краткое знакомство с регистрами. Если вам пока не всё понятно – просто прочитайте этот раздел, чтобы более-менее представлять себе, что такое регистры. По мере приобретения новых знаний вы можете вернуться к этому разделу и уже на новом уровне воспринять эту информацию. А в следующем разделе мы коротко опишем процесс выполнения команды.

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

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

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

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

0000:0000 - ячейка 0 в сегменте 0 0000:0001 - ячейка 1 в сегменте 0 0001:0000 - ячейка 0 в сегменте 1 0001:0015 - ячейка 21 в сегменте 1

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

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

0010:Привет, 0020:МИР!

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

0010:0000 (П) 0010:0001 (р) 0010:0002 (и) 0010:0003 (в) 0010:0004 (е) 0010:0005 (т) 0010:0006 (,) 0020:0000 (М) 0020:0001 (И) 0020:0002 (Р) 0020:0003 (!)

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

0010:Привет, 0020:МИГ!

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

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

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

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

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

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

MOV ES, 0020h

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

MOV AX, 0020h MOV ES, AX

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

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

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

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

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

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

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

Общие правила использования сегментных регистров процессором таковы:

SegmentRegister

  • для выборки кода команды всегда используется сегментный регистр CS;
  • при обращении к стеку ( реальном режиме содержимое каждого сегментного регистра представляет собой номер защищённом режиме каждый сегментный регистр делится на три части, как показано на рисунке: Бит TI в этом случае указывает, какая таблица дескрипторов должна использоваться: нуль соответствует таблице глобальных дескрипторов (GDT), единица — таблице локальных дескрипторов (LDT). Поле Index является номером (индексом) дескриптора в таблице дескрипторов; этот дескриптор используется при вычислении линейного адреса. Наконец, поле RPL является 64-разрядном режиме сегментные регистры CS, DS, ES и SS в формировании линейного адреса не участвуют, поскольку сегментация в этом режиме не поддерживаются. Сегментные регистры FS и GS могут использоваться в качестве дополнительных регистров базы, о чём подробнее говорится в разделе Эффективный адрес.

    Регистры процессора

    Регистр процессора — сверхбыстрая память внутри процессора, предназначенная прежде всего для хранения промежуточных результатов вычисления (регистр общего назначения/регистр данных) или содержащая данные, необходимые для работы процессора — смещения базовых таблиц, уровни доступа и т. д. (специальные регистры).

    Регистр представляет собой цифровую электронную схему, служащую для временного хранения двоичных чисел. В процессоре имеется значительное количество регистров, большая часть которых используется самим процессором и недоступна программисту. Например, при выборке из памяти очередной команды она помещается в регистр команд. Программист обратиться к этому регистру не может. Имеются так же регистры, которые в принципе программно доступны, но обращение к ним осуществляется из программ операционной системы (например управляющие регистры и теневые регистры дескрипторов сегментов). Этими регистрами пользуются в основном разработчики операционных систем.

    Доступ к значениям, хранящимся в регистрах как правило в несколько раз быстрее, чем доступ к ячейкам оперативной памяти (даже если кеш-память содержит нужные данные), но объём оперативной памяти намного превосходит суммарный объём регистров (объём среднего модуля оперативной памяти сегодня составляет 1 Гб — 4 Гб [1] , суммарная «ёмкость» регистров общего назначения/данных для процессора 16 битов * 4 = 64 бита (8 байт)).

    Основные регистры процессора, совместимого с Intel 386

    IP (англ. Instruction Pointer ) — регистр, обозначающий смещение следующей команды относительно кодового сегмента.

    IP — 16-битный (младшая часть EIP)

    EIP — 32-битный аналог

    Сегментные регистры — Регистры указывающие на сегменты.

    CS — указатель на кодовый сегмент. Связка CS:IP указывает на адрес в памяти следующей команды.

    Регистры данных — служат для хранения промежуточных вычислений.

    RAX, RBX, RCX, RDX, RBP, RSI, RDI, RSP, R8 — R15 — 64-битные

    EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP — 32-битные (extended AX)

    AX, BX, CX, DX — 16-битные

    AH, AL, BH, BL, CH, CL, DH, DL — 8-битные (половинки 16-ти битных регистров)

    например, AH — high AX — старшая половинка 8 бит

    AL — low AX — младшая половинка 8 бит

    RAX RBX RCX RDX
    —— EAX —— EBX —— ECX —— EDX
    —— —— AX —— —— BX —— —— CX —— —— DX
    —— —— AH AL —— —— BH BL —— —— CH CL —— —— DH DL

    Регистр флагов EFLAGS — содержит текущее состояние процессора.

    Регистром называется функциональный узел, осуществляющий приём, хранение и передачу информации. Регистры состоят из группы триггеров, обычно D. По типу приёма и выдачи информации различают 2 типа регистров:

    • С последовательным приёмом и выдачей информации — сдвиговые регистры.
    • С параллельным приёмом и выдачей информации — параллельные регистры.

    Сдвиговые регистры представляют собой последовательно соединённую цепочку триггеров. Основной режим работы — сдвиг разрядов кода от одного триггера к другому на каждый импульс тактового сигнала.

    По назначение регистры различаются на:

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

    См. также

    Примечания

    1. ↑Статистика объёма оперативной памяти ПК, используемых для игр

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

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