На какой адрес памяти указывает пара регистров cs ip

Обновлено: 07.07.2024

Регистр – определенный участок памяти внутри самого процессора от 8 до 64 бит длинной, который используется для хранения информации, обрабатываемой процессором. Некоторые регистры строго специализированы на хранении определенного рода информации.

По типу приема и выдачи информации различают:

  • сдвиговые регистры (последовательный прием и выдача)
  • параллельные (параллельный прием и выдача)

По назначению различают:

  • Аккумуляторы – хранение промежуточных результатов арифметических и логических операций, инструкций ввода-вывода
  • Флаговые – хранение признаков результатов арифметических и логических операций
  • Общего назначения – хранение операндов арифметических и логических выражений, индексы, адреса
  • Индексные – индексы исходящих и целевых элементов массива
  • Указательные – указатели на специальные области памяти, указатели текущей операции, указатели базы, указатели стека
  • Сегментные – адреса и селекторы сегментов памяти
  • Управляющие – информация управляющая состоянием процессора, адреса системных таблиц.


Регистры общего назначения:
ЕАХ (Accumulator) – хранение промежуточных данных
EBX (Base) – хранение базового адреса
ECX (Counter) – регистр-счетчик применяется в командах, производящих некоторые повторяющееся действия, его использование за частую не явно – скрыто в алгоритме работы команды.
EDX (Data) – хранение промежуточных данных
Данные регистры являются 32-разрядными и делятся на две части по 16 бит, старшая часть – не доступна, а младшая тоже делится на две части по 8 бит. Выглядит это следующим образом:


Регистры – указатели:
ESI и EDI – индексы источника и приемника, используются при обработке длинных полей
EBP и ESP – указатели базы и вершины, используются при работе со стеком.
Эти регистры также 32-разрядные и имеют младшие 16-ти разрядные части SI, DI, BP, SP соответственно.

    Сегментные регистры:
    Структура программы разделена на блоки – сегменты, выделяют следующие типы сегментов:

Сегментные регистры являются 16-разрядными.


Управляющие регистры:
EIP – Extended Instruction Pointer register (32-разрядный, младшая часть IP – 16-разрядная)
Содержит смещение следующей подлежащей выполнению команды относительно начала сегмента кода. После выполнения команды меняется автоматически. Полный адрес команды формирует пара регистров CS:IP.

Биты этих регистров называются флагами. Различают флаги состояния, управляющие, системные и зарезервированные флаги.

Флаг переноса CF (CarryFlag) идентифицирует перенос или заем при выполнении арифметических операций, а также служит индикатором ошибки при обращении к системным функциям.
Флаг паритета PF (ParityFlag) устанавливается в 1, если младшие 8 бит результата операции содержат четное число двоичных единиц.
Флаг вспомогательного переноса AF (AuxiliaryFlag) используется в операциях над упакованными двоично-десятичными числами. Он идентифицирует перенос или заем из старшей тетрады (бита 4).
Флаг нуля ZF (ZeroFlag) устанавливается в 1, если результат операции равен нулю.
Флаг знака SF (SignFlag) показывает знак результата операции, устанавливаясь в 1 при отрицательном результате.
Флаг переполнения OF (OverflowFlag) фиксирует переполнение, т.е. выход результата операции за пределы допустимого для данного процессора диапазона значений.
Флаги состояния автоматически устанавливаются процессором после выполнения каждой команды.
Управляющий флаг трассировки TF (TraceFlag) используется в отладчиках для осуществления пошагового выполнения программы. Если TF = 1, то после выполнения каждой команды процессор реализует процедуру прерывания 1 (через вектор прерывания с номером 1).
Управляющий флаг разрешения прерываний IF (InterruptFlag) разрешает (если равен 1) или запрещает (если равен 0) процессору реагировать на прерывания от внешних устройств.
Управляющий флаг направления DF (DirectionFlag) используется особой группой команд, предназначенных для обработки строк. Если DF = 0, строка обрабатывается в прямом направлении, от меньших адресов к большим; если DF = 1, обработка строки идет в обратном направлении.

Начало работы с языком ассемблера: регистры сегментов

Следуя предыдущей статье «Концепция сегментов», эта статья подробно объясняет «Сегментный регистр».

Основная концепция сегментного регистра

Сегментный регистр - это регистр, который предоставляет адрес сегмента.

8086CPU имеет 4 сегментных регистра: CS, DS, SS, ES

Когда 8086CPU хочет получить доступ к памяти, 4 регистра предоставляют адрес сегмента блока памяти.

Введение в регистр CS и IP

CS и IP - самые важные регистры в 8086CPU, они указывают адрес инструкции, которую CPU в данный момент хочет прочитать.

CS - регистр сегмента кода, IP - регистр указателя инструкции

