2017-01-28 2 views
2

Is:Является ли PUSHQ POPFQ самым прямым способом установить флаги на x86_64?

PUSHQ %reg 
POPFQ 

самый прямой способ установить флаги на x86_64?

+0

Некоторые флаги имеют инструкции прямого набора, например 'stc', обратитесь к набору инструкций Intel для других. –

+0

Флаги неявно задаются многими инструкциями. Это очень зависит от ситуации. Нет общего, «самого прямого пути». – Downvoter

+0

Я не уверен, что вижу, как это слишком широко. –

ответ

2

Все зависит от флага.

Некоторые флаги позволяют установить бит непосредственно. Например, STC, чтобы установить флаг переноса и CLC, чтобы очистить флаг переноса. Если вы хотите управлять, скажем, Trap Flag, вы должны сделать что-то вроде этого (предполагая, что NASM и 16 разрядную сборку):

pushf 
pop ax 
or ax, 0x100 
push ax 
popf 

Конечно, вы можете также установить или очистить флаги косвенно. Например:

xor ax, ax 

Этот код, наиболее непосредственно, устанавливает ноль на ноль через XOR. Косвенно, он имеет побочный эффект установки как ZF (флаг нуля), так и PF (флаг четности). Аналогичные типы косвенных способов манипулирования флагами обычно доступны для большинства бит флагов.

Я бы добавил, что в стороне, что механизм, который вы используете в своем вопросе, может иметь непреднамеренные последствия. Гораздо лучше применить флаги, изменить конкретные флаги, которые вас интересуют, и затем поместить флаги. Произвольное появление определенных значений во флагах может привести к хаосу, если вы не уверены в том, что не будет никаких изменений их изменения (т. Е. Ни один дополнительный код не опирается на флаг сверху).

+0

Действительно, мое приложение предназначено для восстановления ранее сохраненного состояния флагов. – DepressedDaniel

+0

А, тогда это будет особый случай. То, что вы описываете, действительно является правильным методом. –

+0

Не было бы проще просто сделать pushfq; orq $ 0x100, (% rsp); popfq' вместо явной загрузки и хранения? – fuz