विधानसभा - प्रक्रियाएं

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

वाक्य - विन्यास

एक प्रक्रिया को परिभाषित करने के लिए वाक्यविन्यास निम्नलिखित है -

proc_name:
   procedure body
   ...
   ret

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

CALL proc_name

आरटीई अनुदेश का उपयोग करके कॉलिंग प्रक्रिया को नियंत्रण प्रक्रिया कहा जाता है।

उदाहरण

आइए हम एक बहुत ही सरल प्रक्रिया लिखते हैं जिसका नाम योग है जो ECX और EDX में संग्रहीत चर को जोड़ता है और 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

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

The sum is:
9

ढेर डेटा संरचना

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

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

PUSH    operand
POP     address/register

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

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

  • केवल words या doublewords स्टैक में बचाया जा सकता है, बाइट नहीं।

  • स्टैक रिवर्स दिशा में बढ़ता है, अर्थात, निचले मेमोरी एड्रेस की ओर

  • स्टैक में सम्मिलित अंतिम आइटम के लिए स्टैक के शीर्ष बिंदु; यह सम्मिलित किए गए अंतिम शब्द के निचले बाइट को इंगित करता है।

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

; 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

उदाहरण

निम्न प्रोग्राम पूरे 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'

जब उपरोक्त कोड संकलित और निष्पादित किया जाता है, तो यह निम्नलिखित परिणाम उत्पन्न करता है -

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