stringtranslate.com

Регистр ФЛАГОВ

Регистр FLAGS — это регистр состояния , который содержит текущее состояние процессора x86 . Размер и значение битов флага зависят от архитектуры. Обычно он отражает результат арифметических операций, а также информацию об ограничениях, наложенных на работу ЦП в текущий момент. Некоторые из этих ограничений могут включать предотвращение запуска некоторых прерываний, запрет выполнения класса «привилегированных» инструкций. Дополнительные флаги состояния могут обходить отображение памяти и определять, какое действие должен предпринять ЦП при арифметическом переполнении.

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

В архитектуре i286 ширина регистра составляет 16 бит . Его преемники, регистры EFLAGS и RFLAGS (в современном x86-64 ), имеют ширину 32 и 64 бита соответственно. Более широкие регистры сохраняют совместимость со своими меньшими предшественниками.

ФЛАГИ

Примечание. Столбец маски в таблице представляет собой битовую маску AND (в виде шестнадцатеричного значения) для запроса флага(ов) в значении регистра FLAGS.

Применение

Все регистры FLAGS содержат коды условий , биты флагов, которые позволяют результатам одной инструкции машинного языка влиять на другую инструкцию. Арифметические и логические инструкции устанавливают некоторые или все флаги, а инструкции условного перехода выполняют переменное действие в зависимости от значения определенных флагов. Например, jz(Перейти при нуле), jc(Перейти при переносе) и jo(Перейти при переполнении) зависят от конкретных флагов. Другие условные переходы проверяют комбинации нескольких флажков.

Регистры FLAGS можно перемещать из стека или в стек. Это часть работы по сохранению и восстановлению контекста ЦП в отношении такой процедуры, как программа обслуживания прерываний, изменения в регистрах которой не должны быть видны вызывающему коду. Вот соответствующие инструкции:

В 64-битном режиме PUSHF/POPF и PUSHFQ/POPFQ доступны, а PUSHFD/POPFD — нет. [8] : 4–349, 4–432. 

Младшие 8 бит регистра FLAGS также открыты для прямых манипуляций с загрузкой/сохранением с помощью SAHF и LAHF (загрузка/сохранение AH во флаги).

Пример

Возможность загрузки и извлечения регистров FLAGS позволяет программе манипулировать информацией в FLAGS способами, для которых не существуют инструкции на машинном языке. Например, инструкции cldи stdочищают и устанавливают флаг направления (DF) соответственно; но нет инструкции по дополнению DF. Этого можно добиться с помощью следующего ассемблерного кода :

 ; Это код 8086 с 16-битными регистрами, помещенными в стек, ; а регистр флагов в этом процессоре имеет длину всего 16 бит. толчок ; Используйте стек, чтобы перенести поп -топор ФЛАГОВ ; … в регистр AX вставьте ax ; и скопируйте их обратно в стек для хранения xor ax , 400h ; Переключить (инвертировать, «дополнить») только DF; остальные биты не изменяются push ax ; Используйте стек еще раз, чтобы переместить измененное значение popf ; … в регистр FLAGS ; Вставьте сюда код, который требовал, чтобы флаг DF был дополнен popf ; Восстановите исходное значение ФЛАГОВ.             

Манипулируя регистром FLAGS, программа может определить модель установленного процессора. Например, флаг выравнивания можно изменить только на 486 и выше. Если программа пытается изменить этот флаг и обнаруживает, что изменение не сохранилось, значит, процессор старше 486.

Начиная с Intel Pentium , инструкция CPUID сообщает модель процессора. Однако описанный выше метод остается полезным для различения более ранних моделей.

Смотрите также

Рекомендации

  1. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF) . Том. 1. Май 2012. С. 3–21.
  2. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF) . Том. 1 декабря 2016 г. с. 78.
  3. ^ abc «Реверс-инжиниринг кремния: недокументированные флаги 8085». www.righto.com . Проверено 21 октября 2018 г.
  4. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32, Vol. 1. Декабрь 2022 г. стр. 3–16.
  5. ^ NEC, Руководство пользователя 16-битной серии V, номер документа. U11301E, сентябрь 2000 г., с. 186
  6. ^ VIA, Руководство по программированию PadLock, версия 1.66, 4 августа 2005 г., стр. 7-8. Архивировано из оригинала 26 мая 2010 года.
  7. ^ VIA, Замечания по применению альтернативного набора команд процессора VIA C3, версия 0.24, 2002 г. - подробную информацию о флаге EFLAGS.AI см. на рисунке 2 на странице 12 и главе 4 на странице 21.
  8. ^ Руководство разработчика программного обеспечения для архитектур Intel 64 и IA-32 (PDF) . Том. 2Б. Май 2012.