NASM

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
NASM
Netwide Assembler.svg
Тип мова програмування і x86 assembly language[d]
Розробник Hans Peter Anvin[d]
Версії 2.13.03 (8 лютого 2018)[1]
Репозиторій http://repo.or.cz/nasm.git, git://repo.or.cz/nasm.git
Операційна система крос-платформова програма
Написано на C[2]
Ліцензія 2-clause BSD license[d][3]
nasm.us

Netwide Assembler (NASM) — асемблер і дизасемблер для архітектури x86. Може використовуватися для написання 16-,32- і 64-бітних програм. NASM вважається одним із найпопулярніших асемблерів для Linux.

NASM може працювати на платформах, відмінних від x86, таких як SPARC і PowerPC, проте код він генерує лише для x86 і x86-64[4].

NASM може компілювати у декілька бінарних форматів, зокрема COFF, Portable Executable, a.out, ELF і Mach-O. NASM також має свій власний бінарний формат під назвою RDOFF.

Така велика кількість підтримуваних бінарних форматів дозволяє кросс-компіляцію для абсолютної більшості систем на платформі x86. Крім того, NASM може створювати плоскі бінарні файли, що дозволяє написання завантажувальника ОС, образи ROM і фактично будь-яку частину операційної системи.

NASM успішно конкурує зі стандартним в Linux і багатьох інших UNIX-системах асемблером gas[5]. Вважається, що якість документації у 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

Примітки[ред. | ред. код]

  1. http://repo.or.cz/nasm.git/tag/refs/tags/nasm-2.13.03
  2. The nasm Open Source Project on Open Hub: Languages Page — 2006.
  3. http://www.nasm.us/
  4. 1.1 What Is NASM?. The Netwide Assembler: NASM. Офіційний сайт. Архів оригіналу за 2012-02-18. Процитовано 2010-07-14. «NASM, is an 80x86 and x86-64 assembler» 
  5. Ассемблеры для Linux: Сравнение GAS и NASM(рос.)