असेंबली मैक्रो - परिभाषा, वाक्य-विन्यास और उदाहरण
मैक्रोज़: एक मैक्रो निर्देशों का एक सेट है जिसे एक बार परिभाषित किया जाता है और फिर प्रोग्राम में कई बार उपयोग किया जा सकता है। यदि किसी कार्य विशेष के लिए निर्देशों का बार-बार प्रयोग करना पड़े तो उन निर्देशों के समूह से एक कोड ब्लॉक बना दिया जाता है जिसे आवश्यकता पड़ने पर पुकारा और प्रयोग किया जाता है। इसे मैक्रोज़ कहा जाता है।
असेंबली लैंग्वेज में मॉड्यूलर प्रोग्रामिंग सुनिश्चित करने का दूसरा तरीका मैक्रोज़ लिखना है। एक मैक्रो निर्देशों का एक क्रम है, जिसे एक नाम से निर्दिष्ट किया जाता है और प्रोग्राम में कहीं भी इस्तेमाल किया जा सकता है।
macro Syntax
NASM में, मैक्रोज़ को %macro और %endmacro निर्देशों के साथ परिभाषित किया गया है। मैक्रोज़ %macro निर्देश से शुरू होते हैं और %endmacro निर्देश के साथ समाप्त होते हैं।
Syntax for macro definition -
%macro macro_name number_of_params
macro body
%endmacro
जहां, number_of_params पैरामीटर की संख्या निर्दिष्ट करता है, macro_name मैक्रो का नाम निर्दिष्ट करता है।
मैक्रो को आवश्यक पैरामीटर के साथ मैक्रो नाम का उपयोग करके लागू किया जाता है। जब आपको किसी प्रोग्राम में कई बार निर्देशों के कुछ क्रम का उपयोग करने की आवश्यकता होती है, तो आप उन निर्देशों को एक मैक्रो में रख सकते हैं और निर्देशों को हर बार टाइप करने के बजाय उसका उपयोग कर सकते हैं।
उदाहरण के लिए, प्रोग्राम के लिए एक बहुत ही सामान्य आवश्यकता स्क्रीन पर वर्णों की एक स्ट्रिंग लिखना है। वर्णों की एक स्ट्रिंग प्रदर्शित करने के लिए, आपको निर्देशों के निम्नलिखित अनुक्रम की आवश्यकता है −
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
एक वर्ण स्ट्रिंग प्रदर्शित करने के उपरोक्त उदाहरण में, रजिस्टरों EAX, EBX, ECX और EDX का उपयोग INT 80H फ़ंक्शन कॉल द्वारा किया जाता है। इसलिए, हर बार जब आपको स्क्रीन पर प्रदर्शित करने की आवश्यकता होती है, तो आपको इन रजिस्टरों को स्टैक पर सहेजना होगा, INT 80H को कॉल करना होगा, और फिर स्टैक से रजिस्टरों के मूल मूल्य को पुनर्स्थापित करना होगा। इसलिए, डेटा को सहेजने और पुनर्स्थापित करने के लिए दो मैक्रोज़ लिखना उपयोगी हो सकता है।
हमने देखा है कि, IMUL, IDIV, INT, आदि जैसे कुछ निर्देशों को कुछ विशिष्ट रजिस्टरों में संग्रहीत करने के लिए कुछ जानकारी की आवश्यकता होती है और यहां तक कि कुछ विशिष्ट रजिस्टरों में मान लौटाते हैं। यदि प्रोग्राम पहले से ही उन रजिस्टरों का उपयोग महत्वपूर्ण डेटा रखने के लिए कर रहा था, तो इन रजिस्टरों में मौजूदा डेटा को स्टैक में सहेजा जाना चाहिए और निर्देश निष्पादित होने के बाद बहाल किया जाना चाहिए।
Macros Exampal
निम्न उदाहरण दिखाता है कि मैक्रोज़ को कैसे परिभाषित और उपयोग किया जाए −
; A macro with two parameters
; Implements the write system call
%macro write_string 2
mov eax, 4
mov ebx, 1
mov ecx, %1
mov edx, %2
int 80h
%endmacro
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
write_string msg1, len1
write_string msg2, len2
write_string msg3, len3
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg1 db 'Hello, programmers!',0xA,0xD
len1 equ $ - msg1
msg2 db 'Welcome to the world of,', 0xA,0xD
len2 equ $- msg2
msg3 db 'Linux assembly programming! '
len3 equ $- msg3
परिणाम −
Hello, programmers!
Welcome to the world of,
Linux assembly programming!