نتواید اسمبلر
نتواید اسمبلر (به انگلیسی: Netwide Assembler) یا به اختصار نسم (به انگلیسی: NASM) یک اسمبلر و دیاسمبلر برای معماری اینتل ایکس۸۶ است. از این اسمبلر میتوان برای نوشتن برنامههای ۱۶-بیتی، ۳۲-بیتی و ۶۴-بیتی استفاده کرد. نسم به عنوان یکی از محبوبترین اسمبلرها برای لینوکس و دیگر سیستمعاملهای شبه یونیکس مانند بیاسدی شناخته میشود. نسم در ابتدا توسط سیمون تاتام و با همکاری ژولیان هال نوشته شد و در حال حاضر توسط تیم کوچکی به رهبری پیتر انوین نگهداری میشود. نسم یک نرمافزار آزاد است و تحت پروانه بیاسدی عرضه میشود. نسم قادر به تولید کردن انواع مختلفی از فایلهای باینری از جمله COFF, ELF, a.out, Mach-O و پرونده دودویی (دیسک تصویر باینری که برای کامپایل سیستمعاملها استفاده میشود) است. با این حال، نسم تنها میتواند برای قالب ELF کد مستقل از جایگاه (به انگلیسی: position-independent code) تولید کند. همچنین نسم یک قالب باینری مخصوص به خود به نام RDOF دارد.
نویسنده(های) اصلی | سیمون تاتام، ژولیان هال |
---|---|
توسعهدهنده(ها) | پیتر انوین |
انتشار پایدار | ۲٫۱۰٫۰۷
۲ ژانویه ۲۰۱۳ |
مخزن | |
سیستمعامل | مایکروسافت ویندوز، شبه یونیکس، داس، اواس/۲ و مک اواس ده |
گونه | اسمبلر و دیاسمبلر |
پروانه | پروانه بیاسدی |
وبگاه |
تنوع قالبهای خروجی که نسم قادر به تولید آنهاست، به برنامهها اجازه میدهد تا تقریباً بر روی همه سیستمعاملهای اکس۸۶ retarget شوند. به علاوه، نسم میتواند فایلهای باینری مسطح تولید کند که این گونه فایلها برای نوشتن بوت لودرها، تصاویر ROM، و دیگر وجوه توسعه سیستمعامل استفاده میشوند. نسم میتواند بر روی سکوهای غیر اکس۸۶ نظیر پاورپیسی و اسپارک هم اجرا شود، هر چند که نمیتواند برنامههایی که مخصوص این ماشینها هستند را تولید کند. سینتکس مورد استفاده در نسم، گونهای از سینتکس اسمبلی اینتل است و نسم از سینتکس AT&T استفاده نمیکند.
پیوند دادن
نسم تنها فایلهای مقصود را تولید میکند که این فایلها به تنهایی قابل اجرا نیستند. برای تبدیل کردن این فایلهای مخصوص به برنامه قابل اجرا، باید از یک برنامه خاصی به نام پیوندده استفاده کرد. برای مثال ابزاری به نام LINK در نرمافزار ویژوال استودیو یا برنامه ld در سیستمعاملهای شبه یونیکس این کار را انجام میدهد.
مثال
یک برنامه Hello World برای سیستمعامل اماس-داس:
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, '$'
مثالی مشابه برای مایکروسافت ویندوز:
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
و معادل همین برنامه برای لینوکس:
global _start
section .text
_start:
mov eax, 4 ; write
mov ebx, 1 ; stdout
mov ecx, msg
mov edx, msg.len
int 0x80
mov eax, 1 ; exit
mov ebx, 0
int 0x80
section .data
msg: db "Hello, world!", 10
.len: equ $ - msg
منابع
- ↑ Ram Narayan. "Linux assemblers: A comparison of GAS and NASM".
two of the most popular assemblers for Linux, GNU Assembler (GAS) and Netwide Assembler (NASM)
- ↑ "The Netwide Assembler". Retrieved 2008-06-27.
- ↑ "NASM Version History". Retrieved 2009-07-19.
- ↑ "NASM Manual". Archived from the original on 23 February 2009. Retrieved 2009-08-15.