Одна инструкция для очистки PF (Parity Flag) - получить нечетное количество бит в регистре результатов - PullRequest
3 голосов
/ 16 июля 2010

В сборке x86 возможно ли сбросить флаг четности в одной и только одной инструкции, работающей в любой исходной конфигурации регистра?

Это эквивалентно созданию регистра результата с нечетным числом битов с любой операцией, которая устанавливает флаги (явно исключая mov).

Для контраста, установить флаг четности можно в одной инструкции:

cmp bl, bl

И существует много способов очистки флага четности с помощью двух инструкций:

and bl, 0 
or  bl, 1

Однако метод с одной инструкцией остается неуловимым.

Ответы [ 3 ]

3 голосов
/ 21 ноября 2017

Попробуйте:

foo:  cmp byte [foo],0x7F

Примечание. Первый байт этой инструкции cmp равен 0x80, а 0x80-0x7F = 0x01.

2 голосов
/ 16 июля 2010

Невозможно.

Ни одна из команд смены PF не может безусловно привести к результату нечетного контроля при применении к двум копиям или регистру (например, или al, al ).Аналогично, ни одна из арифметических команд не выдает результат нечетной четности при применении к регистру и константу, которая полностью определяет результат (например, и al, 0 или или al, ffh ),Что касается команд, где вторым операндом является любая другая константа, результат будет зависеть от начального значения регистра, и мы не можем это контролировать.

Если бы мы знали некоторые детали среды выполнения, это могло быможно использовать содержимое памяти по общеизвестному адресу.На ПК, совместимом в реальном режиме, вы можете положиться на структуры данных BIOS.В MS-DOS то же самое для исполняемого заголовка.

0 голосов
/ 16 июля 2010

Я думаю, что единственный способ сделать это, кроме mov (я чувствую запах интервью), - это найти (чудесным образом, по общему признанию) регистр или пару регистров, которая удовлетворит TEST src, dst.См. здесь , Эксплуатация.

В данный момент на ум не приходит такая пара регистров / регистров x86, которая могла бы удовлетворить это условие.

...