2010-05-10 13 views
7

(उदाहरण के लिए ia32),परीक्षण करता है, तो एक रजिस्टर में ही ia32 में बराबर होती है

test $eax, $eax 

क्यों आप कभी भी ऐसा करना चाहते हैं? यह $eax & $eax है, है ना? यह हमेशा फ़्लैग रजिस्टर सेट करने के लिए यह नहीं कह सकता कि वे बराबर हैं ..?

परिशिष्ट: इसलिए यदि रजिस्टर शून्य है तो परीक्षण जेडएफ (नीचे उल्लिखित) निर्धारित करेगा। तो परीक्षण है (जैसा कि ऊपर उपयोग किया गया है) मुख्य रूप से यह बताने के लिए उपयोग किया जाता है कि कोई रजिस्टर खाली है या नहीं? और अगर ज़ेडएफ सेट किया गया है तो?

+0

ईक्स के खिलाफ [x86 असेंबली - 'testl' eax के संभावित डुप्लिकेट?] (Http://stackoverflow.com/questions/147173/x86-assembly-testl-eax-against-eax) –

उत्तर

9

यह रजिस्टर शून्य होने पर ZF (शून्य ध्वज) सेट करेगा। शायद यह परीक्षण करने के लिए सबसे अधिक इस्तेमाल किया जाता है। यह अन्य झंडे को उचित रूप से भी सेट करेगा, लेकिन शायद उन लोगों के लिए बहुत कम उपयोग है।

इसके अलावा, मुझे यह उल्लेख करना चाहिए कि test वास्तव में तुलना नहीं करता है - यह थोड़ा सा and ऑपरेशन (झंडे को छोड़कर परिणाम को फेंकना) करता है।

ऑपरेंड की तुलना करने के लिए, cmp अनुदेश इस्तेमाल किया जाएगा, जो एक sub कार्रवाई निष्पादित करता है, झंडे के अलावा परिणाम दूर फेंक। आप सही है कि एक

cmp $eax, $eax 

ज्यादा बात नहीं होती हैं, के रूप में झंडे एक शून्य परिणाम हर बार के अनुसार निर्धारित किया जाएगा।

+0

ताकि ऊपर का उपयोग किया जा सके 'जेन' के साथ संयोजन। जेडएफ पर 'जेन' देखो? – sepiroth

+0

हां - जेन (कूद बराबर नहीं) एक कूद के लिए सशर्त रूप से शून्य ध्वज की जांच कर रहा है। –

+1

हां - 'जेएनएफ' कूद जाएगा यदि 'ZF' सेट नहीं है (' जेएन' 'jnz' के बराबर है - जैसा कि वे एक ही ऑपोड हैं)। –

1

यह शून्य ध्वज सेट कर रहा है, वैसे ही or $eax,$eax का उपयोग शून्य ध्वज के लिए विनाशकारी परीक्षण भी कर सकता है।

+0

बह, ड्रॉ पर बहुत धीमा ... –

1

यह प्रोसेसर पर जेड और एस झंडे सेट करता है, ताकि आप "परीक्षण ईएक्स, ईएक्स" (या कोई अन्य रजिस्टर 8, 16, 32 और मुझे 64 बिट्स) के बाद बता सकें यदि मान शून्य है, या यदि साइन बिट सेट किया गया है, क्रमशः "जे/जेएन/जेड/जेएनजे" या "जेएस/जेएनएस" का उपयोग करके। X80/x86 आर्किटेक्चर के लिए कोडिंग के 30 वर्षों में, मैंने पंजीकरण रजिस्टर के अधिकांश लोगों के साथ यह कई बार किया है। (आप ईएसपी पर अभ्यास में इसका उपयोग नहीं करते हैं!)

आईआईआरसी, एक समानता बिट है जिसकी गणना भी की जाती है, इसलिए यह परीक्षण करके आप बता सकते हैं कि रजिस्टर में सेट बिट्स की संख्या भी अजीब है या नहीं "jp/JNP"। मेरे पास कभी का उपयोग नहीं किया गया था।

1

यह निर्देश केवल तभी जांचने के लिए नहीं है जब %eax का मान शून्य है। यह पूरी तरह इस्तेमाल किया जा सकता है कि यह जांचने के लिए कि क्या %eax शून्य या सकारात्मक या नकारात्मक है। इस तरह इसका उपयोग करने का सबसे बड़ा फायदा यह है कि यह %eax (%eax & %eax करने के बाद, यह केवल मूल्य को त्याग देता है) की स्थिति को संशोधित नहीं करता है और निम्नानुसार स्थिति ध्वज सेट करता है।

अगर% eax मूल्य किसी और शून्य, OF, CF, ZF = 0 (शून्य करने के लिए सेट)
SF = MSB of the result है (यहाँ, परिणाम %eax & %eax है)। तो यदि संख्या ऋणात्मक है, तो हमें SF = 1 मिलता है, अन्यथा SF = 0

संबंधित मुद्दे