mov AX, 0123H Схема процесса инструкции:


Примечание: адрес смещения сохраняется в регистре IP. После чтения каждой инструкции значение IP увеличивается на соответствующую длину инструкции (как показано на рисунке выше, это 3, а третий и четвертый раз - 2), но CS временно не изменяется; один код операции занимает одно слово Раздел, последующие операнды являются конкретными, поэтому размер инструкции также зависит от конкретного; например, на приведенном выше рисунке mov AX, 0123H Поскольку 0123H занимает 2 байта, команда занимает всего (2 + 1) = 3 байта в длину.

После включения или сброса ЦП 8086 (то есть, когда ЦП только начинает работать), CS и IP устанавливаются на CS = FFFFH, IP = 0000H

То есть, когда машина 8086CPC только запускается, ЦП считывает инструкции из блока памяти FFFF0H и выполняет

Инструкция в блоке FFFF0H - это первая инструкция, выполняемая после включения 8086PC.

Изменить инструкции по регистрации CS, IP

Инструкции по изменению регистра AX: mov AX, 23
mov Команды могут изменять значение большинства регистров 8086CPU, которые называются командами передачи.

но mov Команда не может изменять значение регистра CS и IP! !

8086CPU предоставляет специальные инструкции для CS и IP по изменению их значений: jmp инструкция

jmp Инструкция может изменять значение CS и IP одновременно:

jmp Инструкция также может изменять только значение регистра IP:


Картинка ниже представляет собой «бесконечный цикл»:

Программа зацикливалась в левом сегменте в конце .

Фрагмент кода

Для 8086PC группа блоков памяти может быть определена как сегмент в соответствии с потребностями во время программирования.


Эта 10-байтовая инструкция хранится в группе блоков памяти от 123B0H до 123B9H, а блок памяти от 123B0H до 123B9H используется для хранения этого кода.Это сегмент кода. Адрес сегмента - 123BH, длина - 10 байт.

Позвольте процессору выполнить кодовые инструкции, изменив значения CS и IP.
(В любой момент CS и IP указывают на «команды», помните об этом!)

Итоговое резюме: рабочий процесс 8086CPU
1. Прочтите инструкции из блока памяти, на который указывает CS: IP, и инструкции чтения войдут в буфер инструкций.
2. IP указывает на следующую инструкцию
3. Выполните инструкцию и повторите шаг первый (несколько раз).

Интеллектуальная рекомендация

совместный запрос mysql с тремя таблицами (таблица сотрудников, таблица отделов, таблица зарплат)

1. Краткое изложение проблемы: (внизу есть инструкция по созданию таблицы, копирование можно непосредственно практиковать с помощью (mysql)) Найдите отделы, в которых есть хотя бы один сотрудник. Отоб.


[Загрузчик классов обучения JVM] Третий день пользовательского контента, связанного с загрузчиком классов


IP, сеанс и cookie

ГЛАВА 3
АРХИТЕКТУРА 32/64-РАЗРЯДНОГО
МИКРОПРОЦЕССОРА СЕМЕЙСТВА 80X86
(часть 3/3)

Указатель команд

  • выборку команды из очереди команд;
  • декодирование команды;
  • генерацию адреса, при котором определяются адреса операндов в памяти;
  • выполнение операции с помощью АЛУ;
  • запись результата (куда будет записан результат, зависит от алгоритма работы конкретной машиной команды).

Описание любого микропроцессора выглядит иначе, чем описание большинства других микросхем, отчасти из-за присутствия в нем обширного раздела, посвященного «системе команд». Для использования микропроцессора важно понимать, что «делают» команды: как обращаться к памяти («типы адресации»), к регистрам, куда попадают результаты арифметических операций, как устроить условное ветвление (переходы) и т.д. Каждая команда микропроцессора x86 состоит из одного, двух или более байт, причем первый байт – это опкод команды. Опкод определяет природу команды; по опкоду микропроцессор определяет, нужны ли дополнительные байты, и, если да, получает их в последующих циклах. Поскольку опкод состоит из 8 бит, может существовать 256 разных опкодов. Ограничение в 256 команд было обойдено, так как некоторые опкоды (0FEh, 0FFh и другие) служат шлюзами к следующим таблицам кодов. В приложении представлен полный список команд микропроцессора x86.
В таблице команды даны не в шестнадцатеричном машинном представлении (машинном коде), а в виде мнемокодов языка ассемблера, поскольку микропроцессор x86 обычно программируют на этом более удобочитаемом языке, обозначая адреса и числа легко запоминаемыми именами вместо чисел, с которыми в действительности оперирует микропроцессор. После того как программа написана на языке ассемблера, стандартная программа, известная также под названием «ассемблер», преобразует мнемокоды и имена в числа. В связи с этим язык ассемблера называют «входным языком» в отличии от числового «объектного языка», который микропроцессор x86 использует непосредственно. Таким образом, программа ассемблер переводит на объектный язык программы, составленные на входном языке. В процессе этого перевода одна команда языка ассемблер может быть преобразована в 1, 2 или более байт объектного языка в зависимости от конкретной команды.
Последующие главы погрузят Вас в изучение системы команд микропроцессора x86, поскольку это единственный способ составить представление о его работе.

