Assembly - Procedures और Stacks डेटा संरचना

Prahlad Godara ------ From DOOSEEP


Procedures एक बड़ी परियोजना का एक छोटा सा हिस्सा हैं जैसे कि विधानसभा कोड आमतौर पर आकार में बड़ा होता है। इसमें कोड को ठीक से समझने और मैनेज करने के लिए पूरे कोड को अलग-अलग टास्क के हिसाब से बांट दिया जाता है। इन विभिन्न कार्यों के अनुसार बनाए गए छोटे-छोटे निर्देशों के समूह को ही कार्यविधि (Procedures) कहते हैं। .

What are procedures in assembly language?

असेंबली कोड को अधिक मॉड्यूलर, पठनीय और आकार में छोटा बनाने के लिए, हम प्रक्रियाओं (Procedures) का उपयोग करते हैं। प्रक्रियाएं कार्यों के समान हैं, क्योंकि प्रत्येक प्रक्रिया एक विशिष्ट कार्य करती है।

असेंबली लैंग्वेज में प्रक्रियाएं या सबरूटीन्स बहुत महत्वपूर्ण हैं, क्योंकि असेंबली लैंग्वेज प्रोग्राम आकार में बड़े होते हैं। प्रक्रियाओं को एक नाम से पहचाना जाता है। इस नाम के बाद, प्रक्रिया का मुख्य भाग वर्णित है जो एक अच्छी तरह से परिभाषित कार्य करता है। प्रक्रिया का अंत रिटर्न स्टेटमेंट द्वारा दर्शाया गया है।


Syntax
  proc_name:
         procedure body
         ...
         ret 

CALL निर्देश का उपयोग करके प्रक्रिया को दूसरे फ़ंक्शन से कॉल किया जाता है। कॉल निर्देश में कॉल की गई प्रक्रिया का नाम एक तर्क के रूप में होना चाहिए जैसा कि नीचे दिखाया गया है-

 CALL proc_name 

कॉल की गई प्रक्रिया RET निर्देश का उपयोग करके कॉलिंग प्रक्रिया पर नियंत्रण लौटाती है.


Example आइए योग नाम की एक बहुत ही सरल प्रक्रिया लिखें जो EAX और EAX रजिस्टर में संग्रहीत चरों को जोड़ती है और EAX रजिस्टर में राशि लौटाती है। −
 section	.text
  global _start        ;must be declared for using gcc
 
_start:	                ;tell linker entry point
  mov	ecx,'4'
  sub     ecx, '0'
 
  mov 	edx, '5'
  sub     edx, '0'
 
  call    sum          ;call sum procedure
  mov 	[res], eax
  mov	ecx, msg	
  mov	edx, len
  mov	ebx,1	        ;file descriptor (stdout)
  mov	eax,4	        ;system call number (sys_write)
  int	0x80	        ;call kernel
 
  mov	ecx, res
  mov	edx, 1
  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
sum:
  mov     eax, ecx
  add     eax, edx
  add     eax, '0'
  ret
 
section .data
msg db "The sum is:", 0xA,0xD 
len equ $- msg   

segment .bss
res resb 1 

result −

 The sum is: 9 

स्टैक डेटा स्ट्रक्चर - उदाहरण

स्टैक मेमोरी में एक सरणी-जैसी डेटा संरचना है जिसमें डेटा को संग्रहीत किया जा सकता है और स्टैक के 'टॉप' नामक स्थान से हटाया जा सकता है। संग्रहीत किए जाने वाले डेटा को स्टैक में 'पुश' किया जाता है और पुनर्प्राप्त किए जाने वाले डेटा को स्टैक से 'पॉपप' किया जाता है। स्टैक एक LIFO डेटा संरचना है, यानी, पहले संग्रहीत डेटा को अंतिम रूप से पुनर्प्राप्त किया जाता है।

असेंबली लैंग्वेज स्टैक ऑपरेशंस के लिए दो निर्देश प्रदान करती है: PUSH और POP। इन निर्देशों में सिंटैक्स जैसा है −


PUSH    operand
    POP     address/register

स्टैक सेगमेंट में आरक्षित मेमोरी स्पेस का उपयोग स्टैक को लागू करने के लिए किया जाता है। रजिस्टरों एसएस और ईएसपी (या एसपी) का उपयोग स्टैक को लागू करने के लिए किया जाता है। स्टैक का शीर्ष, जो स्टैक में डाले गए अंतिम डेटा आइटम को इंगित करता है, एसएस: ईएसपी रजिस्टर द्वारा इंगित किया जाता है, जहां एसएस रजिस्टर स्टैक सेगमेंट की शुरुआत को इंगित करता है और एसपी (या ईएसपी) ऑफ़सेट देता है ढेर खंड।

स्टैक कार्यान्वयन में निम्नलिखित विशेषताएं हैं −

  • केवल शब्दों या दोहरे शब्दों को स्टैक में सहेजा जा सकता है, बाइट नहीं।
  • स्टैक उल्टी दिशा में बढ़ता है, यानी, कम मेमोरी एड्रेस की ओर
  • स्टैक का शीर्ष स्टैक में डाले गए अंतिम आइटम की ओर इशारा करता है; यह डाले गए अंतिम शब्द के निचले बाइट को इंगित करता है।

जैसा कि हमने कुछ उपयोग के लिए रजिस्टरों के मूल्यों को उपयोग करने से पहले स्टैक में संग्रहीत करने के बारे में चर्चा की; इसे निम्नलिखित तरीके से किया जा सकता है −

 ; Save the AX and BX registers in the stack
  PUSH    AX
  PUSH    BX
  
  ; Use the registers for other purpose
  MOV	AX, VALUE1
  MOV 	BX, VALUE2
  ...
  MOV 	VALUE1, AX
  MOV	VALUE2, BX
  
  ; Restore the original values
  POP	BX
  POP	AX 

Example

निम्न प्रोग्राम पूरे ASCII वर्ण सेट को प्रदर्शित करता है। मुख्य प्रोग्राम डिस्प्ले नाम की एक प्रक्रिया को कॉल करता है, जो ASCII कैरेक्टर सेट को प्रदर्शित करता है।


  section	.text
   global _start        ;must be declared for using gcc
	
_start:	                ;tell linker entry point
   call    display
   mov	eax,1	        ;system call number (sys_exit)
   int	0x80	        ;call kernel
	
display:
   mov    ecx, 256
	
next:
   push    ecx
   mov     eax, 4
   mov     ebx, 1
   mov     ecx, achar
   mov     edx, 1
   int     80h
	
   pop     ecx	
   mov	dx, [achar]
   cmp	byte [achar], 0dh
   inc	byte [achar]
   loop    next
   ret
	
section .data
achar db '0'  

result

 0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}
  ...
  ...


Read in- English
Tags- Nasm Assembly language Arrays in hindi. This blogcreates content similar to stackoverflow geeks for geeks tutorialspoint w3schools and dooseep,Procedures and Stacks Data Structure
कोई टिप्पणी नहीं:
एक टिप्पणी भेजें