Как поменять флаги вручную (в ассемблерном коде) для 8086?

Есть ли способ изменить каждый флаг вручную? Или вам нужно использовать команду с результатом, который, как вы знаете, изменит их?

В основном я работаю с командой RCLи я не хочу получать 1 в начале, поэтому я хочу изменить CF на 0, и я знаю, что могу использовать такие команды, как:

mov al, 0
shl al, 1

Но я хочу знать, есть ли другой способ сделать это без использования других команд.

Я также хотел бы знать, может ли способ, которым вы можете показать мне, также использоваться для изменения всех флагов, не только CF, но OF, ZF и так далее.

1 ответ

Решение

Там нет никаких инструкций, которые относятся eflags как чтение-запись GP-регистр.
Цитируя Intel1:

Некоторые флаги в регистре EFLAGS можно изменить напрямую, используя специальные инструкции (описанные в следующих разделах). Нет никаких инструкций, которые позволили бы полностью изучить или изменить весь регистр.
Следующие инструкции могут использоваться для перемещения групп флагов в стек процедур или из регистра EAX:
LAHF, SAHF, PUSHF, PUSHFD, POPF и POPFD. После того, как содержимое регистра EFLAGS было передано в стек процедур или регистр EAX, флаги могут быть проверены и изменены с использованием инструкций по обработке битов процессора (BT, BTS, BTR и BTC).

eflags Регистр делится на три группы: флаги состояния, флагиуправления и системные флаги.

содержание Eflags

Из флагов состояния можно напрямую манипулировать только CF clc, stc, cmc,
Там нет инструкции для чтения CF, но вы можете прочитать его косвенно с помощью инструкций, таких как cmovcc, adc, setcc, Все остальные флаги необходимо изменить с помощью специально разработанных арифметических инструкций или путем копирования содержимого группы состояния eflags в ahlahf) или стек (с pushfd) а потом обратно в eflagssahf или же popfd).

В группе Control flags есть только DF, с которым можно манипулировать cld а также std,
Чтобы прочитать текущее значение DF вам нужно использовать pushfd,

Системными флагами обычно манипулируют косвенно, выполняя некоторые привилегированные операции, такие как переключение задачи, переход в режим v86 и т. П.
Если IF можно манипулировать непосредственно с cli а также sti,
Все остальные флаги можно манипулировать только pushfd/popfd,


Для справки:

  • В 64-битном режиме регистр флага rflags но старшие 32 бита пока зарезервированы, тем самым rflags обрабатывается как eflags,
  • pushfd выталкивает eflags в стеке. Существует также 16-битная версия pushf что толкает только младшие 16 бит eflags, То же самое для popfd/popf,
  • lahf/sahf копирует только флаги состояния.

1 Руководства Intel, том 1, раздел 3.4.3.

Другие вопросы по тегам