नेटवाइड असेंबलर
Original author(s) | Simon Tatham, Julian Hall |
---|---|
Developer(s) | H. Peter Anvin, Chang Seok Bae, Jim Kukunas, Frank B. Kotler, Cyrill Gorcunov |
Initial release | October 1996 |
Stable release | Script error: The module returned a nil value. It is supposed to return an export table.
/ Script error: The module returned a nil value. It is supposed to return an export table. |
नेटवाइड असेंबलर (एनएएसएम) इंटेल x86 आर्किटेक्चर के लिए एक असेंबली भाषा या कोडांतरक और disassembler है। इसका उपयोग 16-बिट, 32-बिट (IA-32) और 64-बिट (x86-64) प्रोग्राम लिखने के लिए किया जा सकता है। इसे लिनक्स के लिए सबसे लोकप्रिय असेंबलरों में से एक माना जाता है।[2]
यह मूल रूप से साइमन टाथम द्वारा जूलियन हॉल की सहायता से लिखा गया था। As of 2016[update], इसका रखरखाव एच. पीटर एनविन के नेतृत्व वाली एक छोटी टीम द्वारा किया जाता है।[3] यह सरलीकृत (2-क्लॉज) बीएसडी लाइसेंस की शर्तों के तहत जारी खुला स्रोत सॉफ्टवेयर है।[4]
सुविधाएँ
NASM COFF, OMF, a.out (फ़ाइल स्वरूप) | a.out, निष्पादन योग्य और लिंक करने योग्य स्वरूप (ELF), Mach-O और बाइनरी फ़ाइल (.bin, बाइनरी डिस्क छवि, सहित कई बाइनरी स्वरूपों का उत्पादन कर सकता है, जिसका उपयोग ऑपरेटिंग को संकलित करने के लिए किया जाता है। सिस्टम), हालांकि स्थिति-स्वतंत्र कोड केवल ईएलएफ वस्तु फ़ाइलोंों के लिए समर्थित है। इसका अपना बाइनरी फॉर्मेट भी है जिसे RDOFF कहा जाता है।[5]
आउटपुट स्वरूपों की विविधता प्रोग्रामों को वस्तुतः किसी भी x86 ऑपरेटिंग सिस्टम (OS) पर पुनः लक्षित करने की अनुमति देती है। यह बूटिंग, केवल पढ़ने के लिये मेमोरी (ROM) छवियों और OS विकास के विभिन्न पहलुओं में लिखने के लिए उपयोग करने योग्य फ्लैट बाइनरी फ़ाइलें भी बना सकता है।[5] यह असेंबली लैंग्वेज या क्रॉस असेंबलर जैसे पावरपीसी और एसपीएआरसी के रूप में गैर-x86 प्लेटफॉर्म पर चल सकता है, हालांकि यह उन मशीनों द्वारा प्रयोग करने योग्य प्रोग्राम उत्पन्न नहीं कर सकता है।
NASM AT&T Corporation|AT&T सिंटैक्स के बजाय Intel असेंबली सिंटैक्स के एक प्रकार का उपयोग करता है।[6] यह MASM और संगत असेंबलरों द्वारा उपयोग किए जाने वाले x86 मेमोरी सेगमेंटेशन ओवरराइड्स (और संबंधित ASSUME निर्देश) की स्वचालित पीढ़ी जैसी सुविधाओं से भी बचता है।[5]
प्रतिरूप प्रोग्राम
एक हैलो, वर्ल्ड! डॉस ऑपरेटिंग सिस्टम के लिए प्रोग्राम:
section .text
org 0x100
mov ah, 0x9
mov dx, hello
int 0x21
mov ax, 0x4c00
int 0x21
section .data
hello: db 'Hello, world!', 13, 10, '$'
<वाक्यविन्यास प्रकाश लैंग = nasm>
खंड। पाठ
संगठन 0x100
मूव आह, 0x9
एमओवी डीएक्स, हैलो
इंट 0x21
मूव कुल्हाड़ी, 0x4c00
इंट 0x21
खंड। डेटा
हैलो: डीबी 'हैलो, दुनिया!', 13, 10, '$'
</वाक्यविन्यास हाइलाइट>
लिनक्स के लिए एक समकक्ष प्रोग्राम:
global _start
section .text
_start:
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, msg
mov edx, msg.len
int 0x80 ; write(stdout, msg, strlen(msg));
xor eax, msg.len ; invert return value from write()
xchg eax, ebx ; value for exit()
mov eax, 1 ; exit
int 0x80 ; exit(...)
section .data
msg: db "Hello, world!", 10
.len: equ $ - msg
<वाक्यविन्यास प्रकाश लैंग = nasm>
ग्लोबल _स्टार्ट
खंड। पाठ
_शुरू करना:
मूव ईएक्स, 4; लिखना
मूव ईबीएक्स, 1; stout
मूव ईसीएक्स, संदेश
Mov edx, msg.len
इंट 0x80; लिखें (stdout, संदेश, strlen (संदेश));
एक्सोर ईएक्स, संदेश लेन; लिखने से उलटा वापसी मूल्य ()
एक्ससीजी ईएक्स, ईबीएक्स; बाहर निकलने के लिए मूल्य ()
मूव ईएक्स, 1; बाहर निकलना
इंट 0x80; बाहर निकलना(...)
खंड। डेटा
संदेश: डीबी हैलो, दुनिया! , 10
.len: equ $ - msg
</वाक्यविन्यास हाइलाइट>
Microsoft Windows के लिए समान प्रोग्राम का एक उदाहरण:
global _main
extern _MessageBoxA@16
extern _ExitProcess@4
section code use32 class=code
_main:
push dword 0 ; UINT uType = MB_OK
push dword title ; LPCSTR lpCaption
push dword banner ; LPCSTR lpText
push dword 0 ; HWND hWnd = NULL
call _MessageBoxA@16
push dword 0 ; UINT uExitCode
call _ExitProcess@4
section data use32 class=data
banner: db 'Hello, world!', 0
title: db 'Hello', 0
<वाक्यविन्यास प्रकाश लैंग = 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-बिट प्रोग्राम जो कीस्ट्रोक इनपुट करता है और इसे स्क्रीन पर दिखाता है:
global _start
section .data
query_string: db "Enter a character: "
query_string_len: equ $ - query_string
out_string: db "You have input: "
out_string_len: equ $ - out_string
section .bss
in_char: resw 4
section .text
_start:
mov rax, 0x2000004 ; put the write-system-call-code into register rax
mov rdi, 1 ; tell kernel to use stdout
mov rsi, query_string ; rsi is where the kernel expects to find the address of the message
mov rdx, query_string_len ; and rdx is where the kernel expects to find the length of the message
syscall
; read in the character
mov rax, 0x2000003 ; read system call
mov rdi, 0 ; stdin
mov rsi, in_char ; address for storage, declared in section .bss
mov rdx, 2 ; get 2 bytes from the kernel's buffer (one for the carriage return)
syscall
; show user the output
mov rax, 0x2000004 ; write system call
mov rdi, 1 ; stdout
mov rsi, out_string
mov rdx, out_string_len
syscall
mov rax, 0x2000004 ; write system call
mov rdi, 1 ; stdout
mov rsi, in_char
mov rdx, 2 ; the second byte is to apply the carriage return expected in the string
syscall
; exit system call
mov rax, 0x2000001 ; exit system call
xor rdi, rdi
syscall
<वाक्यविन्यास प्रकाश लैंग = 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)[5] जो आधुनिक उपयोग में स्वाभाविक रूप से सीमित हैं। ऑब्जेक्ट फ़ाइलों को निष्पादन योग्य प्रोग्राम में अनुवाद करने के लिए, एक उपयुक्त लिंकर (कंप्यूटिंग) का उपयोग किया जाना चाहिए, जैसे कि विंडोज़ के लिए विजुअल स्टूडियो लिंक यूटिलिटी या यूनिक्स जैसी प्रणालियों के लिए जीएनयू लिंकर।
विकास
NASM संस्करण 0.90 अक्टूबर 1996 में जारी किया गया था।[4]
संस्करण 2.00 को 28 नवंबर 2007 को जारी किया गया था, जिसमें x86-64 एक्सटेंशन के लिए समर्थन जोड़ा गया था।[3] विकास संस्करण SourceForge.net पर अपलोड नहीं किए गए हैं, लेकिन प्रोजेक्ट वेब पेज से उपलब्ध बाइनरी स्नैपशॉट के साथ गिटहब में चेक किए गए हैं।
NASM प्रलेखन के लिए एक खोज इंजन भी उपलब्ध है।[7]
जुलाई 2009 में, संस्करण 2.07 के अनुसार, NASM को सरलीकृत (2-खंड) BSD लाइसेंस के तहत जारी किया गया था। पहले, क्योंकि इसे जीएनयू लेसर जनरल पब्लिक लाइसेंस के तहत लाइसेंस दिया गया था, इसने Yasm के विकास का नेतृत्व किया, BSD लाइसेंस या 3-क्लॉज के तहत एक पूर्ण पुनर्लेखन। Yasm ने NASM से पहले x86-64 के लिए समर्थन की पेशकश की। इसने GNU असेंबलर सिंटैक्स के लिए समर्थन भी जोड़ा।
आरडीओएफएफ
एनएएसएम की ऑब्जेक्ट फ़ाइल आउटपुट क्षमताओं की अखंडता का परीक्षण करने के लिए डेवलपर्स द्वारा पुनर्निधारणीय गतिशील ऑब्जेक्ट फ़ाइल स्वरूप (आरडीओएफएफ) का उपयोग किया जाता है। यह काफी हद तक NASM की आंतरिक संरचना पर आधारित है,[8] अनिवार्य रूप से आउटपुट ड्राइवर फ़ंक्शन कॉल के क्रमांकन वाले हेडर से युक्त होता है, जिसके बाद निष्पादन योग्य कोड या डेटा वाले अनुभागों की एक सरणी होती है। एनएएसएम वितरण में लिंकर और लोडर सहित प्रारूप का उपयोग करने के लिए उपकरण शामिल हैं।
अक्टूबर 1996 में संस्करण 0.90 जारी होने तक, NASM ने केवल फ्लैट-प्रारूप निष्पादन योग्य फ़ाइलों (जैसे, DOS COM फ़ाइलें) के आउटपुट का समर्थन किया। संस्करण 0.90 में, साइमन टैथम ने ऑब्जेक्ट-फ़ाइल आउटपुट इंटरफ़ेस के लिए और केवल 16-बिट कोड के लिए DOS .OBJ फ़ाइलों के लिए समर्थन जोड़ा।[9]
NASM में इस प्रकार 32-बिट ऑब्जेक्ट प्रारूप का अभाव था। इस कमी को दूर करने के लिए, और ऑब्जेक्ट-फाइल इंटरफ़ेस सीखने के अभ्यास के रूप में, डेवलपर जूलियन हॉल ने RDOFF के पहले संस्करण को एक साथ रखा, जिसे NASM संस्करण 0.91 में जारी किया गया था।[9]
इस प्रारंभिक संस्करण के बाद से, RDOFF प्रारूप में एक प्रमुख अद्यतन किया गया है, जिसमें प्रत्येक हेडर रिकॉर्ड पर एक रिकॉर्ड-लंबाई संकेतक जोड़ा गया है,[10] प्रोग्रामों को उन रिकॉर्डों को छोड़ने की अनुमति देना जिनके प्रारूप को वे नहीं पहचानते हैं, और कई खंडों के लिए समर्थन करते हैं; RDOFF1 केवल तीन खंडों का समर्थन करता है: पाठ, डेटा और bss (जिसमें गैर-प्रारंभिक डेटा शामिल है)।[8]
RDOFF प्रारूप को दृढ़ता से बहिष्कृत किया गया है और इसे NASM 2.15.04 से अक्षम कर दिया गया है।[11]
यह भी देखें
- सभा की भाषा
- कोडांतरकों की तुलना
संदर्भ
- ↑ "NASM, the Netwide Assembler". GitHub. 25 October 2021.
- ↑ Ram Narayan. "Linux assemblers: A comparison of GAS and NASM". IBM. Archived from the original on 3 October 2013.
two of the most popular assemblers for Linux, GNU Assembler (GAS) and Netwide Assembler (NASM)
- ↑ 3.0 3.1 "The Netwide Assembler". Retrieved 2008-06-27.
- ↑ 4.0 4.1 "NASM Version History". Retrieved 2019-08-03.
- ↑ 5.0 5.1 5.2 5.3 "NASM Manual". Archived from the original on 23 February 2009. Retrieved 2009-08-15.
- ↑ Randall Hyde. "NASM: The Netwide Assembler". Archived from the original on 12 September 2010. Retrieved 2008-06-27.
- ↑ "NASM Doc Search Engine". Archived from the original on 23 January 2010. Retrieved 2009-09-14.
- ↑ 8.0 8.1 "NASM Manual Ch. 6". Retrieved 2008-06-27.
- ↑ 9.0 9.1 "NASM CVS". 2008-06-08. Retrieved 2008-06-27.
- ↑ "V1-V2.txt". 2002-12-04. Retrieved 2008-06-27.
- ↑ "Relocatable Dynamic Object File Format (deprecated)".
अग्रिम पठन
- Jeff Duntemann (2000). Assembly Language Step by Step. J Wiley and Sons. ISBN 0-471-37523-3.
बाहरी संबंध
- Official website
- नेटवाइड असेंबलर on SourceForge
- Special edition for Win32 and BeOS.
- A comparison of GAS and NASM at IBM
- "नेटवाइड असेंबलर". Freecode.: a converter between the source format of the assemblers NASM and GAS