नेटवाइड असेंबलर

नेटवाइड असेंबलर (एनएएसएम) इंटेल x86 आर्किटेक्चर के लिए एक असेंबली भाषा # कोडांतरक और disassembler है। इसका उपयोग 16-बिट, 32-बिट (IA-32) और 64-बिट (x86-64) प्रोग्राम लिखने के लिए किया जा सकता है। इसे लिनक्स के लिए सबसे लोकप्रिय असेंबलरों में से एक माना जाता है।

यह मूल रूप से साइमन टाथम द्वारा जूलियन हॉल की सहायता से लिखा गया था।, इसका रखरखाव एच. पीटर एनविन के नेतृत्व वाली एक छोटी टीम द्वारा किया जाता है। यह सरलीकृत (2-क्लॉज) बीएसडी लाइसेंस की शर्तों के तहत जारी खुला स्रोत सॉफ्टवेयर है।

सुविधाएँ
NASM COFF, OMF, a.out (फ़ाइल स्वरूप) | a.out, निष्पादन योग्य और लिंक करने योग्य स्वरूप (ELF), Mach-O और बाइनरी फ़ाइल (.bin, बाइनरी डिस्क छवि, सहित कई बाइनरी स्वरूपों का उत्पादन कर सकता है, जिसका उपयोग ऑपरेटिंग को संकलित करने के लिए किया जाता है। सिस्टम), हालांकि स्थिति-स्वतंत्र कोड केवल ईएलएफ वस्तु फ़ाइलोंों के लिए समर्थित है। इसका अपना बाइनरी फॉर्मेट भी है जिसे RDOFF कहा जाता है।

आउटपुट स्वरूपों की विविधता कार्यक्रमों को वस्तुतः किसी भी x86 ऑपरेटिंग सिस्टम (OS) पर पुनः लक्षित करने की अनुमति देती है। यह बूटिंग, केवल पढ़ने के लिये मेमोरी (ROM) छवियों और OS विकास के विभिन्न पहलुओं में लिखने के लिए उपयोग करने योग्य फ्लैट बाइनरी फ़ाइलें भी बना सकता है। यह असेंबली लैंग्वेज#क्रॉस असेंबलर जैसे पावरपीसी और एसपीएआरसी के रूप में गैर-x86 प्लेटफॉर्म पर चल सकता है, हालांकि यह उन मशीनों द्वारा प्रयोग करने योग्य प्रोग्राम उत्पन्न नहीं कर सकता है।

NASM AT&T Corporation|AT&T सिंटैक्स के बजाय Intel असेंबली सिंटैक्स के एक प्रकार का उपयोग करता है। यह MASM और संगत असेंबलरों द्वारा उपयोग किए जाने वाले x86 मेमोरी सेगमेंटेशन ओवरराइड्स (और संबंधित ASSUME निर्देश) की स्वचालित पीढ़ी जैसी सुविधाओं से भी बचता है।

नमूना कार्यक्रम
एक हैलो, दुनिया! डॉस ऑपरेटिंग सिस्टम के लिए कार्यक्रम:

<वाक्यविन्यास प्रकाश लैंग = nasm>

खंड। पाठ

संगठन 0x100

मूव आह, 0x9

एमओवी डीएक्स, हैलो

इंट 0x21

मूव कुल्हाड़ी, 0x4c00

इंट 0x21

खंड। डेटा

हैलो: डीबी 'हैलो, दुनिया!', 13, 10, '$'



लिनक्स के लिए एक समकक्ष कार्यक्रम:

<वाक्यविन्यास प्रकाश लैंग = nasm>

ग्लोबल _स्टार्ट

खंड। पाठ

_शुरू करना:

मूव ईएक्स, 4; लिखना

मूव ईबीएक्स, 1; stout

मूव ईसीएक्स, संदेश

Mov edx, msg.len

इंट 0x80; लिखें (stdout, संदेश, strlen (संदेश));

एक्सोर ईएक्स, संदेश लेन; लिखने से उलटा वापसी मूल्य

एक्ससीजी ईएक्स, ईबीएक्स; बाहर निकलने के लिए मूल्य

मूव ईएक्स, 1; बाहर निकलना

इंट 0x80; बाहर निकलना(...)

खंड। डेटा

संदेश: डीबी हैलो, दुनिया! , 10

