jest podobny do and
, z wyjątkiem tego, że zapisuje tylko FLAGI, pozostawiając oba wejścia niezmodyfikowane. Z dwoma różnymi wejściami , jest to przydatne do testowania, czy niektóre bity są zerowe, lub jeśli przynajmniej jeden jest ustawiony. (na przykład.test al, 3
ustawia ZF, jeśli EAX jest wielokrotnością 4 (a zatem ma oba niskie 2 bity wyzerowane).
test eax,eax
zestawy Wszystkie flagi dokładnie taki sam sposób, w jaki cmp eax, 0
by:
- CF i rozjaśniająca (i/TEST zawsze to robi, a odjęcie zera nigdy produkuje carry)
- ZF, SF i PF zgodnie z wartością w EAX. (
a = a&a = a-0
)
(wyjątkiem przestarzałego flagą AF (pomocniczy carry, wykorzystywanych przez instrukcje ASCII/BCD). TEST leaves it undefined, ale CMP sets it "according to the result". Od odjęcie zera nie może produkować carry od 4 do 5 bitów, CMP powinien zawsze usuwać AF).
TEST jest mniejsza (natychmiastowego), a czasem szybciej (można makro-bezpiecznik w UOP porównać i-oddział na więcej procesorów w większej liczbie przypadków niż CMP). That makes test
the preferred idiom for testing a register for zero or not.
Jedynym częstym powodem używania CMP z bezpośrednim 0 jest porównanie z operandem pamięci (na przykład cmpb $0, (%esi)
, aby sprawdzić końcowy bajt zerowy na końcu ciągu znaków w stylu C o niejawnej długości) .
AVX512F dodaje kortestw k1, k2
i AVX512DQ/BW (Skylake ale nie KNL) dodać ktestb/w/d/q k1, k2
, które działają na rejestrach AVX512 Maska (k0..k7), ale nadal określonych regularnych FLAGI jak test
robi, w taki sam sposób, że liczby całkowite OR
lub AND
do zrobienia.
kortestw k1,k1
jest idiomatycznych sposobem na Oddziale/cmovcc/setcc oparciu o AVX512 porównać wynik, zastępując SSE/AVX2 (v)pmovmskb/ps/pd
+ test
lub cmp
.
Zastosowanie jz
vs. je
może być mylące.
jz
and je
are literally the same instruction, tj. Ten sam kod operacji w kodzie maszynowym. Robią to samo, ale mają inne znaczenie semantyczne dla ludzi. Dezasemblery (i zazwyczaj asm wyprowadzane z kompilatorów) użyją tylko jednego, więc rozróżnienie semantyczne zostanie utracone.
cmp
i sub
ustawić ZF, gdy ich dwa wejścia są równe (tj. Wynik odejmowania wynosi 0). je
(jump if equal) jest semantycznie istotnym synonimem.
test %eax,%eax
/and %eax,%eax
ponownie ustawia ZF, gdy wynik wynosi zero, ale nie ma testu "równości". ZF po teście nie mówi, czy oba argumenty były równe. Tak więc jz
(przeskok, jeśli zero) jest semantycznie istotnym synonimem.
Zrobiłem edycję, aby zmienić tę popularną odpowiedź w lepszą kanoniczną odpowiedź na pytanie "czym jest ta TEST, a czym różni się od CMP", co jest w pewien sposób dorozumiane. Zobacz moją własną odpowiedź na dalsze komentarze dotyczące semantycznego znaczenia synonimicznego JE i JZ. Przejrzyj moją edycję, ponieważ jest dość poważna i wciąż jest twoją odpowiedzią. –
@PeterCordes Doceniam zamiar, ale zamierzam przywrócić twoją edycję. 1. Twój "głos" bardzo różni się od mojego, a teraz brzmi znacznie bardziej jak twoja odpowiedź niż moja. 2. Bardziej problematyczne jest pogrubione twierdzenie, że flagi wychodzą dokładnie tak samo pomiędzy 'test' i' cmp'. Tak, rozumiem, że to twoje przekonanie oparte na twoich komentarzach do Cody'ego. Jednak umieszczenie go w moim poście to inna sprawa; nie jest to stwierdzenie, które chcę podtrzymać, po prostu dlatego, że nie wiem, czy jest identyczne we wszystkich przypadkach. –
@PeterCordes Rozumiem chęć posiadania "kanonicznej" odpowiedzi, ale myślę, że twoja odpowiedź musi pływać lub zatapiać się na własnych zaletach, zamiast piggyback na zaakceptowanej odpowiedzi. Musiałem to zrobić również w przypadku niektórych moich odpowiedzi na bardzo popularne pytania, takie jak [zmiennoprzecinkowe] (http://stackoverflow.com/a/27030789/13), które w momencie publikacji mojego Odpowiedź już zawierała inne odpowiedzi z ponad 500 wyższymi nagrodami. –