Тест работает так же, как cmp?

Мне интересно, можно ли использовать тестовую инструкцию так же, как cmp. Скажем:

cmp %eax,%ebx
jg some_random_place

Это переходит к some_random_place при условии, что %ebx больше, чем %eax, теперь, если я это сделаю:

test %eax, %ebx
jg some_random_place

При каких условиях это происходит?


person Setzer22    schedule 04.03.2014    source источник


Ответы (1)


No!

Инструкция cmp %eax,%ebx похожа на инструкцию sub %eax,%ebx, но с инструкцией cmp регистры после выполнения остаются неизменными, за исключением регистра флагов.

Инструкция test %eax,%ebx похожа на инструкцию and %eax,%ebx, но с инструкцией test регистры после выполнения остаются неизменными, кроме регистра флага. Затронутые флаги: Carry = 0, Zero = x, Overflow = 0 и Sign = x.

Инструкция jg должна выполнить переход, если нулевой флаг = 0 и знаковый флаг = переполнение.

Так что на всякий случай...

test %eax, %ebx
jg some_random_place

... переход должен быть выполнен, если результат and %eax,%ebx положительный, а не 0.

person GJ.    schedule 04.03.2014
comment
Спасибо! После того, как я задал вопрос, я сам добрался до части флага, но я не мог понять, как двоичный файл и может поднять флаг переполнения, и до сих пор этого не делает. Не могли бы вы объяснить мне последнюю часть? В остальном, очень хороший и ясный ответ! - person Setzer22; 05.03.2014
comment
and или test никогда не поднимают флаг переполнения, но, как я уже писал, очищаются только после выполнения инструкции. - person GJ.; 05.03.2014
comment
О, значит, sign_flag = overflow можно перевести в sign_flag равным нулю, что означает, что число положительное, верно? Теперь я понял! Спасибо - person Setzer22; 05.03.2014