Прерывания – это аппаратный механизм, который заставляет микропроцессор прервать выполнение текущей задачи и заняться обработкой внешнего события. Первоначально прерывания были разработаны для повышения эффективности планирования использования микропроцессора. Одним из мотивов было желание предоставить «интеллектуальным» устройствам возможность производить операции ввода-вывода независимо от микропроцессора. Устройству необходимо только сигнализировать с помощью прерывания микропроцессору о том, что передача данных завершена. Другой мотив возник из происходящих внутри микропроцессора событий, а именно случаев ошибок (как, например, слишком большое целое число, деление на ноль, выход за границы памяти и т.п.), а также связанных с операционной системой отслеживающих механизмов. Последний мотив возник в многопроцессорных системах, в которых каждый микропроцессор должен сигнализировать другим о доступе к разделенным ресурсам.
Прерывание – это сигнал микропроцессору, вынуждающий его отвлечь свое внимание от текущей деятельности. Ценность аппарата прерываний заключается в том, что микропроцессор может автоматически реагировать на внешние по отношению к системе ситуации, а также на ситуации, возникающие внутри него самого. Аппарат прерываний может включать в себя несколько типов прерываний. Наиболее общими, конечно, являются прерывания, генерируемые периферийными устройствами, требующими обслуживания после завершения операции ввода-вывода. Другой источник прерываний – это устройства управления памятью, которое может сигнализировать об обращении к виртуальной странице памяти, отсутствующей в оперативной памяти, или об ошибочной адресации. Внутри микропроцессора прерывания могут генерироваться в случае арифметических ошибок. И, наконец, посредством выполнения специальной команды может быть сгенерировано программное прерывание.
В результате прерывания происходит переход к программе обработки прерываний. Прежде чем приступить к анализу причины прерывания, эта программа должна сохранить текущее состояние микропроцессора. Когда выполнение программы обработки прерываний завершено, управление должно быть снова передано прерванному процессу, причем таким образом, чтобы вклинившаяся работа программы обработки прерываний никак не отразилась на выполняемых им операциях.
Существуют три основных типа механизма прерываний: прерывание, вызванное сбросом или запуском микропроцессора, прерывания по вызову и векторные прерывания.

Микропроцессор x86 имеет три линии прерываний – RESET, NMI и INTR, по которым внешние устройства могут передавать свои запросы на обслуживание со стороны микропроцессора.

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

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

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

Содержание

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 - 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 типа регистров:

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

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

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

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

Счётчик команд

IP (англ. Instruction Pointer ) — регистр, содержащий адрес-смещение следующей команды, подлежащей исполнению, относительно кодового сегмента CS в процессорах семейства x86.

Регистр IP связан с CS в виде CS:IP, где CS является текущим кодовым сегментом, а IP — текущим смещением относительно этого сегмента.

Регистр IP является 16-разрядным регистром-указателем. Кроме него, в состав регистров этого типа входят SP (англ. Stack Pointer — указатель стека) и BP (англ. Base Pointer — базовый указатель).

Например, CS содержит значение 2CB5[0]H , в регистре IP хранится смещение 123H .

Адрес следующей инструкции, подлежащей исполнению вычисляется путем суммирования адреса в CS (сегменте кода) со смещением в регистре IP:

2CB50H + 123H = 2CC73H

Таким образом, адрес следующей инструкции для исполнения равен 2CC73H .

При выполнении текущей инструкции процессор автоматически изменяет значение в регистре IP, в результате чего регистровая пара CS:IP всегда указывает на следующую подлежащую исполнению инструкцию.

Начиная с процессора 80386 была введена 32-разрядная версия регистра-указателя — EIP. В данном случае IP является младшей частью этого регистра (первые 16 разрядов). Принцип работы EIP в целом схож с работой регистра IP. Основная разница состоит в том, что в защищённом режиме, в отличие от реального режима, регистр CS является селектором (селектор указывает не на сам сегмент в памяти, а на его дескриптор сегмента в таблице дескрипторов).

В 64-разрядных процессорах используется свой регистр-указатель инструкций — RIP.

Младшей частью этого регистра является регистр EIP.

На основе RIP в 64-разрядных процессорах введён новый метод адресации RIP-relative. В остальном работа RIP аналогична работе регистра EIP.

Читайте также: