2013-06-30 7 views
6

रजिस्टर यहाँ कुछ सी, मैं सीख रहा हूँ एक पाठ्यपुस्तक में पाया:उपयोग

... 
do { 
    ... 
    n--; 
} while (n > 0) 
... 

मुझे लगता है n%edx पर है।

विधानसभा का उत्पादन कोड है:

testl %edx, %edx 
jle .L5 

मैं समझता हूँ (SF^OF) | ZF के बराबर या उससे कम के लिए कि jle परीक्षण। हालांकि मुझे यकीन नहीं है कि यह निर्देश n > 0 से कैसे मेल खाता है। क्या कोई इसे समझा सकता है?

+2

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

+0

मुझे विश्वास नहीं है, वह एक अलग कूद निर्देश का उपयोग कर रहा है। – dgamma3

+0

यह अभी भी 0 के साथ तुलना है, आप इसके बाद किसी भी कूद निर्देश का उपयोग कर सकते हैं। – interjay

उत्तर

12

इनमें से कुछ को कवर किया गया है, लेकिन मैं थोड़ा और विस्तार भर दूंगा।

test reg,mask निर्देश का सामान्य उद्देश्य मास्क के खिलाफ एक रजिस्टर मूल्य का परीक्षण करता है (रजिस्टर मान मास्क के साथ आंतरिक रूप से एंडेड होता है) और फिर परिणाम के अनुसार स्थिति झंडे एसएफ, जेडएफ और पीएफ सेट करता है। [टिप्पणी प्रति संपादित @ChrisDodd से] यह भी बिना शर्त O (अतिप्रवाह) को साफ करता है और C (कैरी) की स्थिति बिट्स। [/ संपादित करें]

SF = sign flag (1 if sign bit is set (a 2's complement negative value)) 
ZF = zero flag (1 if result is 0) 
PF = parity flag (1 if result has an even number of 1 bits) 

इस विशिष्ट उदाहरण (test eax,eax) में, शिक्षा eax AND eax ले जा रहा है। जब यह किया जाता है, बिट्स होंगे:

SF = 1 if EAX has a negative value (since sign bit will not change when ANDed with itself) 
ZF = 1 if EAX is zero (the only value that yields a zero when ANDed with itself is zero) 
PF = 1 if EAX has an even number of 1 bits 

दूसरे शब्दों में, यह शून्य या नकारात्मक के लिए एक सरल परीक्षण है। यह संकलक कोड पीढ़ी में एक बहुत ही आम पैटर्न है।

+2

एक महत्वपूर्ण अतिरिक्त तथ्य यह है कि 'परीक्षण' निर्देश बिना शर्त रूप से ओ और सी झंडे को साफ़ करता है। इसके बिना शून्य के मुकाबले तुलना के लिए यह उपयोगी नहीं होगा। –

+0

@ChrisDodd अच्छी जानकारी (+1)। धन्यवाद। यदि आपको कोई फर्क नहीं पड़ता है, तो मैं इसे पूर्णता के लिए अपने उत्तर में जोड़ दूंगा। – lurker

1

TEST "परिणाम के अनुसार एसएफ, जेडएफ, और पीएफ स्थिति झंडे सेट करता है।" (इंटेल मैनुअल, लगभग TEST)।

तो एसएफ प्रतिबिंबित करेगा कि n नकारात्मक था, और ZF प्रतिबिंबित करेगा कि n शून्य था।

यह शून्य पर सेट करता है।

तो (SF^OF)|ZFSF | ZF को सरल बनाता है, इसलिए निष्कर्ष में, n <= 0 पर कूद लिया जाएगा। ऐसा लगता है कि यह गलत तरीका है, उम्मीद है कि .5 0 लेबल लूप के सामने लेबल नहीं है, लूप के सामने लेबल नहीं है।