Tooprogram.ru

Компьютерный справочник
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

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

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

Регистр флагов – это очень важный регистр процессора, который используется при выполнении большинства команд. Регистр флагов носит название EFLAGS. Это 32-разрядный регистр. Однако старшие 16 разрядов используются при работе в защищённом режиме, и пока мы их рассматривать не будем. К младшим 16 разрядам этого регистра можно обращаться как к отдельному регистру с именем FLAGS. Именно этот регистр мы и рассмотрим в этом разделе.

Каждый бит в регистре FLAGS является флагом. Флаг – это один или несколько битов памяти, которые могут принимать двоичные значения (или комбинации значений) и характеризуют состояние какого-либо объекта. Обычно флаг может принимать одно из двух логических значений. Поскольку в нашем случае речь идёт о бите, то каждый флаг в регистре может принимать либо значение 0, либо значение 1. Флаги устанавливаются в 1 при определённых условиях, или установка флага в 1 изменяет поведение процессора. На рис. 2.4 показано, какие флаги находятся в разрядах регистра FLAGS.

Бит151413121110987654321
ФлагNTIOPLOFDFIFTFSFZFAFPF1CF

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

Флаг установлен, если значение соответствующего ему бита равно 1.

Флаг сброшен, если значение соответствующего ему бита равно 0.

В таблице 2.6 приведено описание флагов регистра FLAGS.

Таблица 2.6. Описание флагов регистра FLAGS.

БитОбозначениеНазваниеОписание
CFCarry FlagФлаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приёмнике и произошёл перенос из старшего бита или если требуется заём (при вычитании). Иначе установлен в 0. Например, этот флаг будет установлен при переполнении, рассмотренном в предыдущем разделе.
11Зарезервирован.
2PFParity FlagФлаг чётности. Устанавливается в 1, если младший байт результата предыдущей команды содержит чётное количество битов, равных 1. Если количество единиц в младшем байте нечётное, то этот флаг равен 0.
3Зарезервирован.
4AFAuxiliary Carry FlagВспомогательный флаг переноса (или флаг полупереноса). Устанавливается в 1, если в результате предыдущей операции произошёл перенос (или заём) из третьего бита в четвёртый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
5Зарезервирован.
6ZFZero FlagФлаг нуля. Устанавливается 1, если результат предыдущей команды равен 0.
7SFSign FlagФлаг знака. Этот флаг всегда равен старшему биту результата.
8TFTrap FlagФлаг трассировки (или флаг ловушки). Он был предусмотрен для работы отладчиков в пошаговом выполнении, которые не используют защищённый режим. Если этот флаг установить в 1, то после выполнения каждой программной команды управление временно передаётся отладчику (вызывается прерывание 1).
9IFInterrupt Enable FlagФлаг разрешения прерываний. Если сбросить этот флаг в 0, то процессор перестанет обрабатывать прерывания от внешних устройств. Обычно его сбрасывают на короткое время для выполнения критических участков программы.
10DFDirection FlagФлаг направления. Контролирует поведение команд обработки строк. Если установлен в 1, то строки обрабатываются в сторону уменьшения адресов, если сброшен в 0, то наоборот.
11OFOverflow FlagФлаг переполнения. Устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное. И наоборот.
12
13
IOPLI/O Privilege LevelУровень приоритета ввода/вывода.
14NTNested TaskФлаг вложенности задач.
15Зарезервирован.

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

Сейчас вам будет понятно далеко не всё из того, что описано в таблице 2.4. Например, вы пока не знаете, что такое прерывания. Но всему своё время. Пока просто запомните страницу с описанием регистра флагов и возвращайтесь к ней по мере необходимости.

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

Внутренние регистры: Регистр флагов

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

Рис. 1.3. Формат регистра флагов

CF (Флаг переноса, бит 0)

Флаг переноса фиксирует значение переноса (заема), возникающего при сложении (вычитании). Иногда используется и в других ситуациях.

PF (Флаг четности, бит 2)

Флаг четности фиксирует наличие четного числа единиц в младшем байте результата операции, может быть использован, например, для контроля правильности передачи данных.

AF (Флаг вспомогательного переноса, бит 4)

Флаг вспомогательного переноса фиксирует перенос (заем) из младшей тетрады, т.е. из бита 3 в старшую тетраду при сложении (вычитании). Используется только для двоично-десятичной арифметики, которая оперирует исключительно младшими байтами.

ZF (Флаг нуля, бит 6)

