test
यह पसंद है and
, सिवाय इसके कि यह केवल FLAGS लिखता है, इसके दोनों इनपुटों को बिना अनुमति के छोड़ देता है। दो अलग-अलग इनपुटों के साथ, यह परीक्षण के लिए उपयोगी है कि कुछ बिट्स सभी शून्य हैं, या यदि कम से कम एक सेट है। (उदाहरण के लिए test al, 3
सेट ZF अगर EAX 4 का एक गुणक है (और इस प्रकार इसके निम्न 2 बिट्स शून्य हैं)।
test eax,eax
सभी झंडों को ठीक उसी तरह सेट करता है जिस तरह से cmp eax, 0
होगा :
- CF और OF क्लीयर (और / TEST हमेशा ऐसा करता है; शून्य को घटाना कभी भी कैरी नहीं पैदा करता है)
- EAX में मान के अनुसार ZF, SF और PF। (
a = a&a = a-0
)।
(पीएफ हमेशा की तरह कम 8 बिट्स के अनुसार सेट किया गया है )
अप्रचलित वायुसेना (सहायक-कैरी झंडा, एएससीआईआई / बीसीडी निर्देशों द्वारा उपयोग किए गए) को छोड़कर। परीक्षण इसे अपरिभाषित छोड़ देता है , लेकिन सीएमपी इसे "परिणाम के अनुसार" सेट करता है । चूंकि शून्य को घटाकर 4 वें से 5 वें बिट तक कैरी का उत्पादन नहीं किया जा सकता है, इसलिए सीएमपी को वायुसेना को हमेशा साफ करना चाहिए।
परीक्षण छोटा है (तत्काल नहीं) और कभी-कभी तेज (सीएमपी से अधिक मामलों में अधिक सीपीयू पर एक तुलना-और-शाखा के ऊपर मैक्रो-फ्यूज कर सकता है)। यह test
शून्य के खिलाफ रजिस्टर की तुलना के लिए पसंदीदा मुहावरा बनाता है । यह एक peephole अनुकूलन है जिसके लिए cmp reg,0
आप अर्थ अर्थ की परवाह किए बिना उपयोग कर सकते हैं।
तत्काल 0 के साथ सीएमपी का उपयोग करने का एकमात्र सामान्य कारण यह है कि आप मेमोरी ऑपरेंड के खिलाफ तुलना करना चाहते हैं। उदाहरण के लिए, cmpb $0, (%esi)
एक अंतर्निहित लंबाई सी-स्टाइल स्ट्रिंग के अंत में एक शून्य शून्य बाइट की जांच करने के लिए।
AVX512F जोड़ता हैkortestw k1, k2
और AVX512DQ / BW (Skylake-X लेकिन KNL नहीं) जोड़ते हैं ktestb/w/d/q k1, k2
, जो AVX512 मास्क रजिस्टरों (k0..k7) पर काम करते हैं , लेकिन फिर भी नियमित FLAGS सेट करते हैं test
, उसी तरह जैसे कि पूर्णांक OR
या AND
निर्देश करते हैं। (SSE4 ptest
या SSE की तरह क्रमबद्ध करें ucomiss
: SIMD डोमेन में इनपुट और पूर्णांक फ्लैग में परिणाम।)
kortestw k1,k1
एक AVX512 परिणाम की तुलना SSE / AVX2 (v)pmovmskb/ps/pd
+ test
या के आधार पर शाखा / cmovcc / setcc के लिए मुहावरेदार तरीका है cmp
।
jz
बनाम का उपयोग je
भ्रामक हो सकता है।
jz
और je
शाब्दिक रूप से एक ही निर्देश है , यानी मशीन कोड में एक ही ओपकोड। वे एक ही काम करते हैं, लेकिन मनुष्यों के लिए अलग अर्थ हैं । Disassembler (और आम तौर पर कंपाइलर से asm आउटपुट) केवल एक का उपयोग करेगा, इसलिए शब्दार्थ भेद खो गया है।
cmp
और sub
ZF तब सेट करें जब उनके दो इनपुट बराबर हों (यानी घटाव परिणाम 0 हो)। je
(कूदो यदि बराबर) शब्दार्थिक रूप से प्रासंगिक पर्यायवाची है।
test %eax,%eax
and %eax,%eax
परिणाम शून्य होने पर / फिर ZF सेट करता है, लेकिन कोई "समानता" परीक्षण नहीं है। परीक्षण के बाद ZF आपको यह नहीं बताता है कि दोनों ऑपरेंड समान थे या नहीं। तो jz
(शून्य से कूदो) शब्दार्थ प्रासंगिक पर्यायवाची है।