Is:Является ли PUSHQ POPFQ самым прямым способом установить флаги на x86_64?
PUSHQ %reg
POPFQ
самый прямой способ установить флаги на x86_64?
Is:Является ли PUSHQ POPFQ самым прямым способом установить флаги на x86_64?
PUSHQ %reg
POPFQ
самый прямой способ установить флаги на x86_64?
Все зависит от флага.
Некоторые флаги позволяют установить бит непосредственно. Например, STC
, чтобы установить флаг переноса и CLC
, чтобы очистить флаг переноса. Если вы хотите управлять, скажем, Trap Flag, вы должны сделать что-то вроде этого (предполагая, что NASM и 16 разрядную сборку):
pushf
pop ax
or ax, 0x100
push ax
popf
Конечно, вы можете также установить или очистить флаги косвенно. Например:
xor ax, ax
Этот код, наиболее непосредственно, устанавливает ноль на ноль через XOR. Косвенно, он имеет побочный эффект установки как ZF (флаг нуля), так и PF (флаг четности). Аналогичные типы косвенных способов манипулирования флагами обычно доступны для большинства бит флагов.
Я бы добавил, что в стороне, что механизм, который вы используете в своем вопросе, может иметь непреднамеренные последствия. Гораздо лучше применить флаги, изменить конкретные флаги, которые вас интересуют, и затем поместить флаги. Произвольное появление определенных значений во флагах может привести к хаосу, если вы не уверены в том, что не будет никаких изменений их изменения (т. Е. Ни один дополнительный код не опирается на флаг сверху).
Действительно, мое приложение предназначено для восстановления ранее сохраненного состояния флагов. – DepressedDaniel
А, тогда это будет особый случай. То, что вы описываете, действительно является правильным методом. –
Не было бы проще просто сделать pushfq; orq $ 0x100, (% rsp); popfq' вместо явной загрузки и хранения? – fuz
Некоторые флаги имеют инструкции прямого набора, например 'stc', обратитесь к набору инструкций Intel для других. –
Флаги неявно задаются многими инструкциями. Это очень зависит от ситуации. Нет общего, «самого прямого пути». – Downvoter
Я не уверен, что вижу, как это слишком широко. –