Флаг нуля сигнализирует о получении нулевого (ZF = 1) или ненулевого (ZF = 0) результата операции.

SF (Флаг знака, бит 7)

Флаг знака дублирует значение старшего бита результата, который при использовании дополнительного кода соответствует знаку числа (0 – положительное число, 1 – отрицательное).

TF (Флаг трассировки, бит 8)

При установке флага трассировки TF = 1, микропроцессор переходит в пошаговый режим работы, применяемый при отладке программ, когда автоматически генерируется особая ситуация отладки (#DB) после выполнения каждой команды. Прерывание отладки начнет генерироваться, если прикладная программа установит флаг TF с помощью команд POPF/POPFD или IRET/IRETD.

IF (Флаг разрешения прерываний, бит 9)

При установке флага разрешения прерываний IF = 1, микропроцессор воспринимает (распознает) и соответственно реагирует на запрос прерывания по входу INTR# (внешние маскируемые прерывания). При IF = 0, прерывания по этому входу запрещаются и микропроцессор игнорирует поступающие запросы прерываний.

Читать еще:  Команда nop ассемблер

Значение флага IF не влияет на восприятие внешних немаскируемых прерываний по входу NMI#, а также внутренних программных прерываний, выполняемых по команде INT.

Изменение этого флага командами CLI, STI, POPF/POPFD и IRET/IRETD возможно не всегда и определяется текущими:

При обычной обработке прерываний (CR4.PVI = 0 в защищенном режиме или CR4.VME = 0 в режиме V86), когда IOPL IOPL в защищенном режиме (а также всегда в режиме V86), производится дополнительная проверка доступности соответствующего порта ввода/вывода при любых операциях с ним. Такая проверка использует специальную карту разрешения ввода/вывода, которая расположена в верхней части сегмента состояния задачи TSS и определяет доступность всех портов ввода/вывода. В случае недоступности порта или при попытках разрешения/запрещения прерываний командами CLI, STI, когда CPL > IOPL, процессор генерирует ошибку общей защиты (#GP).

Изменение уровня привилегий ввода/вывода IOPL возможно командами POPF/POPFD и IRET/IRETD в защищенном режиме и только при выполнении команды на уровне привилегий, по крайней мере таком же (а для команды POPF/POPFD только на нулевом), как и текущий уровень привилегий ввода/вывода (режим реальной адресации эквивалентен нулевому уровню привилегий).

При работе в режиме V86 (EFLAGS.VM = 1) IOPL-чувствительными являются команды CLI, STI, POPF/POPFD, PUSHF/PUSHFD, IRET/IRETD, INT n. У каждой из этих команд имеется аналогичная зависимость от текущего значения поля IOPL. Например, команда INT n вызывает генерацию особой ситуации общей защиты (#GP), если IOPL (включается установкой флага CR4.VME = 1 в режиме V86 ), в котором возникает дополнительная специфика для IOPL-чувствительных команд. Во-первых, команда IRET в этом режиме вообще перестает быть IOPL-чувствительной и не генерирует особую ситуацию общей защиты (#GP) при IOPL устанавливаются равными 3, а бит IF записывается из текущего значения флага VIF.

В ранних моделях процессоров до Intel286 (8086/8088, Intel186) биты 12 и 13 регистра флагов FLAGS, соответствующие полю IOPL, считались зарезервированными, а их значения всегда были равны единице. В процессоре Intel286 в режиме реальной адресации невозможно изменять значения этих битов — они всегда остаются нулевыми (они сбрасываются в момент инициализации процессора), а вот более поздние модели процессоров, начиная с Intel386, такого ограничения уже не имеют, то есть поле IOPL можно изменять и в режиме реальной адресации. Указанная особенность использовалась в процедурах идентификации процессоров вплоть до появления команды CPUID в процессоре Pentium.

NT (Вложенная задача, бит 14: Intel286 …)

Процессор устанавливает и проверяет флаг вложенной задачи для контроля за прерванными задачами (задачи, во время исполнения которых имело место прерывание) и при вызове процедур. Флаг NT влияет на действия, производимые командой IRET/IRETD. Этот флаг может быть изменен командой POPF/POPFD и IRET/IRETD. Некорректные изменения этого флага могут привести к возникновению различных особых ситуаций в прикладных программах.

RF (Флаг возобновления, бит 16: Intel386 …)

Флаг возобновления RF временно выключает обработку особых ситуаций отладки (DB#) для того, чтобы команда, вызвавшая такую ситуацию, могла быть перезапущена и не стала бы причиной новой особой ситуации. Отладчик устанавливает этот флаг командой IRETD при возврате в прерванную программу. Команды POPF, POPFD (в режиме V86) и IRET на этот флаг не влияют.

VM (Виртуальный режим, бит 17: Intel386 …)

Установка флага виртуального режима VM переключает процессор в режим виртуального-8086 (специальный случай защищенного режима).

AC (Режим контроля выравнивания, бит 18: Intel486 …)

Установка флага режима контроля выравнивания (AC = 1) и бита AM регистра CR0 (CR0.AM = 1) включает контроль выравнивания при обращении к памяти. При этом только при текущем уровне привилегий равном 3 (CPL = 3) генерируется особая ситуация контроля выравнивания (#AC), если происходит обращение к невыровненному операнду (например, к слову по нечетному адресу или к двойному слову по адресу не кратному четырем).

Таблица 3.5. Условия контроля выравнивания

Ассемблер. Сегменты памяти и регистры

Обновл. 29 Сен 2019 |

Мы уже рассматривали 3 секции из которых состоят программы на ассемблере. Эти секции также представляют различные сегменты памяти. Что интересно, если вы замените ключевое слово section на segment , то получите тот же результат. Например:

Результат выполнения программы выше:

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

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

Сегмент данных (data segment) — представлен секциями .data и .bss. Секция .data используется для объявления области памяти, где хранятся элементы данных для программы. Эта секция не может быть расширена после объявления элементов данных, и она остаётся статической во всей программе. Секция .bss также является секцией статической памяти, которая содержит буферы для данных, которые будут объявлены в программе позже. Эта буферная память заполнена нулями.

Сегмент кода (code segment) — представлен секцией .text. Он определяет область в памяти, в которой хранятся коды инструкций. Это также фиксированная область.

Стек (stack) — это сегмент, который содержит значения данных, передаваемые в функции и процедуры в программе.

Регистры

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

Читать еще:  Ассемблер арифметические операции

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

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

В архитектуре IA-32 есть десять 32-битных и шесть 16-битных процессорных регистра. Регистры делятся на три категории:

Общие регистры (General Registers)

Регистры управления (Control Registers)

Сегментные регистры (Segment Registers)

В свою очередь, общие регистры делятся на следующие:

Регистры данных (Data Registers)

Регистры-указатели (Pointer Registers)

Индексные регистры (Index Registers)

Регистры данных

Регистры данных — это четыре 32-битных регистра, которые используются для арифметических, логических и других операций. Эти 32-битные регистры могут быть использованы следующими тремя способами:

Как полные 32-битные регистры данных: EAX, EBX, ECX, EDX.

Нижние половины 32-битных регистров могут использоваться как четыре 16-битных регистра данных: AX, BX, CX и DX.

Нижняя и верхняя половины вышеупомянутых четырёх 16-битных регистров могут использоваться как восемь 8-битных регистров данных: AH, AL, BH, BL, CH, CL, DH и DL.

Некоторые из этих регистров данных имеют специфическое применение в арифметических операциях.

AX (primary accumulator) используется для ввода/вывода и в большинстве арифметических операций. Например, в операции умножения один операнд сохраняется в регистре EAX или AX или AL в соответствии с размером операнда.

BX (base register) используется при индексированной адресации.

CX (count register) хранит количество циклов в повторяющихся операциях (также, как и регистры ECX и CX).

DX (data register) используется в операциях ввода/вывода, а также с регистрами AX и DX для выполнения операций умножения и деления, связанных с большими значениями.

Регистры-указатели

Регистрами-указателями являются 32-битные регистры EIP, ESP и EBP и соответствующие им 16-битные регистры IP, SP и BP. Есть три категории регистров-указателей:

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

Указатель на стек (Stack Pointer или SP) — 16-битный регистр SP обеспечивает значение смещения в программном стеке. SP в сочетании с регистром SS (SS:SP) относится к текущей позиции данных или адреса в программном стеке.

Базовый указатель (Base Pointer или BP) — 16-битный регистр BP используется в основном при передаче параметров в подпрограммы. Адрес в регистре SS объединяется со смещением в BP, чтобы получить местоположение параметра. BP также можно комбинировать с DI и SI в качестве базового регистра для специальной адресации.

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

32-битные индексные регистры ESI и EDI и их 16-битные версии: SI и DI, которые используются в индексированной адресации, и, иногда, в операциях сложения/вычитания. Есть два типа индексных указателей:

Исходный индекс (Source Index или SI) — используется в качестве исходного индекса в строковых операциях.

Индекс назначения (Destination Index или DI) — используется в качестве индекса назначения в строковых операциях.

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

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

Распространённые битовые флаги:

Флаг переполнения (Overflow Flag или OF) — указывает на переполнение старшего бита данных (крайнего левого бита) после signed арифметической операции.

Флаг направления (Direction Flag или DF) — определяет направление влево или вправо для перемещения или сравнения строковых данных. Если DF = 0 , то строковая операция принимает направление слева направо, а когда DF = 1 , то строковая операция принимает направление справа налево.

Флаг прерывания (Interrupt Flag или IF) — определяет, будут ли игнорироваться или обрабатываться внешние прерывания (например, ввод с клавиатуры и т.д.). Он отключает внешнее прерывание, когда значение равно 0, и разрешает прерывание, когда установлено значение 1.

Флаг ловушка (Trap Flag или TF) — позволяет настроить работу процессора в одношаговом режиме.

Флаг знака (Sign Flag или SF) — показывает знак результата арифметической операции. Этот флаг устанавливается в соответствии со знаком элемента данных после выполнения арифметической операции. Знак определяется по старшему левому биту. Положительный результат сбрасывает значение SF до 0, а отрицательный результат устанавливает его равным 1.

Нулевой флаг (Zero Flag или ZF) — указывает результат арифметической операции или операции сравнения. Ненулевой результат сбрасывает нулевой флаг до 0, а нулевой результат устанавливает его равным 1.

Вспомогательный флаг переноса (Auxiliary Carry Flag или AF) — после выполнения арифметической операции содержит перенос с бита 3 на бит 4. Используется для специализированной арифметики. AF устанавливается, когда 1-байтовая арифметическая операция вызывает перенос из бита 3 в бит 4.

Флаг равенства (Parity Flag или PF) — указывает общее количество 1-бит в результате, полученном после выполнения арифметической операции. Чётное число 1-бит сбрасывает PF до 0, а нечётное число 1-бит устанавливает PF равным 1.

Флаг переноса (Carry Flag или CF) — после выполнения арифметической операции содержит перенос 0 или 1 из старшего бита (крайнего слева). Кроме того, хранит содержимое последнего бита операции сдвига или поворота.

В таблице ниже указано положение битовых флагов в 16-битном регистре флагов:

Флаг:ODITSZAPC
Бит №:151413121110987654321

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

Сегменты — это специфические части программы, которые содержат данные, код и стек. Есть три основных сегмента:

Сегмент кода (Code Segment или CS) — содержит все команды и инструкции, которые должны быть выполнены. 16-битный регистр сегмента кода или регистр CS хранит начальный адрес сегмента кода.

Читать еще:  Чем си шарп отличается от си

Сегмент данных (Data Segment или DS) — содержит данные, константы и рабочие области. 16-битный регистр сегмента данных или регистр DS хранит начальный адрес сегмента данных.

Сегмент стека (Stack Segment или SS) — содержит данные и возвращаемые адреса процедур или подпрограмм. Он представлен в виде структуры данных «Стек». Регистр сегмента стека или регистр SS хранит начальный адрес стека.

Кроме регистров CS, DS и SS существуют и другие регистры дополнительных сегментов (Extra Segment или ES), FS и GS, которые предоставляют дополнительные сегменты для хранения данных.

При написании программ на ассемблере, программе необходим доступ к ячейкам памяти. Все области памяти в сегменте относятся к начальному адресу сегмента. Сегмент начинается с адреса, равномерно делимого на десятичное 16 или на шестнадцатеричное 10. Таким образом, крайняя правая шестнадцатеричная цифра во всех таких адресах памяти равна 0, что обычно не сохраняется в сегментных регистрах.

Сегментные регистры хранят начальные адреса сегмента. Чтобы получить точное местоположение данных или команды в сегменте, требуется значение смещения. Чтобы сослаться на любую ячейку памяти в сегменте, процессор объединяет адрес сегмента в сегментном регистре со значением смещения местоположения.

Пример на практике

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

Поясните назначение регистров и флагов процессора i80x86

20.11.2016, 11:27

Указать значения регистров и флагов в программе
.model small .stack 256 .data a db 254 .code main: mov ax, @data mov ds, ax xor ax.

Обнуление регистров флагов с использованием стека
Всем привет. Решая задачи по ассемблеру, наткнулся на два интересных задания. 1. Используя.

Найти значения регистров, флагов, адресов для каждой строки программы
помогите найти программу/эмулятор или найти вручную значения регистров,флагов,адресов после каждой.

назначение регистров
скажите для чего нужны регистры : регистры общего назначения R8B — R15B R8W- R15W R8D-R15D R8.

20.11.2016, 11:36 [ТС]2 Вложения

056 База команд асемблера.zip (18.1 Кб, 18 просмотров)
20.11.2016, 11:543

Описание флагов, регистров процессора можно найти в учебниках по ассемблеру.
Команды условных переходов описаны там же. При изучении ассемблера я не заморачивался с изучением сколько и каких флагов проверяет JE (JZ) — достаточно было раскрытия аббревиатуры (JE — Jump Equality — перейти, если равно). И для других команд аналогично.
https://www.cyberforum.ru/post5323067.html
https://www.cyberforum.ru/post5356780.html

21.11.2016, 12:03 [ТС]421.11.2016, 12:16521.11.2016, 12:266

Решение

Регистр флагов FLAGS — это обычный/16-битный регистр процессора, который информирует нас о состоянии процессора на данный момент. Флаги изменяются в результате выполнения арифметических и логических команд, а также команд сдвига и ротации.

Регистр флагов можно сохранить в стек с помощью команды PUSHF и восстановить из стека с помощью команды POPF. Во всех случаях, флаги сохраняют своё значение до тех пор, пока другая команда не изменит его.

16-битный/флаговый регистр содержит следующие 9 используемых бит:

CF (Carry Flag) — флаг переноса. Содержит значение переносов (0/1) из старшего разряда, при арифметических операциях и операциях сдвига и ротации.

PF (Parity Flag) — флаг четности. Проверяет младшие восемь бит pезультатов операций над данными. Нечетное число бит приводит к установке этого флага в 0, а четное — в 1. Не следует путать флаг четности с битом контроля на четность.

AF (Auxiliary Carry Flag) — дополнительный флаг переноса. Устанавливается в 1, если арифметическая операция приводит к переносу четвёртого справа бита (бит 3) в регистровой однобайтовой команде. Данный флаг имеет отношение к арифметическим операциям над символами кода
ASCII и к десятичным упакованным полям.

ZF (Zero Flag) — флаг нуля. Устанавливается в качестве результата aрифметических команд и команд сравнения. Ненулевой результат приводит к установке в 0 этого флага, а нулевой — к установке 1, т.е. (при сравнении) 0 обозначает «нет» (или результат не равен нулю), а 1 обозначаeт «да» (или результат равен нулю). Команды условного перехода JE и JZ проверяют этот флаг.

SF (SIgn Flag) — знаковый флаг. Устанавливается в соответствии со знаком результата (старшего бита) после арифметических опеpаций: если число положительное — 0, а если отрицательное — 1. Команды условного перехода JG и JL проверяют этот флаг.

TF (Trap Flag) — флаг пошагового выполнения. Этот флаг нам уже приходилось устанавливать, когда использовалась команда «Т» в отладчике DEBUG. Если этот флаг установлен в 1, то процессор переходит в режим пошагового выполнения команд.

IF (Interrupt Flag) — флаг прерывания. При 0 — прерывания запрещены, при 1 — разрешены.

DF (DIrection Flag) — флаг направления. Используется в строковых операциях для определения направления передачи данных. При 0 — увеличивается содержимое регистров SI/DI, вызывая передачу данных слева направо, при 1 — уменьшает содержимое этих регистров, вызывая передачу данных справа налево.

OF (Overflow Flag) — флаг переполнения. Фиксирует арифметическое переполнение, т.е. перенос вниз старшего (знакового) бита при знаковых/арифметических операциях.

Большинство из флагов одноимённого регистра нельзя изменять напрямую, т.к. флаги просто показывают нам состояние процессора в текущий момент. Но есть 3 флага, которые программист может менять, в зависимости от поставленной задачи. Это флаги: CF, DF и IF. У них нет операндов и результатом является только изменение значения соответствующего флага:

Флаг CF — CLC сбрасывает, STC устанавливает, CMC инвертирует значение флага CF.
Флаг DF — CLD сбрасывает, STD устанавливает флаг DF в единицу.
Флаг IF — CLI сбрасывает, STI устанавливает флаг IF в единицу (разрешает прерывания).

DEBUG именует флаги по-своему, ..точнее по их состоянию:

Ссылка на основную публикацию
Adblock
detector