विधानसभा - प्रक्रियाएं
असेंबली लैंग्वेज में प्रक्रियाएँ या सबरूटीन बहुत महत्वपूर्ण होते हैं, क्योंकि असेंबली लैंग्वेज प्रोग्राम आकार में बड़े होते हैं। प्रक्रियाओं को एक नाम से पहचाना जाता है। इस नाम के बाद, प्रक्रिया का शरीर वर्णित है जो एक अच्छी तरह से परिभाषित कार्य करता है। प्रक्रिया का अंत एक वापसी विवरण द्वारा इंगित किया गया है।
वाक्य - विन्यास
एक प्रक्रिया को परिभाषित करने के लिए वाक्यविन्यास निम्नलिखित है -
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{|}
...
...