एक चरित्र की x86 विधानसभा घटना

  • परिचय
  • मुद्दा
  • उपाय
  • व्याख्या

परिचय

नीचे दी गई छोटी विधानसभा कवायद (इंटेल और एएमडी 32-बिट) x86 आर्किटेक्चर के लिए है और एनएएसएम सिंटैक्स का उपयोग करता है, जो एक कोडांतरक, मुफ्त में उपलब्ध है और

जिसका उपयोग विभिन्न प्लेटफार्मों जैसे विंडोज या लिनक्स पर किया जा सकता है।

ध्यान दें कि उपयोग किए जाने वाले बाहरी फ़ंक्शन मानक सी लाइब्रेरी से आते हैं।

मुद्दा

वर्णों की एक सरणी की कल्पना करें (जो जरूरी 0 के साथ समाप्त नहीं होती है)। इसका आकार है और हम किसी दिए गए चरित्र की उपस्थिति का परीक्षण करना चाहेंगे

इस सरणी में। उद्देश्य एक फ़ंक्शन लिखना होगा जो इनपुट वर्ण, आकार और वर्ण के रूप में लेता है। यदि यह चरित्र में मौजूद है

सरणी, यह एक नॉनज़रो मान लौटाता है, अन्यथा यह शून्य देता है।

यहाँ C में इस फ़ंक्शन को क्या दिया गया है:

 / फ़ंक्शन int is_in_array (char * array, int size, char c); // कार्यान्वयन: चार टैब [] = {'एन', 'ई', 'यू', 'ई'}; is_in_array (टैब, sizeof (टैब), 'u'); // 0 is_in_array (टैब, sizeof (टैब), 'a') के अलावा कोई मान लौटाएं; // रिटर्न वैल्यू 0 बस अपना कोड डालें: एक्सटर्नल प्रिंटफ सेक्शन। .डाटा सरणी डीबी 'डैडीडीडीडेविवौफुफिफामासिबिफिसाज़' यस डीबी 'यूओआई', 10, 0 नो डीबी 'नॉन', 10, 0 सेक्शन। वैश्विक खंड is_in_array: वहाँ मुख्य: पुश एब मूव एबप, एस्प; टेस्ट; अगर मी एरे पुस्स डॉर्ड 'म' में है; एरेन्थ ऑफ़ अरेंज (यहाँ 34) पुश डॉर्ड 34; ईआरएक्स पुश अरेंज में स्ट्रिंग एड्रेस; कॉल एज़ के एड के साथ is_in_array; आकार, और मूल्य जिसे आप कॉल कर रहे हैं, is_in_array test eax, eax jnz is_there; if eax! = 0 प्रदर्शन हां पुश नं; फिर प्रदर्शन कोई jmp स्क्रैन्डिसप्ले; प्रिन्ट के लिए स्ट्रिंग का पेंच = isere पुश हाँ यसेंडेंडप्ले: कॉल प्रिंटफ़ mov eax; अवकाश छोड़ दें 

निश्चित रूप से यह पर्याप्त नहीं होगा .....

उपाय

 is_in_array:; edi mov edi में ऐरे (पहले पैरामीटर) के पते को पुनः प्राप्त करता है, [x + 4], ऐक्स mov ecx में ऐरे (दूसरे पैरामीटर) के आकार को पुनः प्राप्त करता है, [esp + 8]; eax mov eax में (तीसरा पैरामीटर), [esp + 12]; वर्ण को खोजें scasb; यदि ध्वज ZERO (ZF) का मान 1 है, तो इसका अर्थ है कि वर्ण पाया जाता है; अन्य मामले में यह नहीं पाया जाता है; बस; ईएक्स में ईईएफ का मान मूव एक्सएक्सएक्स, 0; अगर जेडएफ = 1 तो अल = 1 (एल ईएक्स के 8 सबसे महत्वपूर्ण बिट्स) सेटज़ अल रिट 

व्याख्या

 ZF = 0 ecx = length eax = character edi = array // The Loop जो "repne scasb" को परिभाषित करता है, जबकि ecx! = 0 ET ZF = 0 Do if al == [edi] तो ZF = 1 Finii ecx = ecx - 1 edi = edi + 1 EndWhile eax = 0 // वह स्थिति जो "सेटज़" Si ZF = 1 Alors eax = 1 EndIf को परिभाषित करती है 
पिछला लेख अगला लेख

शीर्ष युक्तियाँ