असेंबली लैंग्वेज या कंप्यूटर के साथ कोई भी कार्य करने के लिए डेटा का होना आवश्यक है जिसके उपयोग से कोई भी परिणाम प्राप्त किया जा सकता है। तो ये विभिन्न डेटा जैसे - (वीडियो ऑडियो टेक्स्ट कोई इनपुट या कोई निर्देश आदि) ये सभी मेमोरी के किसी स्थान में संग्रहीत होते हैं। फिर जब उन्हें एक्सेस करना होता है। इसके बाद उस डेटा के शुरुआती बिट स्थान का पता लगाकर पूरा डेटा पुनर्प्राप्त किया जाता है। या यदि कोई प्रोग्राम चल रहा है तो उसके लिए उपयोगी डेटा की लोकेशन और अगले रनिंग इंस्ट्रक्शन को भी एड्रेसिंग मोड के जरिए आसानी से चलाया जा सकता है।
असेम्बली भाषा में एड्रेसिंग मोड
अधिकांश असेंबली भाषा निर्देशों को चलाने के लिए ऑपरेंड की आवश्यकता होती है। एक ऑपरेंड पता वह स्थान प्रदान करता है जहां संसाधित किया जाने वाला डेटा संग्रहीत किया जाता है। कुछ निर्देशों के लिए एक ऑपरेंड की आवश्यकता नहीं होती है, जबकि कुछ अन्य निर्देशों के लिए एक, दो या तीन ऑपरेंड की आवश्यकता हो सकती है।
जब एक निर्देश के लिए दो ऑपरेंड की आवश्यकता होती है, तो पहला ऑपरेंड आमतौर पर डेस्टिनेशन होता है, जो एक रजिस्टर या मेमोरी लोकेशन में डेटा रखता है, और दूसरा ऑपरेंड स्रोत होता है। स्रोत में या तो वितरित किया जाने वाला डेटा (तत्काल पता) या डेटा का पता (रजिस्टर या मेमोरी में) होता है। आम तौर पर, ऑपरेशन के बाद स्रोत डेटा अपरिवर्तित रहता है।
सामान्य तौर पर डेटा एड्रेसिंग के तीन तरीकों का इस्तेमाल किया जाता है।
- Register addressing
- Immediate addressing
- Memory addressing
रजिस्टर एड्रेसिंग
रजिस्टर एड्रेसिंग में ऑपरेंड एक रजिस्टर में होते हैं। निर्देशों के आधार पर, वे एक रजिस्टर में मौजूद डेटा का पता रखते हैं या प्रत्यक्ष डेटा का उपयोग करते हैं।
MOV DX, TAX_RATE ; पहले ऑपरेंड में रजिस्टर
MOV COUNT, CX ; दूसरे ऑपरेंड में रजिस्टर
MOV EAX, EBX ; दोनों ऑपरेंड रजिस्टरों में हैं
चूंकि स्मृति रजिस्टरों के बीच डेटा प्रोसेसिंग में शामिल नहीं है, यह डेटा का सबसे तेज़ प्रसंस्करण प्रदान करती है।
इमीडियेट एड्रेसिंग
तत्काल एड्रेसिंग ऑपरेंड एक निरंतर मूल्य या अभिव्यक्ति है। जब दो ऑपरेंड वाला निर्देश तत्काल एड्रेसिंग का उपयोग करता है, तो पहला ऑपरेंड एक रजिस्टर या मेमोरी लोकेशन हो सकता है, और दूसरा ऑपरेंड तत्काल स्थिरांक हो सकता है। पहला ऑपरेंड डेटा की लंबाई को परिभाषित करता है।
BYTE_VALUE DB 150 ; एक बाइट मान परिभाषित
WORD_VALUE DW 300 ; एक शब्द मान परिभाषित
ADD BYTE_VALUE, 65 ; एक तत्काल संकार्य 65 जोड़ा गया
MOV AX, 45H ; तत्काल स्थिरांक 45H को AX में स्थानांतरित
डारेक्ट मेमोरी एड्रेसिंग
डायरेक्ट एड्रेसिंग मोड में, ऑफ़सेट वैल्यू को डायरेक्ट इंस्ट्रक्शन के हिस्से के रूप में निर्दिष्ट किया जाता है, जिसे आमतौर पर वेरिएबल नाम से दर्शाया जाता है। असेंबलर ऑफ़सेट मान की गणना करता है और एक प्रतीक तालिका बनाए रखता है, जो प्रोग्राम में उपयोग किए जाने वाले सभी चर के ऑफ़सेट मानों को संग्रहीत करता है।
डायरेक्ट मेमोरी एड्रेसिंग में, एक ऑपरेंड एक मेमोरी लोकेशन को संदर्भित करता है और दूसरा ऑपरेंड एक रजिस्टर को संदर्भित करता है।
ADD BYTE_VALUE, DL ; मेमोरी लोकेशन में रजिस्टर जोड़ता है
MOV BX, WORD_VALUE ; मेमोरी से ऑपरेंड को रजिस्टर में जोड़ा जाता है
जब ऑपरेंड को मेमोरी एड्रेसिंग मोड में निर्दिष्ट किया जाता है, तो मुख्य मेमोरी तक सीधे पहुंच की आवश्यकता होती है, आमतौर पर डेटा सेगमेंट में। समाधान की इस पद्धति के परिणामस्वरूप डेटा की धीमी प्रक्रिया होती है। मेमोरी में डेटा के सटीक स्थान का पता लगाने के लिए, हमें सेगमेंट स्टार्ट एड्रेस की आवश्यकता होती है, जो आमतौर पर डीएस रजिस्टर और ऑफसेट वैल्यू में पाया जाता है। इस ऑफ़सेट मान को प्रभावी पता भी कहा जाता है।
डायरेक्ट-ऑफसेट एड्रेसिंग
यह एड्रेसिंग मोड किसी पते को संशोधित करने के लिए अंकगणितीय ऑपरेटरों का उपयोग करता है। उदाहरण के लिए, निम्नलिखित परिभाषाओं को देखें जो डेटा की तालिका को परिभाषित करती हैं -
BYTE_TABLE DB 14, 15, 22, 45 ; बाइट टेबल्स
WORD_TABLE DW 134, 345, 564, 123 ; शब्दों की टेबल्स
The following operations access data in registers from tables in memory −
MOV CL, BYTE_TABLE[2] ; BYTE_TABLE का तीसरा तत्व प्राप्त करता है
MOV CL, BYTE_TABLE + 2 ; Gets the 3rd element of the BYTE_TABLE
MOV CX, WORD_TABLE[3] ; WORD_TABLE का चौथा तत्व प्राप्त करता है
MOV CX, WORD_TABLE + 3 ; WORD_TABLE का चौथा तत्व प्राप्त करता है
अप्रत्यक्ष मेमोरी एड्रेसिंग
यह एड्रेसिंग मोड कंप्यूटर की सेगमेंटेशन क्षमता का उपयोग करता है। अप्रत्यक्ष संबोधन आमतौर पर उन चरों के लिए उपयोग किया जाता है जिनमें कई तत्व होते हैं, जैसे कि सरणियाँ। सरणी का प्रारंभिक पता EBX रजिस्टर में संग्रहीत किया जाता है।
निम्न कोड स्निपेट दिखाता है कि चर के विभिन्न तत्वों तक कैसे पहुँचा जाए।
MY_TABLE TIMES 10 DW 0 ; 10 शब्द आवंटित करता है (2 बाइट्स) प्रत्येक को 0 से प्रारंभ किया जाता है
MOV EBX, [MY_TABLE] ; EBX में MY_TABLE का प्रभावी पता
MOV [EBX], 110 ; MY_TABLE[0] = 110
ADD EBX, 2 ; EBX = EBX +2
MOV [EBX], 123 ; MY_TABLE[1] = 123
MOV instruction
MOV निर्देश का उपयोग डेटा को एक संग्रहण स्थान से दूसरे स्थान पर ले जाने के लिए किया जाता है। MOV निर्देश दो ऑपरेंड लेता है।
MOV destination, source
MOV register, register
MOV register, immediate
MOV memory, immediate
MOV register, memory
MOV memory, register
कृपया ध्यान दें कि - MOV ऑपरेशन में दोनों ऑपरेंड एक ही आकार के होने चाहिए। स्रोत ऑपरेंड का मान अपरिवर्तित रहता है
MOV EBX, [MY_TABLE] ; EBX में MY_TABLE का प्रभावी पता
MOV [EBX], 110 ; MY_TABLE[0] = 110
यहां यह स्पष्ट नहीं है कि आप 110 नंबर के बाइट या शब्द को स्थानांतरित करना चाहते हैं या नहीं। ऐसे मामलों में, टाइप स्पेसियर का उपयोग करना बुद्धिमानी है।
निम्न तालिका कुछ सामान्य प्रकार के विनिर्देशकों को दर्शाती है -
Type specifier | bytes addressed |
---|---|
byte | 1 |
word | 2 |
DWORD | 4 |
QWORD | 8 |
TBYTE | 10 |
निम्नलिखित कार्यक्रम ऊपर चर्चा की गई कुछ अवधारणाओं को दिखाता है। यह मेमोरी के डेटा सेक्शन में एक नाम 'dooseep' स्टोर करता है, फिर प्रोग्रामेटिक रूप से इसके मान को दूसरे नाम 'prg' में बदल देता है और दोनों नामों को प्रदर्शित करता है।
section .text
global _start ;लिंकर के लिए घोषित किया जाना चाहिए (ld)
_start: ;लिंकर प्रवेश बिंदु
;नाम लिखना 'dooseep'
mov edx,9 ;message length
mov ecx, name ;संदेश लिखने के लिए
mov ebx,1 ;फाइल डिस्क्रिप्टर (stdout)
mov eax,4 ;सिस्टम कॉल नंबर (sys_write)
int 0x80 ;call kernel
mov [name], dword 'prg' ; Changed the name to prg
;नाम लिखना 'prg eep'
mov edx,8 ;message length
mov ecx,name ;संदेश लिखने के लिए
mov ebx,1 ;फाइल डिस्क्रिप्टर (stdout)
mov eax,4 ;सिस्टम कॉल नंबर (sys_write)
int 0x80 ;call kernel
mov eax,1 ;सिस्टम कॉल नंबर (sys_exit)
int 0x80 ;call kernel
section .data
name db 'dooseep'
जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्न परिणाम उत्पन्न करता है
dooseep prg eep