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और subZF तब सेट करें जब उनके दो इनपुट बराबर हों (यानी घटाव परिणाम 0 हो)। je(कूदो यदि बराबर) शब्दार्थिक रूप से प्रासंगिक पर्यायवाची है।
test %eax,%eaxand %eax,%eaxपरिणाम शून्य होने पर / फिर ZF सेट करता है, लेकिन कोई "समानता" परीक्षण नहीं है। परीक्षण के बाद ZF आपको यह नहीं बताता है कि दोनों ऑपरेंड समान थे या नहीं। तो jz(शून्य से कूदो) शब्दार्थ प्रासंगिक पर्यायवाची है।