असेंबलर, या असेंबली भाषा, एक निम्न-स्तरीय प्रोग्रामिंग भाषा है जो कंप्यूटर की मशीन कोड निर्देशों का प्रतीकात्मक प्रतिनिधित्व प्रदान करती है। उच्च-स्तरीय प्रोग्रामिंग भाषाओं के विपरीत, जो हार्डवेयर विवरणों को छिपाती हैं, असेंबली भाषा प्रोग्रामरों को ऐसे प्रोग्राम लिखने की अनुमति देती है जो कंप्यूटर की आर्किटेक्चर के साथ निकटता से मेल खाते हैं। यह डेवलपर्स को हार्डवेयर संसाधनों पर बारीक नियंत्रण प्रदान करता है, जिससे यह उन कार्यों के लिए आवश्यक हो जाता है जो हार्डवेयर के साथ सीधे इंटरैक्शन या हेरफेर की आवश्यकता होती है, जैसे ऑपरेटिंग सिस्टम, एम्बेडेड सिस्टम, और प्रदर्शन-क्रिटिकल एप्लिकेशन।
असेंबली भाषा कंप्यूटिंग के प्रारंभिक दिनों में बाइनरी मशीन कोड का उपयोग करके प्रोग्रामिंग की प्रक्रिया को सरल बनाने के लिए उभरी। पहला असेंबलर 1940 के दशक में इलेक्ट्रॉनिक न्यूमेरिकल इंटीग्रेटर और कंप्यूटर (ENIAC) के लिए बनाया गया था, जिससे प्रोग्रामरों को अधिक मानव-पठनीय प्रारूप में निर्देश लिखने की अनुमति मिली। जैसे-जैसे कंप्यूटर आर्किटेक्चर विकसित हुए, वैसे-वैसे असेंबली भाषाएँ भी विकसित हुईं, विभिन्न हार्डवेयर डिज़ाइनों के लिए विभिन्न असेंबलरों का विकास किया गया।
असेंबलर सीधे उस विशेष कंप्यूटर की आर्किटेक्चर से प्रेरित है जिसे यह लक्षित करता है। प्रत्येक प्रकार के प्रोसेसर की अपनी असेंबली भाषा होती है, जैसे x86 (इंटेल और एएमडी प्रोसेसर के लिए), ARM (मोबाइल उपकरणों में व्यापक रूप से उपयोग किया जाता है), और MIPS (एंबेडेड सिस्टम में उपयोग किया जाता है)। जबकि असेंबली भाषाएँ कुछ मौलिक अवधारणाओं को साझा करती हैं, वे अपने संबंधित हार्डवेयर प्लेटफार्मों के अद्वितीय निर्देश सेट और संचालन क्षमताओं को दर्शाती हैं।
आज, जबकि असेंबली भाषा एप्लिकेशन विकास के लिए प्राथमिक भाषा नहीं है, यह विशिष्ट क्षेत्रों में प्रासंगिक बनी हुई है। इसका सामान्य उपयोग प्रदर्शन-क्रिटिकल कोड के हिस्सों, डिवाइस ड्राइवरों, और वास्तविक समय के सिस्टम लिखने के लिए किया जाता है। इसके अतिरिक्त, असेंबली भाषा को समझना रिवर्स इंजीनियरिंग, मैलवेयर विश्लेषण, और सिस्टम सुरक्षा जैसे क्षेत्रों के लिए महत्वपूर्ण है।
असेंबलर मेमोनिक्स का उपयोग करता है, जो मशीन निर्देशों के प्रतीकात्मक प्रतिनिधित्व होते हैं। उदाहरण के लिए, MOV AX, 1
का अर्थ है मान 1
को रजिस्टर AX
में स्थानांतरित करना।
असेंबली भाषा प्रोसेसर रजिस्टरों के सीधे हेरफेर की अनुमति देती है। उदाहरण के लिए, निर्देश ADD AX, BX
रजिस्टर AX
और BX
में मानों को जोड़ता है और परिणाम को AX
में संग्रहीत करता है।
लेबल कोड में कूदने और लूप के लिए स्थान चिह्नित करने के लिए उपयोग किए जाते हैं। एक लेबल इस तरह दिख सकता है start:
। यह JMP start
जैसे निर्देशों के साथ लूप बनाने के लिए उपयोगी है।
निर्देश असेंबलर के व्यवहार को नियंत्रित करते हैं और मेटाडेटा प्रदान करते हैं। उदाहरण के लिए, .data
और .text
निर्देश डेटा और कोड के लिए अनुभागों को इंगित करते हैं।
दस्तावेज़ीकरण उद्देश्यों के लिए टिप्पणियाँ सेमीकोलन का उपयोग करके शामिल की जा सकती हैं। उदाहरण के लिए, ; यह एक टिप्पणी है
।
असेंबली नियंत्रण प्रवाह निर्देशों का समर्थन करती है जैसे JMP
, JE
(बराबर होने पर कूदें), और JNE
(बराबर न होने पर कूदें), जो कोड निष्पादन में शाखा बनाने की अनुमति देते हैं।
प्रत्येक असेंबली निर्देश आमतौर पर एक ऑपरेशन (ऑपकोड) और उसके बाद ऑपरेशंस से मिलकर बनता है। ऑपरेशंस यूनरी, बाइनरी, या निर्देश सेट आर्किटेक्चर के आधार पर अधिक जटिल प्रारूपों का उपयोग कर सकते हैं।
असेंबली भाषा निर्देशों में सीधे तात्कालिक मानों का उपयोग करने की अनुमति देती है, जैसे MOV AX, 5
, जहाँ 5
रजिस्टर AX
को सौंपा गया तात्कालिक मान है।
असेंबली प्रक्रियाओं और उपप्रक्रिया कॉल का समर्थन करती है, जो कोड पुन: उपयोग की अनुमति देती है। इसे CALL
निर्देश का उपयोग करके एक लेबल के बाद बुलाया जा सकता है, जैसे CALL myFunction
।
हालांकि असेंबली में उच्च-स्तरीय डेटा प्रकार नहीं होते, डेटा को आर्किटेक्चर के अनुसार बाइट, वर्ड, या डबल-वर्ड का उपयोग करके प्रबंधित किया जा सकता है, और मेमोरी पते को सीधे हेरफेर किया जा सकता है।
एक असेंबलर असेंबली भाषा कोड को मशीन कोड में परिवर्तित करता है। विभिन्न असेंबलर मौजूद हैं, जैसे NASM (नेटवाइड असेंबलर), MASM (माइक्रोसॉफ्ट मैक्रो असेंबलर), और GAS (GNU असेंबलर), जो प्रत्येक विशिष्ट आर्किटेक्चर या ऑपरेटिंग सिस्टम को लक्षित करते हैं।
असेंबली भाषा के लिए विकास वातावरण उच्च-स्तरीय भाषाओं की तुलना में कम सामान्य हैं, लेकिन इसमें PIC माइक्रोकंट्रोलर्स के लिए MPLAB X IDE या ARM विकास के लिए Keil जैसे विशिष्ट आईडीई शामिल हैं।
असेंबली भाषा में एक परियोजना बनाने के लिए, डेवलपर्स आमतौर पर टेक्स्ट संपादक में स्रोत कोड लिखते हैं, फिर बाइनरी या ऑब्जेक्ट फ़ाइलें उत्पन्न करने के लिए कमांड लाइन के माध्यम से असेंबलर को बुलाते हैं। उदाहरण के लिए, NASM का उपयोग करते हुए, एक सामान्य कमांड इस तरह दिख सकता है:
nasm -f elf64 myprogram.asm -o myprogram.o
इसके बाद, एक लिंकिंग टूल जैसे ld
का उपयोग करके एक निष्पादन योग्य बनाने के लिए लिंकिंग की जा सकती है:
ld myprogram.o -o myprogram
असेंबली भाषा मुख्य रूप से उन क्षेत्रों में उपयोग की जाती है जिन्हें अनुकूलित प्रदर्शन और सीधे हार्डवेयर हेरफेर की आवश्यकता होती है। प्रमुख अनुप्रयोगों में शामिल हैं:
उच्च-स्तरीय भाषाओं जैसे C, C++, या Java के विपरीत, जो हार्डवेयर पर अमूर्तता प्रदान करती हैं, असेंबली भाषा मशीन निर्देशों पर सीधे नियंत्रण प्रदान करती है। इससे असेंबली प्रोग्राम सामान्यतः तेज और छोटे होते हैं, जो संसाधन-सीमित वातावरण में महत्वपूर्ण है, लेकिन काफी कम पोर्टेबल होते हैं।
हालांकि असेंबली भाषा का अनुकूलन उत्कृष्ट प्रदर्शन दे सकता है, C और C++ जैसी भाषाएँ विकास प्रक्रिया को काफी सरल बनाती हैं। उच्च-स्तरीय भाषाएँ मेमोरी प्रबंधन, त्रुटि जांच, और व्यापक पुस्तकालयों को संभालती हैं, जिससे वे अधिकांश अनुप्रयोगों के लिए उपयुक्त होती हैं।
असेंबली भाषा का सिंटैक्स उन भाषाओं की तुलना में अधिक जटिल माना जाता है जैसे Python या JavaScript, जो पठनीयता और उपयोग में आसानी को प्राथमिकता देती हैं। असेंबली सीखने के लिए कंप्यूटर आर्किटेक्चर की समझ की आवश्यकता होती है, जबकि उच्च-स्तरीय भाषाएँ इन विवरणों को छिपा देती हैं।
कई उपकरण हैं जो उच्च-स्तरीय भाषाओं को असेंबली में अनुवादित करने या असेंबली को उच्च-स्तरीय कोड के साथ इंटरैक्ट करने में सक्षम बनाते हैं। कुछ असेंबलर सीधे C कोड को एकीकृत कर सकते हैं, जिससे मिश्रित परियोजनाएँ संभव होती हैं। LLVM जैसे उपकरण भी उच्च-स्तरीय भाषाओं में लिखे गए कोड से असेंबली उत्पन्न कर सकते हैं।
डेवलपर्स के लिए जो उच्च-स्तरीय भाषा से असेंबली में कोड परिवर्तित करने की कोशिश कर रहे हैं, यह लक्षित आर्किटेक्चर के निर्देश सेट का अध्ययन करना और अनुकूलन प्रयासों को मार्गदर्शित करने के लिए प्रोफाइलिंग उपकरणों का उपयोग करना फायदेमंद है। यह भी सलाह दी जाती है कि मौजूदा कंपाइलरों जैसे GCC का उपयोग करें जो विश्लेषण या आगे की परिष्करण के लिए असेंबली कोड आउटपुट कर सकते हैं।