Как поменять флаги вручную (в ассемблерном коде) для 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
Регистр делится на три группы: флаги состояния, флагиуправления и системные флаги.
Из флагов состояния можно напрямую манипулировать только CF clc
, stc
, cmc
,
Там нет инструкции для чтения CF, но вы можете прочитать его косвенно с помощью инструкций, таких как cmovcc
, adc
, setcc
, Все остальные флаги необходимо изменить с помощью специально разработанных арифметических инструкций или путем копирования содержимого группы состояния eflags
в ah
(с lahf
) или стек (с pushfd
) а потом обратно в eflags
(с sahf
или же 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.