Топ контрибуторов
loading
loading
Знаете ли Вы, что

Свои вопросы для тестов можно добавлять на странице с информацией о тесте. При этом для некоторых тестов добавление вопросов закрыто

Лента обновлений
ссылка 01:54:53
Комментарий от Apleuxa:
Абстрактный класс определят структуру, а интерфейс - пов...
ссылка Feb 26 01:30
Добавлен вопрос в тест jQuery - Основы
ссылка Feb 24 09:31
Комментарий от sabogdanov:
Написано же в вопросе, как называется объект? Триггер...
ссылка Feb 23 04:06
Добавлен вопрос в тест C# - Средний уровень
ссылка Feb 21 02:05
Добавлен вопрос в тест Базы данных (теория)
Статистика

Тестов: 153, вопросов: 8596. Пройдено: 477977 / 2332218.

Обзор регистров семейства Intel x86 совместимых процессоров

head tail Статья
категория
Ассемблер
дата23.02.2010
авторAlanTi
голосов8

Что такое регистр и о чём пойдёт речь ниже?

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

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

На программном уровне регистр представляет собой набор упорядоченных битов. Упорядочены они по номерам от (n-1) до 0, где n–разрядность регистра. Причём наиболее значимый (он же старший) бит имеет номер (n-1), а наименее значимый (младший) соответственно – номер 0 (примечание: это общепринятая схема нумерации, но иногда встречается и обратная).

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

Небольшое уточнение перед началом описания. Так как раньше словом называли объём данных равный разрядности процессора, следует уточнить, что ниже под словом понимается 2 байта (16 бит), а под двойным словом – 4 байта (32 бита).

Итак, в процессорах семейства x86 можно выделить следующие группы регистров:

  • 1) Регистры общего назначения.
    • 1.1) Регистры данных.
    • 1.2) Счётчик.
    • 1.3) Индексные регистры.
    • 1.4) Регистры базы.
  • 2) Сегментные регистры и счётчик команд.
  • 3) Регистр флагов.

Ниже более подробно описывается каждая группа: её состав, разрядности регистров, области применения (в каких инструкциях, на каком уровне).

Регистры общего назначения

Регистры общего назначения или сокращённо РОНы, как следует из их названия, могут использоваться практически для чего угодно. Однако это название не совсем соответствует действительности. Такое их использование действительно возможно, но только при соблюдении особых условий, т.е. отказа от использования части команд. Так что они играют роль РОНов между вызовами команд, неявно из использующих. В остальных случаях каждый из них играет определённую роль при выполнении определённых инструкций. Исходя из того, что делают эти инструкции можно разбить РОНы на группы, описанные ниже.

Группа регистров данных

Сюда входят два 32-x битных регистра EAX (Extended Accumulator Register) и EDX (Extended Data Register), которые чаще других участвуют в арифметических операциях, и за которыми закреплены роли в работе команд умножения, деления.

Младше слово EAX/EDX доступно под обозначением AX/DX. Старший и младший байты AX/DX доступны соответственно как AH (Accumulator High)/DH (Data High) и AL (Accumulator Low)/DL (Data Low).

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

Счётчик

Это 32-х битный регистр ECX (Extended Counter Register). Он используется в команде LOOP в качестве параметра цикла и задаёт количество итераций (и ещё, в 16 режиме он (а точнее его часть CL) использовался для задания количества битов при сдвигах больше чем на один бит).

Младше слово доступно под обозначением CX. Старший и младший байты CX доступны соответственно как CH (Counter High) и CL (Counter Low).

Индексные регистры

Это два 32-х битных регистра ESI (Extended Source Register) и EDI (Extended Destination Register). Используются в командах обработки строк (MOVS, CMPS и другие), а так же в качестве индексов массивов. Второе применение не всегда в точности соответствует практике, так как можно использовать только эти регистры без базовых или в качестве индексов использовать любые другие кроме SP (последнее утверждение справедливо для 32-х битного режима). Но для ясности (и более быстрого понимания кода программы) следует, по возможности, использовать их как индексы или указатели на текущие элементы источника и назначения.

Младше слово ESI/EDI доступно под обозначением SI/DI. Старший и младший байты SI/DI отдельных мнемоник не имеют.

Регистры базы

Таких регистров три EBX, ESP и EBP, все они так же 32-битные, а их младшим словам можно получить доступ через BX, SP и BP соответственно. Отдельные байты младших слов также недоступны, как и в предыдущем пункте.

EBX может применяться, например, как база для массива, индексируемого одним из регистров ESI или EDI. Хотя, конечно же, ничто не мешает использовать его так, как вам будет угодно.

Регистры ESP и EBP предназначены для работы со стеком. При этом ESP хранит указатель на текущую вершину стека. А EBP чаще всего хранит адрес стекового фрейма. ESP неявно модифицируется всеми инструкциями, которые работают со стеком (INT/IRET, CALL/RET, PUSH/POP и другие). При их использовании следует помнить, что по умолчанию инструкции, содержащие их, адресуют не сегмент данных, а сегмент стека. Если такое поведение нежелательно, то следует воспользоваться префиксом замены сегмента.

