проверка, соответствует ли регистр в ia32 - PullRequest
8 голосов
/ 11 мая 2010

(ia32), например,

test $eax, $eax

Зачем тебе это делать? это $eax & $eax, верно? не должно ли это всегда установить регистр флага, чтобы сказать, что они равны ..?

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

Ответы [ 4 ]

10 голосов
/ 11 мая 2010

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

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

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

cmp $eax, $eax

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

1 голос
/ 16 октября 2012

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

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

1 голос
/ 11 мая 2010

Он устанавливает флаги Z и S на процессоре, так что после «test eax, eax» (или любого другого регистра 8, 16, 32 и, я думаю, 64-битного) вы можете определить, является ли значение нулевым или бит знака устанавливается с помощью «je / jne / jz / jnz» или «js / jns» соответственно. За 30 лет программирования для архитектур x80 / ​​x86 я делал это огромное количество раз, с большинством комбинаций регистров. (Вы не используете это на практике на ESP!)

IIRC, также рассчитывается бит четности, поэтому с помощью этого теста вы можете определить, является ли число битов, установленных в регистре, четным или нечетным, используя "jp / jnp". Я никогда не использовал это.

1 голос
/ 11 мая 2010

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

...