Разное

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

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

Главная / Ассемблер / Для чайников / Введение / Представление данных /

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

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

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

Бит 1514131211109876543210
Флаг 0NTIOPLOFDFIFTFSFZF0AF0PF1CF

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

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

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

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

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

Бит Обозначение Название Описание
0 CF Carry Flag Флаг переноса. Устанавливается в 1, если результат предыдущей операции не уместился в приёмнике и произошёл перенос из старшего бита или если требуется заём (при вычитании). Иначе установлен в 0. Например, этот флаг будет установлен при переполнении, рассмотренном в предыдущем разделе.
1 1 Зарезервирован.
2 PF Parity Flag Флаг чётности. Устанавливается в 1, если младший байт результата предыдущей команды содержит чётное количество битов, равных 1. Если количество единиц в младшем байте нечётное, то этот флаг равен 0.
3 0 Зарезервирован.
4 AF Auxiliary Carry Flag Вспомогательный флаг переноса (или флаг полупереноса). Устанавливается в 1, если в результате предыдущей операции произошёл перенос (или заём) из третьего бита в четвёртый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
5 0 Зарезервирован.
6 ZF Zero Flag Флаг нуля. Устанавливается 1, если результат предыдущей команды равен 0.
7 SF Sign Flag Флаг знака. Этот флаг всегда равен старшему биту результата.
8
TF
Trap Flag Флаг трассировки (или флаг ловушки). Он был предусмотрен для работы отладчиков в пошаговом выполнении, которые не используют защищённый режим. Если этот флаг установить в 1, то после выполнения каждой программной команды управление временно передаётся отладчику (вызывается прерывание 1).
9 IF Interrupt Enable Flag Флаг разрешения прерываний. Если сбросить этот флаг в 0, то процессор перестанет обрабатывать прерывания от внешних устройств. Обычно его сбрасывают на короткое время для выполнения критических участков программы.
10 DF Direction Flag Флаг направления
. Контролирует поведение команд обработки строк. Если установлен в 1, то строки обрабатываются в сторону уменьшения адресов, если сброшен в 0, то наоборот.
11 OF Overflow Flag Флаг переполнения. Устанавливается в 1, если результат предыдущей арифметической операции над числами со знаком выходит за допустимые для них пределы. Например, если при сложении двух положительных чисел получается число со старшим битом, равным единице, то есть отрицательное. И наоборот.
12
13
IOPL I/O Privilege Level Уровень приоритета ввода/вывода.
14
NT
Nested Task Флаг вложенности задач.
15 0 Зарезервирован.

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

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

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

Они не используются в прикладных программах.


Регистр флагов | это… Что такое Регистр флагов?

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

Содержание

  • 1 Архитектура x86
    • 1.1 Флаги состояния
    • 1.2 Управляющий флаг
    • 1.3 Системные флаги и поле IOPL
    • 1.4 Идентификация процессора
  • 2 См. также
  • 3 Примечания

Архитектура x86

В микропроцессорах Intel 8086 имеет название FLAGS и является 16-разрядным. Расширенные регистры EFLAGS и RFLAGS, введённые в архитектурах IA-32 (процессоры 80386) и x86-64, являются 32-битными и 64-битными соответственно. Расширенные регистры сохраняют обратную совместимость.

Регистр флагов содержит группу флагов состояния, управляющий флаг и группу системных флагов[1]:

