Вопрос

(IA32) Например,

test $eax, $eax

Почему вы когда-нибудь хотели это сделать? оно делает $eax & $eax, правильно? не должен это всегда Установите регистрацию флага, чтобы сказать, что они равны ..?

Дополнение:Таким образом, тест установит ZF (как упоминалось ниже), если реестр равен нулю. Так что тест (как используется выше), в основном только что используется для того, чтобы сказать, если реестр пуст? и ZF устанавливается, если так?

Это было полезно?

Решение

Это установит ZF (нулевой флаг), если реестр равен нулю. Это, вероятно, то, что он чаще всего используется для тестирования. Это также установит другие флаги соответствующим образом, но, вероятно, гораздо меньше для тех.

Кроме того, я должен упомянуть, что test на самом деле не выполняет сравнение - он выполняет побитовой and Операция (выбрасывая результат, кроме флагов).

Выполнить сравнение операндов, cmp Инструкция будет использоваться, которая выполняет sub Операция, выбрасывая результаты, кроме флагов. Вы исправляетесь, что

cmp $eax, $eax

не будет иметь большого значения, так как флаги будут установлены в соответствии с нулевым результатом каждый раз.

Другие советы

Это устанавливает нулевой флаг, так же, как использует or $eax,$eax Может неразрушающий тест на нулевой флаг также.

Он устанавливает флаги Z и S на процессоре, поэтому вы можете сказать после «тестирования EAX, EAX» (или любого другого регистра 8, 16, 32, и я думаю 64 бита), если значение равно нулю, или если знак знака Набор, используя «JE / JNE / JZ / JNZ» или «JS / JNS» соответственно. За 30 лет кодирования для архитектур X80 / X86 я проделал это огромное количество раз, причем большинство комбинаций регистров. (Вы не используете это на практике на ESP!)

IIRC, есть бит четности, который также рассчитан, поэтому, сделав этот тест, вы можете сказать, если количество битов в реестре даже или нечетное, используя «JP / JNP». У меня есть никогда было использовать для этого.

Эта инструкция не предназначена для проверки только в том случае %eax равен нулю Это может быть в целом используется для проверки, если значение %eax равен нулю или положительным или отрицательным. Самое большое преимущество использования этого, это не модифицирует вале %eax (после выступления %eax & %eax, Он просто отбрасывает значение) и устанавливает флаги условия следующим образом.

Если% значение EAX равно нулю, OF, CF, ZF = 0 (установлен на ноль)
еще SF = MSB of the result (здесь результат %eax & %eax). Так что если число негативно, мы получаем SF = 1, иначе SF = 0.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top