स्ट्रिंग एक डेटा प्रकार है जो पारंपरिक रूप से वर्णों का एक क्रम है। और इसे अक्सर बाइट्स (या शब्दों) की सरणी डेटा संरचना के रूप में कार्यान्वित किया जाता है। असेम्बली लैंग्वेज में भी, स्ट्रिंग्स का उपयोग बड़ी संख्या या वर्णों और शब्दों के समूहों को संग्रहीत करने के लिए किया जाता है।
असेम्बली भाषा में स्ट्रिंग के कार्य और उपयोग
एक स्ट्रिंग में कई वर्ण हो सकते हैं। असेंबली में एक चर में स्ट्रिंग के आकार के अनुसार लंबाई निर्धारित की जाती है। आम तौर पर, हम दो तरीकों में से किसी एक द्वारा स्ट्रिंग की लंबाई निर्दिष्ट करते हैं−
- explicitly storing string length
- using the $msg character
हम $ स्थान काउंटर प्रतीक का उपयोग करके स्ट्रिंग की लंबाई को स्पष्ट रूप से संग्रहीत कर सकते हैं जो स्थान काउंटर के वर्तमान मूल्य का प्रतिनिधित्व करता है। $ स्ट्रिंग चर संदेश के अंतिम वर्ण के बाद बाइट को इंगित करता है। इसलिए, $-msg स्ट्रिंग की लंबाई लौटाता है। आप $-msg - len equ 13 के स्थान पर स्ट्रिंग की लंबाई भी दे सकते हैं
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
;Or
len equ 13 ;length of our dear string
असेंबली में स्ट्रिंग निर्देश
प्रत्येक स्ट्रिंग निर्देश के लिए स्रोत ऑपरेंड, डेस्टिनेशन ऑपरेंड या दोनों की आवश्यकता हो सकती है। 32-बिट में ES और EDI स्रोत और गंतव्य के लिए 16-बिट के समान SI और DI रजिस्टरों का उपयोग करते हैं।
स्ट्रिंग्स को संसाधित करने के लिए पाँच बुनियादी निर्देश हैं।
- MOVS − यह निर्देश 1 बाइट, शब्द या डबलवर्ड डेटा को एक स्मृति स्थान से दूसरे स्थान पर ले जाता है।
- LODS − यह निर्देश मेमोरी से लोड होता है। यदि ऑपरेंड एक सिंगल बाइट है, तो इसे AL रजिस्टर में लोड किया जाता है, यदि ऑपरेंड एक शब्द है, तो इसे AX रजिस्टर में लोड किया जाता है, और EAX रजिस्टर में एक डबलवर्ड लोड किया जाता है।
- STOS− यह निर्देश रजिस्टर (AL, AX, या EAX) से डेटा को मेमोरी में संग्रहीत करता है।
- CMPS− यह निर्देश मेमोरी में दो डेटा आइटम्स की तुलना करता है। डाटा बाइट साइज, वर्ड या डबलवर्ड का हो सकता है।
- SCAS− यह निर्देश एक रजिस्टर (AL, AX या EAX) की सामग्री की तुलना मेमोरी में किसी आइटम की सामग्री से करता है।
ये निर्देश ES: DI और DS: SI रजिस्टरों की जोड़ी का उपयोग करते हैं, जहाँ DI और SI रजिस्टरों में मान्य ऑफ़सेट पते होते हैं जो मेमोरी में संग्रहीत बाइट्स को संदर्भित करते हैं। SI आमतौर पर DS (डेटा सेगमेंट) से जुड़ा होता है और DI हमेशा ES (एक्सेस सेगमेंट) से जुड़ा होता है।
इन सभी के विशेष ऑपरेशन के अनुसार (बाइट ऑपरेशन - बी, वर्ड ऑपरेशन - एस, डबल वर्ड ऑपरेशन - डब्ल्यू) निर्देशों में जोड़ा जाता है,
repetition prefix
REP उपसर्ग, जब एक स्ट्रिंग निर्देश से पहले सेट किया गया हो। यह निर्देश प्रसंस्करण को तब तक दोहराता है जब तक CX शून्य नहीं हो जाता
डायरेक्शन फ्लैग (DF) ऑपरेशन की दिशा निर्धारित करता है।
ऑपरेशन को बाएं से दाएं करने के लिए CLD (क्लियर डायरेक्शन फ्लैग, DF = 0) का उपयोग करें।
ऑपरेशन को दाएं से बाएं करने के लिए STD (दिशा ध्वज सेट करें, DF = 1) का उपयोग करें।
REP prefix - आरईपीई या आरईपीजेड: यह सशर्त दोहराव है। यह ऑपरेशन को दोहराता है जबकि शून्य ध्वज बराबर/शून्य इंगित करता है। यह बंद हो जाता है जब ZF इंगित करता है कि बराबर/शून्य नहीं है या जब CX शून्य है। या जब cx शून्य से कम हो जाता है।
Example
निम्न प्रोग्राम स्ट्रिंग हैलो वर्ल्ड को स्क्रीन पर प्रिंट करता है -
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax, 1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!',0xa ;our dear string
len equ $ - msg ;length of our dear string
जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्न परिणाम उत्पन्न करता है−
Hello, world!