Сегментные регистры и счётчик команд

Сегментных регистров шесть: CS, DS, ES, SS, GS, FS. Все они 16 битные (на самом деле 80 битные, но получить доступ можно только к 16 битам) и содержат номер параграфа (параграф это 16 байт, расположенных последовательно с адреса кратного 16) в реальном режиме и селектор сегмента в защищённом (структура селектора простая, но её нету смысла здесь рассматривать). Так вот, в процессорах семейства x86 используется сегментная адресация, и для работы с различными участками памяти сегментные регистры настраиваются на разные базовые адреса.

Регистр CS (Code Segment) является одним из компонентов логического адреса вместе с счётчиком команд, смещения в котором задаётся именно относительно базы сегмента CS. В защищённом режиме его содержимое также определяет текущий уровень привилегий, с которыми исполняется код.

Регистры DS (Data Segment), ES (Extra Segment), FS и GS (не знаю как расшифровываются, возможно, просто продолжали по алфавиту) являются регистрами сегментов данных. При этом если в инструкции не указан сегмент данных, то при отсутствии в ней ESP и EBP используется сегмент в DS, кроме случаев команд работы со строками (в них ES адресует сегмент назначения). Регистры GS и FS являются дополнительными и непосредственно используются крайне редко. Поэтому некоторые операционные системы используют их для хранения базового адреса структуры-описателя состояния текущей нити.

Регистр SS (Stack Segment) адресует сегмент стека. Он работает в паре с ESP во всех операциях со стеком.

Счётчик команд это регистр EIP (IP – его младшее слово). Вместе с CS адресует следующую команду, которая будет выбрана процессором на выполнение. Причём адресуется именно следующая команда. Так, например, во время исполнения команды по адресу CS:00000010h, размер которой равен 2 байта, содержимое EIP будет равным 000000012h.

Регистр флагов

Регистр флагов называется EFLAGS и состоит из 32-бит (из них младшие 16 называются FLAGS, в реальном режиме используется именно FLAGS).

Рассмотрим подробнее его биты, исключая те, которые на данный момент зарезервированы и процессором не используются.

бит 0: флаг переноса, CF (Carry Flag). Указывает на то, что при вычислении арифметической операции произошёл перенос в несуществующий старший разряд или заём из него.

бит 2: флаг четности, PF (Parity Flag). Указывает на то, что количество установленных бит в результате чётно.

бит 4: флаг полупереноса или вспомогательного переноса, AF (Additional Flag). Тоже что и CF, но для тетрад, т.е. перенос/заём из 3 бита в 4.

бит 6: флаг нуля, ZF (Zero Flag). Указывает на то, что результат предыдущей команды содержит одни нули.

бит 8: флаг трассировки, TF (Trace Flag). При установке этого флага, после выполнения каждой инструкции вызывается прерывание INT 1.

бит 9: флаг разрешения прерываний, IF (Interrupt Flag). При сбросе в ноль блокируются маскируемые аппаратные прерывания.

бит 10: флаг направления, DF (Direction Flag). Определяет направление изменения адреса в строковых командах. 0 – увеличение, 1 – уменьшение адресов (оба состояния как для источника так и для приёмника).

бит 11: флаг переполнения, OF (Overflow Flag). Указывает на численное переполнение результата арифметической операции.

биты 13 – 12: уровень привилегий ввода-вывода, IOPL (Input/Output Privileges Level). Определяет минимальный уровень привилегий с которого доступно выполнение команд работы с пространством ввода/вывода.

бит 14: флаг вложенной задачи, NT (Nested Task). Указывает на то, что после выхода из текущей задачи следует вернуться в ту, которая её вызвала.

бит 16: флаг продолжения задачи, RF (Resume Flag). Временно запрещает отладку. Устанавливается автоматически командой IRETD обработчика отладочного прерывания.

бит 17: флаг режима V86, VM (Virtual Mode). Указывает на активность режима эмуляции 8086.

бит 18: флаг контроля за выравниванием, АС (Align Control). Указывает на то, что при обращению пользовательской программы к не выровненным данным следует сгенерировать прерывание.

бит 19: флаг виртуального прерывания, VIF (Virtual Interrupt Flag). Виртуальный флаг IF.

бит 20: флаг ожидания виртуального прерывания, VIP (Virtual Interrupt Pending). Указывает на наличие необработанного аппаратного прерывания.

бит 21: флаг идентификации, ID (Identify). Если программа может изменить состояние этого флага, значит поддерживается инструкция CPUID.

Для части этих битов существуют пары команд установки сброса (например, STI/CLI, STD/CLD).

Другая часть может быть проверена с помощью команд условного перехода (или совмещённых команд проверки-пересылки).

Все оставшиеся можно изменить, сохранив регистр флагов в стек (PUSHF), изменив его там, и загрузив обратно (POPF). При этом зарезервированные регистры трогать не следует, а либо устанавливать в ноль при первой загрузке, либо оставлять прежнее значение.

Если Вам понравилась статья, проголосуйте за нее

Голосов: 8  loading...
art   admin   pasis   makovkastar   serj   df_1975   JurasicSTR   Gurbych