2012-05-11 40 views
5

के साथ उलझन में मैं इस कोड को देख रहा हूं और मैं प्रतिनिधि cmpsb लाइन के बारे में उलझन में हूं।सीएमपीएसबी निर्देश

.LOOP: 
     push cx 
     mov  cx, 0x000B       ; eleven character name 
     mov  si, ImageName       ; image name to find 
     push di 
rep cmpsb           ; test for entry match 
     pop  di 
     je  LOAD_FAT 
     pop  cx 
     add  di, 0x0020       ; queue next directory entry 
     loop .LOOP 
     jmp  FAILURE 

मैं समझता हूं कि यह cmpsb cx बार दोहराता है लेकिन यह दो तारों की तुलना कैसे करता है? उदाहरण के लिए कहें "अरे \ 0" और "हे \ 0" की तुलना कर रहा था और यह लूप 4 वर्ण तारों की तुलना कर रहा था। पहले अक्षर अलग हैं और ईएफएलएजी रजिस्टर तदनुसार सेट किया जाएगा। हालांकि, cmpsb निर्देश दोहराया गया है और अगले वर्ण समान होंगे। मुझे गलतफहमी हो सकती है कि cmpsb काम करता है लेकिन ऐसा लगता है कि यह लूप दो तारों की सही ढंग से तुलना नहीं करता है। क्या वास्तव में यह पाश काम करता है?

+1

उम, आप क्यों नहीं देखते कि सीएमपीएसबी सीपीयू मैनुअल में कैसे काम करता है? –

+0

उम @ एलेक्स मैंने किया। भ्रम ** आरईपी ** निर्देश के कारण था। –

+0

आरईपी अपने आप का निर्देश नहीं है। यह एक निर्देश उपसर्ग, आईओओ निर्देश संशोधक है। दस्तावेज़ीकरण भी बताता है। –

उत्तर

10

कारण आरईपी काम करता है क्योंकि प्रतिनिधि के पास आरईपीई (एफ 3 एच) के समान एन्कोडिंग है। सिद्धांत रूप में आरईपीई यहां उपयोग करने का सही काम है, लेकिन आपके असेंबलर के आधार पर यह केवल आरईपी को सही के रूप में ले सकता है।

तो वास्तव में आपके पास एक आरईपीई सेमीपीएस है, यह सिर्फ इतना है कि आपका (डी) असेंबलर वास्तव में नहीं जानता है।

1

मुझे लगता है कि आपको cmpsb (यह थोड़ी देर हो गया है) के साथ आरईपीई या आरईपीएनई उपसर्ग का उपयोग करना है।

+0

यह सही है, आप या तो 'repe' (बराबर होने पर दोहराएं) या' repne' (बराबर नहीं होने पर दोहराएं) का उपयोग करें। –

1

आप सही हैं, यह कोड काम नहीं करेगा। आपको repe cmpsb का उपयोग करने की आवश्यकता है (उसी तरह बराबर तुलना स्ट्रिंग के दौरान दोहराएं)।

0

मेरी समझ से, क्योंकि मैं ब्रोकेंथर्न पर एक ही ट्यूटोरियल के माध्यम से जा रहा हूं, यह वसा प्रविष्टि के पहले बाइट के साथ Imagename के पहले बाइट की तुलना करेगा यदि वे समान हैं।

यह पहले अंतर पर सभी 11 वर्ण (फ़ाइल नाम और विस्तार) तक जारी रहेगा। यदि वे समान हैं, तो यह ज़ेडएफ ध्वज सेट करेगा, और जेडएफ ध्वज साफ रहेगा।

तो पूरे फ़ाइल नाम की तुलना करने के बाद, यह वही प्रविष्टि लोड करने के लिए कूद जाएगा यदि वे समान हैं। यदि नहीं, तो यह अगली प्रविष्टि लोड करेगा और उस फ़ाइल नाम की तुलना करेगा।

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

  • कोई संबंधित समस्या नहीं^_^