testgibi andsadece değiştirilmemiş hem girdileri bırakarak BAYRAK yazar hariç. İki farklı girişle, bazı bitlerin tümünün sıfır olup olmadığını veya en az birinin ayarlanmış olup olmadığını test etmek için kullanışlıdır. (örneğin test al, 3, EAX 4'ün katı ise (ve bu nedenle her iki düşük 2 biti de sıfırlanmışsa) ZF'yi ayarlar.
test eax,eaxTüm bayrakları tamamen aynı şekilde ayarlar cmp eax, 0olur :
- CF ve OF temizlendi (VE / TEST bunu her zaman yapar; sıfır çıkarmak asla bir taşıma oluşturmaz)
- EAX'teki değere göre ZF, SF ve PF. (
a = a&a = a-0).
(Her zamanki gibi PF yalnızca düşük 8 bit'e göre ayarlanır )
Eski AF (ASCII / BCD talimatları tarafından kullanılan yardımcı taşıma bayrağı) hariç. TEST onu tanımsız bırakır , ancak CMP onu "sonuca göre" ayarlar . Sıfırın çıkarılması 4. bitten 5. bite bir taşıma üretemeyeceğinden, CMP her zaman AF'yi temizlemelidir.
TEST daha küçüktür (ani değildir) ve bazen daha hızlıdır (CMP'den daha fazla durumda daha fazla CPU üzerinde bir karşılaştırma ve dallanma ile makro kaynaşabilir). Bu, testbir kaydı sıfıra karşı karşılaştırmak için tercih edilen deyimi yapar . cmp reg,0Anlamsal anlamı ne olursa olsun kullanabileceğiniz bir gözetleme deliği optimizasyonudur .
CMP'yi anında 0 ile kullanmanın tek yaygın nedeni, bir bellek işleneni ile karşılaştırmak istediğiniz zamandır. Örneğin, cmpb $0, (%esi)örtük uzunlukta bir C tarzı dizenin sonunda sonlandırıcı bir sıfır baytı kontrol etmek için.
AVX512F eklerkortestw k1, k2 ve AVX512DQ / BW (Skylake-X ama KNL değil) ekler ktestb/w/d/q k1, k2, bu AVX512 maske kayıtları (k0..k7) üzerinde çalışır, ancak yine testde tam sayı ORveya ANDtalimatlarda olduğu gibi normal FLAGS ayarlar . (SSE4 ptestveya SSE gibi sıralama ucomiss: SIMD etki alanındaki girişler ve tamsayı BAYRAKLAR ile sonuçlanır.)
kortestw k1,k1SSE / AVX2 (v)pmovmskb/ps/pd+ testveya yerine geçerek, AVX512 karşılaştırma sonucuna göre dallanma / cmovcc / setcc'nin deyimsel yoludur cmp.
Kullanımı jzvs. jekafa karıştırıcı olabilir.
jzve jekelimenin tam anlamıyla aynı talimattır , yani makine kodunda aynı işlem kodu. Aynı şeyi yaparlar, ancak insanlar için farklı anlamsal anlamları vardır . Dağıtıcılar (ve genellikle derleyicilerden gelen asm çıktısı) yalnızca bir tane kullanır, bu nedenle anlamsal ayrım kaybolur.
cmpve subiki girişi eşit olduğunda ZF'yi ayarlayın (yani çıkarma sonucu 0'dır). je(eşitse zıpla) anlamsal olarak ilişkili eşanlamlı.
test %eax,%eax/ and %eax,%eaxsonuç sıfır olduğunda ZF'yi tekrar ayarlar, ancak "eşitlik" testi yoktur. Testten sonra ZF size iki işlenenin eşit olup olmadığını söylemez. Yani jz(sıfırsa zıpla) anlamsal olarak alakalı eşanlamlı.