Регистр флагов Intel x86
Бит, №ОбозначениеНазваниеОписаниеТип флагаКогда введён
FLAGS
0CFCarry FlagФлаг переносаСостояние
11Зарезервирован
2PFParity FlagФлаг чётностиСостояние
30Зарезервирован
4AFAuxiliary Carry FlagВспомогательный флаг переносаСостояние
50Зарезервирован
6ZFZero FlagФлаг нуляСостояние
7SFSign FlagФлаг знакаСостояние
8TFTrap FlagФлаг трассировки (пошаговое выполнение) Системный
9IFInterrupt Enable FlagФлаг разрешения прерыванийСистемный
10DFDirection FlagФлаг направленияУправляющий
11OFOverflow FlagФлаг переполненияСостояние
12IOPLI/O Privilege LevelУровень приоритета ввода-выводаСистемный80286
13
14NTNested TaskФлаг вложенности задачСистемный80286
150Зарезервирован
EFLAGS
16RFResume FlagФлаг возобновленияСистемный80386
17VMVirtual-8086 ModeРежим виртуального процессора 8086Системный80386
18ACAlignment CheckПроверка выравниванияСистемный80486SX
19VIFVirtual Interrupt FlagВиртуальный флаг разрешения прерыванияСистемныйPentium
20VIPVirtual Interrupt PendingОжидающее виртуальное прерываниеСистемныйPentium
21IDID FlagПроверка на доступность инструкции CPUIDСистемныйПоздние 80486[2]
220Зарезервированы
31
RFLAGS
320Зарезервированы
63

Значение некоторых флагов в регистре флагов можно изменять напрямую, с помощью специальных инструкций (например, CLD для сброса флага направления), но нет инструкций, которые позволяют обратиться (проверить или изменить) к регистру флагов как к обычному регистру. Однако, можно сохранять регистр флагов в стек или регистр (E)AX и восстанавливать регистр флагов из них с помощью инструкций LAHF, SAHF, PUSHF, PUSHFD, POPF и POPFD.

При приостановке задачи (используя многозадачные возможности процессора), процессор автоматически сохраняет значение флага регистров в TSS (task state segment), при активизации новой задачи процессор загружает регистр флагов из TSS новой задачи.

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

Флаги состояния