.len: equ $ - msg



Microsoft Windows के लिए समान प्रोग्राम का एक उदाहरण:

<वाक्यविन्यास प्रकाश लैंग = nasm>

वैश्विक _मुख्य

बाहरी _MessageBoxA@16

बाहरी _ExitProcess@4

खंड कोड use32 वर्ग = कोड

_मुख्य:

पुश डवर्ड 0; यूआईएनटी यूटाइप = एमबी_ओके

धक्का शब्द शीर्षक; LPCSTR lpCaption

धक्का बैनर; एलपीसीएसटी एलपीटेक्स्ट

पुश डवर्ड 0; एचडब्ल्यूएनडी एचडब्ल्यूएनडी = न्यूल

_MessageBoxA@16 पर कॉल करें

पुश डवर्ड 0; यूआईएनटी यूएक्सिटकोड

_ExitProcess@4 पर कॉल करें

सेक्शन डेटा यूज़32 क्लास=डेटा

बैनर: db 'Hello, World!', 0

शीर्षक: डीबी 'हैलो', 0 

Apple OS X के लिए एक 64-बिट प्रोग्राम जो कीस्ट्रोक इनपुट करता है और इसे स्क्रीन पर दिखाता है:

<वाक्यविन्यास प्रकाश लैंग = nasm>

ग्लोबल _स्टार्ट

खंड। डेटा

query_string: db एक वर्ण दर्ज करें:

query_string_len: बराबर $ - query_string

out_string: db आपके पास इनपुट है:

out_string_len: बराबर $ - out_string

अनुभाग .बीएसएस

in_char: resw 4

खंड। पाठ

_शुरू करना:

मूव रैक्स, 0x2000004; राइट-सिस्टम-कॉल-कोड को रजिस्टर रैक्स में डालें

मूव आरडीआई, 1; स्टडआउट का उपयोग करने के लिए कर्नेल को बताएं

मूव आरएसआई, query_string; आरएसआई वह जगह है जहां कर्नेल संदेश का पता खोजने की अपेक्षा करता है

एमओवी आरडीएक्स, query_string_len; और rdx वह जगह है जहाँ कर्नेल संदेश की लंबाई खोजने की अपेक्षा करता है

syscall

मूव रैक्स, 0x2000003; सिस्टम कॉल पढ़ें
 * चरित्र में पढ़ें

मूव आरडीआई, 0; stdin

मूव आरएसआई, in_char; भण्डारण के लिए पता, खंड .bss में घोषित

मूव आरडीएक्स, 2; कर्नेल के बफर से 2 बाइट प्राप्त करें (कैरिज रिटर्न के लिए एक)

syscall

मूव रैक्स, 0x2000004; सिस्टम कॉल लिखें
 * उपयोगकर्ता को आउटपुट दिखाएं

मूव आरडीआई, 1; stout

मूव आरएसआई, आउट_स्ट्रिंग

एमओवी आरडीएक्स, out_string_len

syscall

मूव रैक्स, 0x2000004; सिस्टम कॉल लिखें

मूव आरडीआई, 1; stout

मूव आरएसआई, in_char

मूव आरडीएक्स, 2; दूसरा बाइट स्ट्रिंग में अपेक्षित कैरिज रिटर्न लागू करना है

syscall

मूव रैक्स, 0x2000001; सिस्टम कॉल से बाहर निकलें
 * सिस्टम कॉल से बाहर निकलें

एक्सोर आरडीआई, आरडीआई

syscall



लिंकिंग
एनएएसएम मुख्य रूप से ऑब्जेक्ट फाइलों को आउटपुट करता है, जो आम तौर पर स्वयं निष्पादन योग्य नहीं होते हैं। इसका एकमात्र अपवाद फ्लैट बायनेरिज़ हैं (उदा., .COM) जो आधुनिक उपयोग में स्वाभाविक रूप से सीमित हैं। ऑब्जेक्ट फ़ाइलों को निष्पादन योग्य प्रोग्राम में अनुवाद करने के लिए, एक उपयुक्त लिंकर (कंप्यूटिंग) का उपयोग किया जाना चाहिए, जैसे कि विंडोज़ के लिए विजुअल स्टूडियो लिंक यूटिलिटी या यूनिक्स जैसी प्रणालियों के लिए जीएनयू लिंकर।

