(ia32), например,
test $eax, $eax
почему Вы когда-либо хотели бы сделать это? это делает $eax & $eax
, право? не был должен это всегда устанавливать регистр флага, чтобы сказать, что они равны..?
приложение: таким образом, тест установит ZF (как упомянуто ниже), если регистр будет нулем. так тест (как используется выше), главным образом просто раньше говорили, пуст ли регистр? и ZF установлен раз так?
Он установит ZF
(нулевой флаг), если регистр равен нулю. Это, вероятно, то, что чаще всего используется для проверки. Он также установит другие флаги, но они, вероятно, используются гораздо реже.
Также следует отметить, что test
на самом деле не выполняет сравнения - он выполняет побитовую операцию и
(отбрасывая результат, за исключением флагов).
Для сравнения операндов используется инструкция cmp
, которая выполняет операцию sub
, отбрасывая результаты за исключением флагов. Вы правы, что a
cmp $eax, $eax
не имеет особого смысла, так как флаги будут устанавливаться каждый раз в соответствии с нулевым результатом.
Это установка нулевого флага, точно так же, как использование или $eax,$eax
может недеструктивно проверить и нулевой флаг.
Он устанавливает флаги Z и S на процессоре, поэтому после команды "test eax,eax" (или любого другого регистра 8, 16, 32 и, кажется, 64 бит) вы можете узнать, равно ли значение нулю или установлен ли бит знака, используя "je/jne/jz/jnz" или "js/jns" соответственно. За 30 лет кодирования для архитектур x80/x86 я делал это огромное количество раз, с большинством комбинаций регистров. (Вы не используете это на практике на ESP!)
IIRC, есть бит четности, который тоже вычисляется, так что, выполнив этот тест, вы можете определить, четное или нечетное количество битов, установленных в регистре, используя "jp/jnp". Я никогда не пользовался этим.