NASM
Netwide Assembler (NASM) — асемблер і дизасемблер для архітектури x86. Може використовуватися для написання 16-,32- і 64-бітних програм. NASM вважається одним із найпопулярніших асемблерів для Linux.
NASM може працювати на платформах, відмінних від x86, таких як SPARC і PowerPC, проте код він генерує лише для x86 і x86-64[3].
NASM може компілювати у декілька бінарних форматів, зокрема COFF, Portable Executable, a.out, ELF і Mach-O. NASM також має свій власний бінарний формат під назвою RDOFF.
Така велика кількість підтримуваних бінарних форматів дозволяє кросс-компіляцію для абсолютної більшості систем на платформі x86. Крім того, NASM може створювати плоскі бінарні файли, що дозволяє написання завантажувальника ОС, образи ROM і фактично будь-яку частину операційної системи.
NASM успішно конкурує зі стандартним в Linux і багатьох інших UNIX-системах асемблером gas[4]. Вважається, що якість документації у NASM вище, ніж у gas. Крім того, асемблер gas використовує синтаксис AT&T, в той час як NASM використовує варіант традиційного для x86-асемблера синтаксису Intel; Intel-синтаксис використовується всіма асемблерами для Windows, наприклад MASM, TASM, FASM.
Історія
ред.NASM був створений Саймоном Тетгемом спільно з Джуліаном Голом і в наш час[коли?] розвивається невеликою командою розробників на SourceForge.net. Спочатку він був випущений за умовами власної ліцензії, але пізніше вона була замінена на GNU LGPL. Починаючи з версії 2.07 ліцензія замінена на «спрощену BSD» (BSD з 2 пунктів).
Приклади для різних операційних систем
ред.Програма Hello World для операційної системи DOS.
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, '$'
Подібна програма для Microsoft Windows.
global _start
extern _MessageBoxA@16
extern _ExitProcess@4
section code use32 class=code
_start:
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
Аналог для Linux.
section .data
msg: db "Hello, world!", 10
.len: equ $ - msg
section .text
global _start
_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
Примітки
ред.- ↑ The nasm Open Source Project on Open Hub: Languages Page — 2006.
- ↑ http://www.nasm.us/
- ↑ 1.1 What Is NASM?. The Netwide Assembler: NASM. Офіційний сайт. Архів оригіналу за 18 лютого 2012. Процитовано 14 липня 2010.
NASM, is an 80x86 and x86-64 assembler
- ↑ Ассемблеры для Linux: Сравнение GAS и NASM [Архівовано 16 серпня 2011 у Wayback Machine.](рос.)