x86 - Why is 12 stored in register EAX in this 80x86 assembly code? -


मेरे पास यह कोड है:

  अनुभाग .डेटा फ़ूज़: mov ecx, 7 mov edx , 5 एल: इंक एडीएक्स उप एक्सीक्स, 1 सेटज अल; यदि शून्य ध्वज, अन्यथा अल = 0 एसएलएल, 1 एमएम बाइट [एल 1 + 1], एल एल 1: जेएमपी एल एलएमपी एल एमओयू ईएक्स, एडीएक्स आरटी   <पी> अगर AL कोड के अंत में? 

मुझे पता है कि यह 12 है, लेकिन जवाब 12 क्यों है?

यह स्वयं-संशोधित कोड की तरह दिखता है।

यह 7 गुना छोरता है और जब एक्सएक्स शून्य पहुंचता है, तो दूसरी जेएमपी के बाद कथन में कूदने वाले एक अलग जेएमपी निर्देश के साथ jmp एल कथन को बदल देता है।

< पूर्व> फ़ूज़: mov ecx, 7 mov edx, 5 l: inc edx sub ecx, 1 setZ al; शून्य से 1 पर सेट करें, अन्यथा अल = 0 एसएल एल, 1; 2 से गुणा करें, तो अल = 2 जब एक्सीक्स शून्य एमएवी बाइट [एल 1 + 1] तक पहुंचता है, एल एल 1: जेएमपी एल जेएमपी एल एमईएम ईएक्स, एडीएक्स आरटी

जादू Mov बाइट [एल 1 + 1] जब अल = 0, यह पहली जेएमपी को अगले बयान में जेएमपी के स्थान पर ले लेता है, जो फिर से जेएमपी एल है, इसलिए यह लूप। जब al = 2, यह पहली जेएमपी को 2 बाइट्स को छोड़ने की जगह लेता है, इसलिए यह दूसरी छलांग छोड़ देता है, इसलिए लूप समाप्त होता है। अंत में एडीएक्स 12 (5 + 7)

ऐसा क्यों है?

यहां इस्तेमाल किए जा रहे जेएमपी निर्देश कम जंप हैं । उन्हें 2 बाइट्स के रूप में कोडित किया जाता है: ईबी एक एकल बाइट द्वारा पीछा करने के लिए बाइट्स की सापेक्ष संख्या का प्रतिनिधित्व करता है। mov निर्देश या तो 0 (अगले अनुदेश में कूद) या 2 (आगे 2 बाइट कूद) द्वितीय बाइट को बदल देता है।


Comments

Popular posts from this blog

c# - ListView onScroll event -

PHP - get image from byte array -

Linux Terminal Problem with Non-Canonical Terminal I/O app -