Флаги состояния (биты 0, 2, 4, 6, 7 и 11) отражают результат выполнения арифметических инструкций, таких как ADD, SUB, MUL, DIV.

  • CF — устанавливается при переносе из/заёме в (при вычитании) старший значащий бит результата и показывает наличие переполнения в беззнаковой целочисленной арифметике. Также используется в длинной арифметике.
  • PF — устанавливается, если младший значащий байт результата содержит чётное число единичных (ненулевых) битов. Изначально этот флаг был ориентирован на использование в коммуникационных программах: при передаче данных по линиям связи для контроля мог также передаваться бит чётности (см., например: RS-232#Принцип работы) и инструкции для проверки флага чётности облегчали проверку целостности данных.
  • AF — устанавливается при переносе и заёме из бита 3 результата. Этот флаг ориентирован на использование в двоично-десятичной (binary coded decimal, BCD) арифметике.
  • ZF — устанавливается, если результат равен нулю.
  • SF — равен значению старшего значащего бита результата, который является знаковым битом в знаковой арифметике.
  • OF — устанавливается, если целочисленный результат слишком длинный для размещения в целевом операнде (регистре или ячейке памяти). Этот флаг показывает наличие переполнения в знаковой целочисленной арифметике (в дополнительном коде).

Из перечисленных флагов только флаг CF можно изменять напрямую с помощью инструкций STC, CLC и CMC. Также, битовые инструкции (BT, BTS, BTR и BTC) копируют указанный бит во флаг CF.

Флаги состояния позволяют одной и той же арифметической инструкции выдавать результат трёх различных типов: беззнаковое, знаковое и двоично-десятично кодированное (BCD) целое число. Если результат считать беззнаковым числом, то флаг CF показывает условие переполнения (перенос или заём), для знакового результата (в дополнительном коде) перенос или заём показывает флаг OF, а для BCD-результата перенос/заём показывает флаг AF. Флаг SF отражает знак знакового результата, флаг ZF отражает и беззнаковый, и знаковый нулевой результат.

В длинной целочисленной арифметике флаг CF используется совместно с инструкциями сложения с переносом (ADC) и вычитания с заёмом (SBB) для распространения переноса или заёма из одного вычисляемого разряда длинного числа в другой.

Инструкции условного перехода Jcc (переход по условию cc — например, JNZ для перехода, если результат не ноль), SETcc (установить значение байта-результата в зависимости от условия cc), LOOPcc (организация цикла) и CMOVcc (условное копирование) используют один или несколько флагов состояния для проверки условия. Например, инструкция перехода JLE (jump if less or equal — переход, если «меньше или равен», ≤) проверяет условие «ZF=1 или SF ≠ OF».

Флаг PF был введён для совместимости с другими микропроцессорными архитектурами и по прямому назначению используется редко. Более распространено его использование совместно с остальными флагами состояния в арифметике с плавающей запятой[3]: инструкции сравнения (FCOM, FCOMP и т. п.) в математическом сопроцессоре устанавливают в нём флаги-условия C0, C1, C2 и C3 и эти флаги можно скопировать в регистр флагов. Для этого рекомендуется использовать инструкцию FSTSW AX для сохранения слова состояния сопроцессора в регистре AX и инструкцию SAHF для последующего копирования содержимого регистра AH в младшие 8 битов регистра флагов[4], при этом C0 попадает во флаг CF, C2 — в PF, а C3 — в ZF. Флаг C2 устанавливается, например, в случае несравнимых аргументов (NaN или неподдерживаемый формат) в инструкции сравнения FUCOM.

Управляющий флаг

Флаг направления (DF, бит 10 в регистре флагов) управляет строковыми инструкциями (MOVS, CMPS, SCAS, LODS и STOS): установка флага заставляет уменьшать адреса (обрабатывать строки от старших адресов к младшим), обнуление заставляет адреса увеличивать. Инструкции STD и CLD соответственно устанавливают и обнуляют флаг DF.

Системные флаги и поле IOPL

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

  • IF — обнуление этого флага запрещает отвечать на маскируемые запросы на прерывание.
  • TF — установка этого флага разрешает пошаговый режим отладки, когда после каждой выполненной инструкции происходит прерывание программы и вызов специального обработчика прерывания (см. также: Int3).
  • IOPL — показывает уровень приоритета ввода-вывода исполняемой программы или задачи: чтобы программа или задача могла выполнять инструкции ввода-вывода или менять флаг IF, её текущий уровень приоритета (CPL) должен быть ≤ IOPL.
  • NT — этот флаг устанавливается, когда текущая задача «вложена» в другую, прерванную задачу, и сегмент состояния TSS текущей задачи обеспечивает обратную связь с TSS предыдущей задачи. Флаг NT проверяется инструкцией IRET для определения типа возврата — межзадачного или внутризадачного.
  • RF — флаг маскирования ошибок отладки.
  • VM — установка этого флага в защищённом режиме вызывает переключение в режим виртуального 8086.
  • AC — установка этого флага вместо с битом AM в регистре CR0 включает контроль выравнивания операндов при обращениях к памяти — обращение к невыравненному операнду вызывает исключительную ситуацию.
  • VIF — виртуальная копия флага IF; используется совместно с флагом VIP.
  • VIP — устанавливается для указания наличия отложенного прерывания; используется совместно с флагом VIF.
  • ID — возможность программно изменить этот флаг в регистре флагов указывает на поддержку инструкции CPUID.[2]

Идентификация процессора

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

К примеру, в процессорах 8086 и 80186 биты 12-15 регистра флагов всегда установлены, в процессорах 80286 и новее биты 12-14 содержат поле IOPL и флаг NT и в реальном режиме всегда сброшены. Это позволяет в 16-битном коде различать процессоры 808x/8018x, 80286 и 80386 (и новее):

Код на языке ассемблера MASM для различения процессоров 8086 — 80386

        pushf                   ; (Сохранить исходное состояние регистра флагов)
        pushf                   ; Скопировать регистр флагов...
        pop ax                  ; ...в регистр AX
        xor ah,11110000b        ; Поменять значение старших 4 битов
        push ax                 ; Скопировать регистр AX
        popf                    ; ...в регистр флагов
        pushf                   ; Скопировать регистр флагов...
        pop bx                  ; ...в регистр BX
        popf                    ; (Восстановить исходное состояние регистра флагов)
        xor ah,bh               ; AH=0 (биты в регистре флагов не поменялись) → 808x-80286, иначе 80386+
        and bh,11110000b        ; BH=F0h (все 4 бита установлены) → 808x/8018x, 0 → 80286

Также, флаг AC (бит 18), введённый в 80486, всегда сброшен в 80386, что и позволяет различить эти процессоры:

Код на языке ассемблера MASM для различения процессоров 80386 и 80486

        and sp,not 3            ; Выравнять стек, чтобы не было ошибок выравнивания при обращении к нему
        pushfd                  ; (Сохранить исходное состояние регистра флагов)
        pushfd                  ; Скопировать регистр флагов. ..
        pop eax                 ; ...в регистр EAX
        xor eax,40000h          ; Поменять значение бита 18 (флаг AC)
        push eax                ; Скопировать регистр EAX
        popfd                   ; ...в регистр флагов
        pushfd                  ; Скопировать регистр флагов...
        pop ecx                 ; ...в регистр ECX
        popfd                   ; (Восстановить исходное состояние регистра флагов)
        xor eax,ecx             ; EAX=0 (бит в регистре флагов не поменялся) → 80386

Аналогично, в старых моделях 80486, где инструкция CPUID ещё не введена, флаг ID (бит 21) всегда сброшен, что позволяет идентифицировать процессоры 80386 и старые модели 80486:

Код на языке ассемблера MASM для определения старых 80486

        pushfd                  ; (Сохранить исходное состояние регистра флагов)
        pushfd                  ; Скопировать регистр флагов...
        pop eax                 ; ...в регистр EAX
        mov ecx,eax             ; . ..и в регистр ECX
        or eax,200000h          ; Установить бит 21 (флаг ID)
        push eax                ; Скопировать регистр EAX
        popfd                   ; ...в регистр флагов
        pushfd                  ; Скопировать регистр флагов...
        pop eax                 ; ...в регистр EAX
        popfd                   ; (Восстановить исходное состояние регистра флагов)
        xor eax,ecx             ; EAX=0 (бит в регистре флагов не устанавливался) → 80386/старые 80486

См. также

  • Флаг (компьютерная техника)

Примечания

  1. 3.4.3. EFLAGS Register // The IA-32 Intel Architecture Software Developer’s Manual. — Intel, 2004. — Т. 1: Basic Architecture. Order number: 253665-013
  2. 1 2 Инструкция CPUID была добавлена в поздних версиях процессора 80486 и процессоре Pentium. См.: CPUID — CPU Identification // The IA-32 Intel Architecture Software Developer’s Manual.  — Intel, 2004. — Т. 2A: Instruction Set Reference, A-M. Order number: 253666-013
  3. 8.1.3. Branching and Conditional Moves on Condition Codes // The IA-32 Intel Architecture Software Developer’s Manual. — Intel, 2004. — Т. 1: Basic Architecture. Order number: 253665-013
  4. В архитектуре P6 были введены инструкции FCOMI, FCOMIP и т. п., которые в результате сравнения устанавливают флаги в регистре флагов напрямую. Ранее это было невозможно, поскольку сопроцессор реализовывался отдельной микросхемой, и только начиная с 80486DX сопроцессор начали встраивать в процессор.
Это заготовка статьи о компьютерах. Вы можете помочь проекту, исправив и дополнив её.
Это примечание по возможности следует заменить более точным.

Флаговый регистр микропроцессора 8086

Улучшить статью

Сохранить статью

  • Уровень сложности: Средний
  • Последнее обновление: 29 ноя, 2022

  • Читать
  • Обсудить
  • Улучшить статью

    Сохранить статью

    Необходимое условие – Флаговый регистр в микропроцессоре 8085 Флаговый регистр является регистром специального назначения. В зависимости от значения результата после любой арифметической и логической операции биты флага устанавливаются (1) или сбрасываются (0). Рисунок — Формат регистра флагов Всего в 8086 имеется 9 флагов, и регистр флагов делится на два типа: (a) Флаги состояния — В микропроцессоре 8086 имеется 6 регистров флагов, которые устанавливаются (1) или сбрасываются ( 0) в зависимости от состояния после 8-битной или 16-битной операции. Эти флаги являются условными/статусными. 5 из этих флагов такие же, как и в случае микропроцессора 8085, и их работа такая же, как и в микропроцессоре 8085. Шестой — флаг переполнения. 6 флагов состояния:

    1. Знак флага (S)
    2. нулевой флаг (z)
    3. Вспомогательный флаг переноса (AC)
    4. Патижный флаг (P)
    5. Farry Flag (Cy Cys) . флаги определяются здесь
    6. Флаг переполнения (O) – Этот флаг будет установлен (1), если результат подписанной операции слишком велик, чтобы соответствовать количеству битов, доступных для его представления, в противном случае сбрасывается (0). После любой операции, если D[6] генерирует любой перенос и передает D[7] ИЛИ если D[6] не генерирует перенос, но генерирует D[7], устанавливается флаг переполнения, т. е. 1. Если D[6] и D[7] оба генерируют перенос или оба не генерируют перенос, тогда флаг переполнения сбрасывается, т. е. 0, Пример: При добавлении байтов 100 + 50 (результат не находится в диапазоне -128…127), поэтому будет установлен флаг переполнения.
     MOV AL, 50 (50 — это 01010000, что положительно)
    MOV BL, 32 (32 — это 00110010, что положительно)
    ADD AL, BL (82 равно 10000010, что отрицательно) 
    1. Флаг переполнения был установлен, так как мы добавили 2 числа +ve и получили число -ve.

    (b) Флаги управления – Флаги управления включают или отключают определенные операции микропроцессора. В микропроцессоре 8086 есть 3 управляющих флага, а именно:

    1. Флаг направления (D) — Этот флаг специально используется в строковых инструкциях. Если установлен флаг направления (1), то доступ к строковым данным осуществляется из верхней ячейки памяти в нижнюю. Если флаг направления сброшен (0), то доступ к строковым данным осуществляется из более низкой ячейки памяти в сторону более высокой ячейки памяти.
    2. Флаг прерывания (I) – Этот флаг предназначен для прерываний. Если флаг прерывания установлен (1), микропроцессор будет распознавать запросы на прерывание от периферийных устройств. Если флаг прерывания сброшен (0), микропроцессор не будет распознавать запросы на прерывание и будет их игнорировать.
    3. Флаг ловушки (T) — Этот флаг используется для отладки на кристалле. Установка флага trap переводит микропроцессор в пошаговый режим для отладки. В одношаговом режиме микропроцессор выполняет инструкцию и входит в одношаговую ISR. Если флаг trap установлен (1), ЦП автоматически генерирует внутреннее прерывание после каждой инструкции, позволяя проверять программу по мере ее выполнения инструкция за инструкцией. Если флаг ловушки сброшен (0), никакая функция не выполняется.

    Статьи по теме

    Что нового

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

    CS 301 Лекция

    CS 301 Лекция Лекция CS 301, д-р Лоулор

    Регистр «EFLAGS» на платформе x86 хранит набор флагов, как показано на стр. 73 тома руководства по архитектуре Intel. 1. Важные флаги включают в себя:

    • ZF— «Нулевой флаг». Устанавливается всякий раз, когда предыдущий арифметический результат был нулевым. Может использоваться «jz» (переход, если последний результат был нулевым) или Инструкции «Джинз». «je» (перейти, если равно) и «jne» (перейти, если не равно) просто псевдонимы jz и jnz, потому что если разница равна нулю, то эти два значения равны. Например, этот код проверяет, равен ли ввод 5:
       extern read_input 
      call read_input
      sub eax,5 ; вычесть пять (также устанавливает все флаги типа "cmp eax,5"!)
      je равно
      добавить eax, 100 ; Если не равно, добавьте
      equal: ret; Если равно, просто верните

      (Попробуйте сейчас в NetRun!)


    • CF— «нести флаг». Содержит бит, который выполняет сложение или вычитание. Может использоваться инструкцией «jc» (переход, если установлен флаг переноса). Устанавливаются все арифметические инструкции. Можно добавить в другую арифметическую операцию с помощью «adc» (добавить с помощью нести). Например, вы можете сохранить бит, выходящий за пределы добавить с использованием последующего adc. Например, здесь мы делаем крошечный 16-битное добавление между cx и si приводит к переполнению. Мы можем поймать бит переполнения и сложите его в следующий более высокий add:
       мов сх,0xf00d ; младшие 16 бит A 
      mov si,0x1111 ; младшие 16 бит B
      mov ax,0x00; старшие 16 бит A
      mov dx,0x00; старшие 16 бит B
      добавить cx,si ; A+=B (младшие 16 бит)
      adc ax,dx ; A+=B (старшие 16 бит)
      ret

      (Попробуйте сейчас в NetRun!)

      • «adc» используется в реализации компилятором 64-битного «long тип данных long» и вообще в «арифметике множественной точности» программное обеспечение, такое как арифметическая библиотека с множественной точностью GNU.
      • Флаг переноса (или флаг переполнения ниже) также можно использовать для реализации проверки переполнения в тщательном компиляторе, таком как Java!
      • Флаги переноса и нуля также используются беззнаковыми сравнение инструкции: «jb» (перейти, если не подписано ниже), «jbe» (перейти, если не подписано ниже или равно), «ja» (переход, если выше не подписан) и «jae» (переход, если без знака выше или равно) довольно очевидным образом. Для Например, перенос означает отрицательный результат, поэтому a
    • SF— «Знаковый флаг», указывающий на отрицательный *подписанный* результат. Используется вместе с OF для реализации сравнения со знаком.
    • OF— «Флаг переполнения». Установить путем вычитания, сложения и сравнения, а также используется в подписанных инструкциях сравнения «jl» (переход, если меньше), «jle» (переход, если меньше или равно), «jg» (переход, если больше) и Инструкции «jge» (переход, если больше или равно). Если вы вглядеться в него достаточно пристально, можно прочитать определения, точно выработать что делают SF и OF, и убедите себя, что они поступают правильно. Они делают. Например:
      • jae: без знака >=. Переходит, если CF==0. Хорошо, мы только что вычислил a-b и хочет перейти, если a>=b. Если a-b положительный (или ноль), тогда CF==0 и a>=b, поэтому мы должны прыгнуть и сделать. Если а-б отрицательно, мы получим перенос, CF==1, и мы не будем прыгать.
      • jge: подписано >=. Переходит, если SF==OF. Обычно мы не переполнялся, поэтому OF равно нулю, и это точно так же, как jae дело выше. Напомним, что это сравнение со знаком, поэтому мы можем получить переносите, если мы сравниваем отрицательные числа, так что не стоит смотреть на СР. Любопытно, что если мы переполнились, бит знака теперь неправильный, так что если OF — это единица, мы сравниваем SF с единицей, что возвращает сравнение назад. снова правильный путь.
    • PF и AF — действительно причудливые древние флаги, пережитки 8-го века. битые дни. Оба они работают только с младшими 8 битами результат. PF возвращает нечетную четность, как для последовательного коммуникация. AF указывает на перенос из младших 4 битов вверх в старшие 4 бита, которые используются для древней техники «бинарного кодированное десятичное число» (BCD), где «0x23» означает десятичное число двадцать три, а не тридцать пять, как обычный шестнадцатеричный. Это противно, теперь ушло, и хорошо избавление!
    Вы также должны знать, какие инструкции устанавливают какие флаги. Например, «cmp», «и» (побитовое И), «суб» и инструкции «добавить» устанавливают все флаги; «inc» (увеличение на 1) и «dec» (уменьшить на 1) установить все, кроме CF; в то время как «движение» и прыжок инструкции не путаются с флагами. Легко случайно перезаписать важные для вас флаги, если вы оставите слишком много данных между время установки флага и время его чтения!

    На самом деле вы можете просмотреть большинство флагов с помощью инструкции «lahf», которая копирует важные биты EFLAGS в регистр ah, т.

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

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