test
gibi and
sadece 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,eax
Tüm bayrakları tamamen aynı şekilde ayarlar cmp eax, 0
olur :
- 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, test
bir kaydı sıfıra karşı karşılaştırmak için tercih edilen deyimi yapar . cmp reg,0
Anlamsal 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 test
de tam sayı OR
veya AND
talimatlarda olduğu gibi normal FLAGS ayarlar . (SSE4 ptest
veya SSE gibi sıralama ucomiss
: SIMD etki alanındaki girişler ve tamsayı BAYRAKLAR ile sonuçlanır.)
kortestw k1,k1
SSE / AVX2 (v)pmovmskb/ps/pd
+ test
veya yerine geçerek, AVX512 karşılaştırma sonucuna göre dallanma / cmovcc / setcc'nin deyimsel yoludur cmp
.
Kullanımı jz
vs. je
kafa karıştırıcı olabilir.
jz
ve je
kelimenin 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.
cmp
ve sub
iki 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,%eax
sonuç 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ı.