2016-10-02 10 views
0

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

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

mov al, 0 
shl al, 1 

Но я хочу знать, есть ли другой способ сделать это, без использования другого результата команды.
А также я хочу знать, способ, которым вы меня научите, может фактически изменить все флаги, а не только CF, OF, ZF и т. Д.

+0

Возможно, sahf/popf? – Leeor

+0

Да, вы правы! Большое спасибо! вы очень помогли мне – Argaman

+0

Carry имеет специальные инструкции (в ответ), но если вам повезет, иногда вы можете просто изменить порядок своего кода, например, если вам удастся сделать некоторые и/или/xor раньше rcr, это сделало бы CF = 0 тоже. Часть сборки «игра в гольф» заключается в том, чтобы заказать свою инструкцию таким образом, чтобы даже побочные продукты были повторно использованы - когда это возможно. Но такой код сложнее читать и понимать, поэтому 'clc' идеально подходит для вас. Если вам нужно изменить флаг (RCL - это действительная потребность), то очень вероятно, что у процессора есть какой-то способ, команда, установленная в целом, прекрасно работает вместе (хотя иногда это не очевидно). – Ped7g

ответ

1

Нет инструкций, которые относятся к eflags как GP-регистр чтения-записи.
Цитирование Intel :

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

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

eflags content

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

В флаги управления группы есть только 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 только копирует флаги статуса.

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

+0

wow большое спасибо – Argaman

 Смежные вопросы

  • Нет связанных вопросов^_^