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{|}
...
...