Что такое сегментный регистр ассемблер
Что такое сегментные регистры? Не очень понял
Необходимость указывать сегментные регистры
Почему когда делаем mov, обязательно нужно писать mov al,cs:, если написать mov al,, то не.
Что такое регистры микропроцессора? Перечислите регистры общего назначения
Помогите пожалуйста решить задания по TASM 1) Что такое регистры микропроцессора? Перечислите.
Сегментные регистры
Добрый вечер! Возник вопрос по сегментным регистрам. Вроде бы когда мы программируем под Windows в.
Физический адрес
^^^^^^^^^^^^^^^^^^^^^^^
У первых плат 8086 шина-адреса была 20-битная. Такая ширина позволяет адресовать всего FFFFFh байт памяти. Запускаем виндовый калькулятор, переводим его с BIN, и введём 20 единиц. Так выглядит шина(А) на физическом уровне:
На аппаратном уровне линией(А20) управляет чипсет через порт(92h) системной логики, но ей можно управлять и программно: через прерывания BIOS, или порт(60h) контроллёра клавиатуры. Нужно сказать, что в современной архитектуре чипсет избавили от этой задачи, и управление взял на себя сам ЦП через ножку (А20-Mask). Проц пользуется ею при входе/выходе из защищённого режима.
Линейная и сегментная адресация
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Любая память имеет линейную структуру. То есть это прямая линия от нуля до N байт. Эту прямую можно логически разделить на некоторое кол-во отрезков. Размер памяти от этого не изменится, но зато изменится её лог/структура. Логический адрес привязан к типу памяти: ROM, RAM, Flash, HDD.
Посмотрим на линейный адрес А7FFFh.
В сегментном виде это А700:0FFFh, но не только.
Файлы типа(COM) всегда грузятся в один сегмент, поэтому значения этих регистров у них имеют одно и тоже значения. Файлы типа(EXE) могут иметь размер больше 64КБ, поэтому загрузчик ОС разбрасывает его содержимое по-нескольким сегментам. В этом случае, все данные программы (константы, переменные, текстовые строки) находятся в сегменте данных на который указывает регистр(DS), а сам код находится в другом сегменте памяти, на который указывает(CS). Так-же и стек находится в третьем/произвольном сегменте(SS). Их содержимое можно посмотреть в отладчиках:
Что такое сегментный регистр ассемблер
Справочная система по языку Assembler
Программная модель микропроцессора
Пользовательские регистры
Рис. 1. Пользовательские регистры микропроцессоров i486 и Pentium
Почему многие из этих регистров приведены с наклонной разделительной чертой?
Нет, это не разные регистры — это части одного большого 32-разрядного регистра. Их можно использовать в программе как отдельные объекты.
Так сделано для обеспечения работоспособности программ, написанных для младших 16-разрядных моделей микропроцессоров фирмы Intel, начиная с i8086.
Микропроцессоры i486 и Pentium имеют в основном 32-разрядные регистры. Их количество, за исключением сегментных регистров, такое же, как и у i8086, но размерность больше, что и отражено в их обозначениях — они имеют
приставку e ( E xtended ).
Разберемся подробнее с составом и назначением пользовательских регистров.
Регистры общего назначения
Сегментные регистры
Регистры состояния и управления
Рис. 2. Содержимое регистра eflags
Таблица 1. Флаги состояния
Мнемоника флага | Флаг | Номер бита в eflags | Содержание и назначение |
cf | Флаг переноса (Carry Flag) | 0 | 1 — арифметическая операция произвела перенос из старшего бита результата. Старшим является 7, 15 или 31-й бит в зависимости от размерности операнда; 0 — переноса не было |
pf | Флаг паритета (Parity Flag) | 2 | 1 — 8 младших разрядов (этот флаг — только для 8 младших разрядов операнда любого размера) результата содержат четное число единиц; 0 — 8 младших разрядов результата содержат нечетное число единиц |
af | Вспомогательный флаг переноса (Auxiliary carry Flag) | 4 | Только для команд работающих с BCD-числами. Фиксирует факт заема из младшей тетрады результата: 1 — в результате операции сложения был произведен перенос из разряда 3 в старший разряд или при вычитании был заем в разряд 3 младшей тетрады из значения в старшей тетраде; 0 — переносов и заемов в(из) 3 разряд(а) младшей тетрады результата не было |
zf | Флаг нуля (Zero Flag) | 6 | 1 — результат нулевой; 0 — результат ненулевой |
sf | Флаг знака (Sign Flag) | 7 | Отражает состояние старшего бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно): 1 — старший бит результата равен 1; 0 — старший бит результата равен 0 |
of | Флаг переполнения (Overflow Flag) | 11 | Флаг of используется для фиксирования факта потери значащего бита при арифметических операциях: 1 — в результате операции происходит перенос (заем) в(из) старшего, знакового бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно); 0 — в результате операции не происходит переноса (заема) в(из) старшего, знакового бита результата |
iopl | Уровень Привилегий ввода-вывода (Input/Output Privilege Level) | 12, 13 | Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи |
nt | флажок вложенности задачи (Nested Task) | 14 | Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую |
Таблица 2. Системные флаги
Мнемоника флага | Флаг | Номер бита в eflags | Содержание и назначение |
tf | Флаг трассировки (Trace Flag) | 8 | Предназначен для организации пошаговой работы микропроцессора. 1 — микропроцессор генерирует прерывание с номером 1 после выполнения каждой машинной команды. Может использоваться при отладке программ, в частности отладчиками; 0 — обычная работа |
if | Флаг прерывания (Interrupt enable Flag) | 9 | Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний (прерываний по входу INTR). 1 — аппаратные прерывания разрешены; 0 — аппаратные прерывания запрещены |
rf | Флаг возобновления (Resume Flag) | 16 | Используется при обработке прерываний от регистров отладки. |
vm | Флаг виртуального (Virtual 8086 Mode) | 17 | Признак работы микропроцессора в режиме виртуального 8086. 1 — процессор работает в режиме виртуального 8086; 0 — процессор работает в реальном или защищенном режиме |
ac | Флаг контроля выравнивания (Alignment Check) | 18 | Предназначен для разрешения контроля выравнивания при обращениях к памяти. Используется совместно с битом am в системном регистре cr0. К примеру, Pentium разрешает размещать команды и данные с любого адреса. Если требуется контролировать выравнивание данных и команд по адресам кратным 2 или 4, то установка данных битов приведет к тому, что все обращения по некратным адресам будут возбуждать исключительную ситуацию |
Системные регистры микропроцессора
Само название этих регистров говорит о том, что они выполняют специфические функции в системе. Использование системных регистров жестко регламентировано. Именно они обеспечивают работу защищенного режима. Их также можно рассматривать как часть архитектуры микропроцессора, которая намеренно оставлена видимой для того, чтобы квалифицированный системный программист мог выполнить самые низкоуровневые операции.
Регистры управления
Эти регистры предназначены для общего управления системой.
Регистры управления доступны только программам с уровнем привилегий 0.
Регистры системных адресов
Регистры отладки
Регистр dr6 называется регистром состояния отладки. Биты этого регистра устанавливаются в соответствии с причинами, которые вызвали возникновение последнего исключения с номером 1.
Большинство из системных регистров программно доступны. Не все из них понадобятся в нашем дальнейшем изложении, но, тем не менее, я коротко рассмотрел их с тем, чтобы возбудить у читателя интерес к дальнейшему исследованию архитектуры микропроцессора.
Что такое сегментный регистр ассемблер
Справочная система по языку Assembler
Программная модель микропроцессора
Пользовательские регистры
Рис. 1. Пользовательские регистры микропроцессоров i486 и Pentium
Почему многие из этих регистров приведены с наклонной разделительной чертой?
Нет, это не разные регистры — это части одного большого 32-разрядного регистра. Их можно использовать в программе как отдельные объекты.
Так сделано для обеспечения работоспособности программ, написанных для младших 16-разрядных моделей микропроцессоров фирмы Intel, начиная с i8086.
Микропроцессоры i486 и Pentium имеют в основном 32-разрядные регистры. Их количество, за исключением сегментных регистров, такое же, как и у i8086, но размерность больше, что и отражено в их обозначениях — они имеют
приставку e ( E xtended ).
Разберемся подробнее с составом и назначением пользовательских регистров.
Регистры общего назначения
Сегментные регистры
Регистры состояния и управления
Рис. 2. Содержимое регистра eflags
Таблица 1. Флаги состояния
Мнемоника флага | Флаг | Номер бита в eflags | Содержание и назначение |
cf | Флаг переноса (Carry Flag) | 0 | 1 — арифметическая операция произвела перенос из старшего бита результата. Старшим является 7, 15 или 31-й бит в зависимости от размерности операнда; 0 — переноса не было |
pf | Флаг паритета (Parity Flag) | 2 | 1 — 8 младших разрядов (этот флаг — только для 8 младших разрядов операнда любого размера) результата содержат четное число единиц; 0 — 8 младших разрядов результата содержат нечетное число единиц |
af | Вспомогательный флаг переноса (Auxiliary carry Flag) | 4 | Только для команд работающих с BCD-числами. Фиксирует факт заема из младшей тетрады результата: 1 — в результате операции сложения был произведен перенос из разряда 3 в старший разряд или при вычитании был заем в разряд 3 младшей тетрады из значения в старшей тетраде; 0 — переносов и заемов в(из) 3 разряд(а) младшей тетрады результата не было |
zf | Флаг нуля (Zero Flag) | 6 | 1 — результат нулевой; 0 — результат ненулевой |
sf | Флаг знака (Sign Flag) | 7 | Отражает состояние старшего бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно): 1 — старший бит результата равен 1; 0 — старший бит результата равен 0 |
of | Флаг переполнения (Overflow Flag) | 11 | Флаг of используется для фиксирования факта потери значащего бита при арифметических операциях: 1 — в результате операции происходит перенос (заем) в(из) старшего, знакового бита результата (биты 7, 15 или 31 для 8, 16 или 32-разрядных операндов соответственно); 0 — в результате операции не происходит переноса (заема) в(из) старшего, знакового бита результата |
iopl | Уровень Привилегий ввода-вывода (Input/Output Privilege Level) | 12, 13 | Используется в защищенном режиме работы микропроцессора для контроля доступа к командам ввода-вывода в зависимости от привилегированности задачи |
nt | флажок вложенности задачи (Nested Task) | 14 | Используется в защищенном режиме работы микропроцессора для фиксации того факта, что одна задача вложена в другую |
Таблица 2. Системные флаги
Мнемоника флага | Флаг | Номер бита в eflags | Содержание и назначение |
tf | Флаг трассировки (Trace Flag) | 8 | Предназначен для организации пошаговой работы микропроцессора. 1 — микропроцессор генерирует прерывание с номером 1 после выполнения каждой машинной команды. Может использоваться при отладке программ, в частности отладчиками; 0 — обычная работа |
if | Флаг прерывания (Interrupt enable Flag) | 9 | Предназначен для разрешения или запрещения (маскирования) аппаратных прерываний (прерываний по входу INTR). 1 — аппаратные прерывания разрешены; 0 — аппаратные прерывания запрещены |
rf | Флаг возобновления (Resume Flag) | 16 | Используется при обработке прерываний от регистров отладки. |
vm | Флаг виртуального (Virtual 8086 Mode) | 17 | Признак работы микропроцессора в режиме виртуального 8086. 1 — процессор работает в режиме виртуального 8086; 0 — процессор работает в реальном или защищенном режиме |
ac | Флаг контроля выравнивания (Alignment Check) | 18 | Предназначен для разрешения контроля выравнивания при обращениях к памяти. Используется совместно с битом am в системном регистре cr0. К примеру, Pentium разрешает размещать команды и данные с любого адреса. Если требуется контролировать выравнивание данных и команд по адресам кратным 2 или 4, то установка данных битов приведет к тому, что все обращения по некратным адресам будут возбуждать исключительную ситуацию |
Системные регистры микропроцессора
Само название этих регистров говорит о том, что они выполняют специфические функции в системе. Использование системных регистров жестко регламентировано. Именно они обеспечивают работу защищенного режима. Их также можно рассматривать как часть архитектуры микропроцессора, которая намеренно оставлена видимой для того, чтобы квалифицированный системный программист мог выполнить самые низкоуровневые операции.
Регистры управления
Эти регистры предназначены для общего управления системой.
Регистры управления доступны только программам с уровнем привилегий 0.
Регистры системных адресов
Регистры отладки
Регистр dr6 называется регистром состояния отладки. Биты этого регистра устанавливаются в соответствии с причинами, которые вызвали возникновение последнего исключения с номером 1.
Большинство из системных регистров программно доступны. Не все из них понадобятся в нашем дальнейшем изложении, но, тем не менее, я коротко рассмотрел их с тем, чтобы возбудить у читателя интерес к дальнейшему исследованию архитектуры микропроцессора.
Регистры процессора
Начиная с модели 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 перечислены такие регистры.
Вот пример такого регистра.
Из этого следует, что вы можете написать в своей программе, например, такие команды: Обе команды поместят в регистр 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 |
На этом мы закончим наше краткое знакомство с регистрами. Если вам пока не всё понятно – просто прочитайте этот раздел, чтобы более-менее представлять себе, что такое регистры. По мере приобретения новых знаний вы можете вернуться к этому разделу и уже на новом уровне воспринять эту информацию. А в следующем разделе мы коротко опишем процесс выполнения команды.
Погружение в ассемблер. Учимся работать с памятью
Содержание статьи
Другие статьи курса
Знакомимся с сегментными регистрами
Регистр CS указывает на сегмент кода. Процессор обращается к CS всякий раз, когда надо считать из памяти очередную инструкцию для выполнения.
Если тебе надо адресоваться в какой-то другой сегмент, а не тот, который будет задействован по умолчанию, напиши этот сегмент в префиксе к инструкции, которую используешь.
Поместить какое-то число в сегментные регистры напрямую нельзя. Для этого надо:
Ну вот вроде бы и все, что тебе надо знать о сегментных регистрах. Теперь ты с их помощью (в основном с помощью регистров DS и ES ) можешь получать доступ ко всему первому мегабайту памяти ПК.
Как ПК распределяет память
Понимание того, как распределяется память в ПК, поможет тебе делать разные интересные вещи.
Первый байт диапазона — это первый символ в верхнем левом углу экрана. Второй байт — это цвет фона под символом и цвет самого символа. Затем (третьим байтом) идет второй символ. И так для всех 25 строк по 80 символов каждая.
Исторический факт. IBM PC образца 1981 года поставлялся в двух модификациях: с монохромным режимом и с цветным режимом. Тогдашним разработчикам игрушек приходилось придумывать разные эвристики, чтобы понять, какая у компьютера графика — монохромная или цветная. Несколько старых добрых игрушек для этого писали какую-нибудь цифру по адресу 0xB8000 и считывали ее обратно, чтобы узнать, в каком режиме сейчас идет работа — в цветном или в монохромном.
Прямой доступ к видеопамяти в текстовом режиме
Перед тем как мы сможем напрямую обращаться к видеопамяти экрана, то есть без использования сервисов BIOS, надо задать нужный нам видеорежим.
Обрати внимание, что после того, как ты выполнил этот кусок кода, ты не сможешь обращаться к переменным, которые сохраняешь в сегменте кода, как мы это делали в примерах из прошлых уроков. Потому что DS и ES теперь нацелены не на сегмент кода, а на видеопамять.
Продолжение доступно только участникам
Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее