Основната разлика между теста и CMP
Основната разлика между теста и CMP
В резултат на СМР и тест събрание инструкция променя състоянието на нула флаг (ZF). Това е всичко, което е общото! Опасно е да се предположи, че тези инструкции са подобни и още повече да се каже, че и двете се извърши сравнението. Под границата - в основата на такава смелост изявление :)
Важен момент: логика нула флаг (ZF). Тя се издига (равна на една) когато резултатът от операцията е нула, т.е. всички битове на резултата - нула.
СМР инструкция (съкратено от сравнение -. сравнявате) сравнява две стойности - паметта на регистър, незабавно стойност, - и комплекти / нулира флага ZF. В този процесор, получаване на СМР инструкция изчислява разликата на посочените стойности. Сега трябва да се разбира, че ако стойностите са равни, резултат на изваждане е 0, така че да лежи нула флаг (ZF = 1). например:
Забележка. СМР инструкция се различава от съответната подсистема (изваждане - изваждане), който засяга само знамената регистрират.
инструкциите за теста. След получаване на тази команда, процесорът изпълнява операция И (логично и) с два операнда. Т.е. Извършва побитова логично умножение. Ако логично И ще се върне само нули, а след това вдигна ZF на знамето. тест инструкция се отразява само на флаговете се регистрират, в която се различава от инструкциите И. например:
Заключения. На първо място, СМР и тест се отрази на нула флаг в обратна посока. На второ място, не можете да използвате командата тест за проверка на стойностите на равенство! например:
Ние сравняваме еднакви / различни числа, а преходът се извършва във всеки случай! Ако вместо това на теста постави СМР, първият преход не се изпълнява. Защо такъв странен тест? Радвайки се на рекордни стойности в двоичен SI:
5 (10) = 0101 (2)
4 (10) = 0100 (2)
В резултат на инструкциите за теста:
тест 5,5: 0101 И 0101 = 0101
тест 5,4: 0100 = 0101 и 0100
Резултатите от двете операции са бита равни на един, така че нула флаг не се разбира. Ето защо не може да се позовава на сравнение на ценности.
Така че, тест команда се използва за проверка на състоянието на битови флагове и т.н. Има друго приложение - проверка регистрирате нулеви стойности:
тест EAX, EAX
JZ someLabel; прехода се изпълнява само ако EAX = 0
Обясни колко дълго може да се :) не може да разбере логиката, особено като се има предвид, че тестът и СМР - подобно на команди предназначение. Надяваме се, че разликата е ясно определена.