विकास
NASM संस्करण 0.90 अक्टूबर 1996 में जारी किया गया था।

संस्करण 2.00 को 28 नवंबर 2007 को जारी किया गया था, जिसमें x86-64 एक्सटेंशन के लिए समर्थन जोड़ा गया था। विकास संस्करण SourceForge.net पर अपलोड नहीं किए गए हैं, लेकिन प्रोजेक्ट वेब पेज से उपलब्ध बाइनरी स्नैपशॉट के साथ गिटहब में चेक किए गए हैं।

NASM प्रलेखन के लिए एक खोज इंजन भी उपलब्ध है।

जुलाई 2009 में, संस्करण 2.07 के अनुसार, NASM को सरलीकृत (2-खंड) BSD लाइसेंस के तहत जारी किया गया था। पहले, क्योंकि इसे जीएनयू लेसर जनरल पब्लिक लाइसेंस के तहत लाइसेंस दिया गया था, इसने Yasm के विकास का नेतृत्व किया, BSD लाइसेंस # 3-क्लॉज के तहत एक पूर्ण पुनर्लेखन। Yasm ने NASM से पहले x86-64 के लिए समर्थन की पेशकश की। इसने GNU असेंबलर सिंटैक्स के लिए समर्थन भी जोड़ा।

आरडीओएफएफ
एनएएसएम की ऑब्जेक्ट फ़ाइल आउटपुट क्षमताओं की अखंडता का परीक्षण करने के लिए डेवलपर्स द्वारा पुनर्निधारणीय गतिशील ऑब्जेक्ट फ़ाइल स्वरूप (आरडीओएफएफ) का उपयोग किया जाता है। यह काफी हद तक NASM की आंतरिक संरचना पर आधारित है, अनिवार्य रूप से आउटपुट ड्राइवर फ़ंक्शन कॉल के क्रमांकन वाले हेडर से युक्त होता है, जिसके बाद निष्पादन योग्य कोड या डेटा वाले अनुभागों की एक सरणी होती है। एनएएसएम वितरण में लिंकर और लोडर सहित प्रारूप का उपयोग करने के लिए उपकरण शामिल हैं।

अक्टूबर 1996 में संस्करण 0.90 जारी होने तक, NASM ने केवल फ्लैट-प्रारूप निष्पादन योग्य फ़ाइलों (जैसे, DOS COM फ़ाइलें) के आउटपुट का समर्थन किया। संस्करण 0.90 में, साइमन टैथम ने ऑब्जेक्ट-फ़ाइल आउटपुट इंटरफ़ेस के लिए और केवल 16-बिट कोड के लिए DOS .OBJ फ़ाइलों के लिए समर्थन जोड़ा।

NASM में इस प्रकार 32-बिट ऑब्जेक्ट प्रारूप का अभाव था। इस कमी को दूर करने के लिए, और ऑब्जेक्ट-फाइल इंटरफ़ेस सीखने के अभ्यास के रूप में, डेवलपर जूलियन हॉल ने RDOFF के पहले संस्करण को एक साथ रखा, जिसे NASM संस्करण 0.91 में जारी किया गया था।

इस प्रारंभिक संस्करण के बाद से, RDOFF प्रारूप में एक प्रमुख अद्यतन किया गया है, जिसमें प्रत्येक हेडर रिकॉर्ड पर एक रिकॉर्ड-लंबाई संकेतक जोड़ा गया है, कार्यक्रमों को उन रिकॉर्डों को छोड़ने की अनुमति देना जिनके प्रारूप को वे नहीं पहचानते हैं, और कई खंडों के लिए समर्थन करते हैं; RDOFF1 केवल तीन खंडों का समर्थन करता है: पाठ, डेटा और bss (जिसमें गैर-प्रारंभिक डेटा शामिल है)।

RDOFF प्रारूप को दृढ़ता से बहिष्कृत किया गया है और इसे NASM 2.15.04 से अक्षम कर दिया गया है।

यह भी देखें

 * सभा की भाषा
 * कोडांतरकों की तुलना

बाहरी संबंध

 * Special edition for Win32 and BeOS.
 * A comparison of GAS and NASM at IBM
 * : a converter between the source format of the assemblers NASM and GAS
 * A comparison of GAS and NASM at IBM
 * : a converter between the source format of the assemblers NASM and GAS