x86 ASM: инструкция TEST с более чем 1 битом - PullRequest
0 голосов
/ 18 ноября 2018

Я играю с инструкцией TEST сборки, но в настоящее время она меня смущает.

AX = 1110xB

При тестировании одного бита,

, если оно установленотогда zf = 0 (т. е. TEST AX, 0001xB)

, если он не установлен, то zf = 1 (т. е. TEST AX, 0010xB)

На данный момент все в порядке, но проблема (илимоя путаница) - это когда я хочу проверить несколько битов в одной инструкции TEST.Если установлен только один из проверенных битов, то zf = 0.Например:

AX = 1110xB

TEST AX, 0110xB -> zf = 0 (установлены оба бита)

TEST AX, 0011xB -> zf = 0 (только1 бит установлен, но я запросил 2 бита)

TEST AX, 1110xB -> zf = 0 (три бита установлены)

Вопрос: как проверить несколькобиты и ожидают положительного результата (zf = 0) только если все проверенные биты равны "1"?Например, как в C / C ++, когда вы используете логическое & для проверки маски битов (10101101 & 00000101) ... Или я должен тестировать один бит сразу в сборке?

Моя программа выдает "отрицательный", еслибит (ы) не установлены, но дают «положительный» результат, если установлен хотя бы 1 бит, а не все протестированные биты равны 1.

Я пробовал с двумя разными отладчиками, и результат один и тот же.

Спасибо за ваши комментарии

1 Ответ

0 голосов
/ 18 ноября 2018

Вы не можете проверить наличие нескольких ненулевых битов одной инструкцией;как вы заметили, ZF устанавливается в зависимости от того, есть ли какие-либо ненулевые биты в результате.

Обычный метод -

and  AX, mask        ; clear all the non-mask bits
cmp  AX, mask        ; check that all the mask bits *are* set
je  all_bits_set

(где mask - это регистр или тот же самый элемент, который вы используете дважды.)

Если вам нужно сделать это, не разрушая AX, вам нужно скопировать регистр куда-нибудь еще или сохранить / восстановить старое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...