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

NASM
Netwide Assembler.svg
Тип мова програмування і Мова асемблера x86
Автор(и) Саймон Тетхем
Розробник Hans Peter Anvind
Версії
2.11.08 (21 лютого 2015)[4], 2.13 (29 квітня 2017)[5][6], 2.13.02 (30 листопада 2017)[7][8], 2.13.03 (8 лютого 2018)[9][10], 2.14.02 (26 грудня 2018)[11][12], 2.15 (27 червня 2020)[1][2][…], 2.15.01 (27 червня 2020)[1][13][14], 2.15.02 (2 липня 2020)[1][15][16], 0.91 (30 квітня 2002)[17], 0.93 (30 квітня 2002)[18], 0.94 (30 квітня 2002)[19], 0.95 (30 квітня 2002)[20], 0.96 (30 квітня 2002)[21], 0.97 (30 квітня 2002)[22], 0.98e (30 квітня 2002)[23], 0.98 (30 квітня 2002)[24], 0.98.03 (30 квітня 2002)[25], 0.98.08 (30 квітня 2002)[26], 0.98.09 (30 квітня 2002)[27], 0.98.11 (30 квітня 2002)[28], 0.98.12 (30 квітня 2002)[29], 0.98.14 (30 квітня 2002)[30], 0.98.15 (30 квітня 2002)[31], 0.98.16 (30 квітня 2002)[32], 0.98.17 (30 квітня 2002)[33], 0.98.18 (30 квітня 2002)[34], 0.98.19 (30 квітня 2002)[35], 0.98.20 (30 квітня 2002)[36], 0.98.21 (30 квітня 2002)[37], 0.98.22 (30 квітня 2002)[38], 0.98.23 (30 квітня 2002)[39], 0.98.24 (30 квітня 2002)[40], 0.98.25 (30 квітня 2002)[41], 0.98.26 (30 квітня 2002)[42], 0.98.30 (30 квітня 2002)[43], 0.98.31 (10 травня 2002)[44], 0.98.32 (19 травня 2002)[45], 0.98.33 (27 травня 2002)[46], 0.98.34 (8 червня 2002)[47], 0.98.35 (13 вересня 2002)[48], 0.98.36 (12 березня 2003)[49], 0.98.37 (29 серпня 2003)[50], 0.98.38 (12 вересня 2003)[51], 0.98.39 (15 січня 2005)[52], 0.99.01 (30 травня 2007)[53], 0.99.02 (4 вересня 2007)[54], 0.99.03 (20 вересня 2007)[55], 0.99.04 (26 вересня 2007)[56], 0.99.05 (17 жовтня 2007)[57], 0.99.06 (1 листопада 2007)[58], 2.00 (28 листопада 2007)[59], 2.01 (17 січня 2008)[60], 2.02 (19 лютого 2008)[61], 2.03 (9 червня 2008)[62], 2.03.01 (17 червня 2008)[63], 2.04 (26 вересня 2008)[64], 2.05 (24 жовтня 2008)[65], 2.05.01 (29 жовтня 2008)[66], 2.06 (30 червня 2009)[67], 2.07 (20 липня 2009)[68], 2.08 (10 березня 2010)[69], 2.08.01 (10 березня 2010)[70], 2.08.02 (9 липня 2010)[71], 2.09 (24 серпня 2010)[72], 2.09.01 (7 вересня 2010)[73], 2.09.02 (17 вересня 2010)[74], 2.09.03 (27 жовтня 2010)[75], 2.09.04 (21 листопада 2010)[76], 2.09.05 (20 лютого 2011)[77], 2.09.06 (28 лютого 2011)[78], 2.09.07 (12 березня 2011)[79], 2.09.08 (6 квітня 2011)[80], 2.09.09 (3 липня 2011)[81], 2.09.10 (15 липня 2011)[82], 2.10 (12 березня 2012)[83], 2.10.01 (24 травня 2012)[84], 2.10.02 (21 липня 2012)[85], 2.10.03 (23 липня 2012)[86], 2.10.04 (18 серпня 2012)[87], 2.10.05 (9 вересня 2012)[88], 2.10.06 (4 грудня 2012)[89], 2.10.07 (2 січня 2013)[90], 2.10.08 (21 липня 2013)[91], 2.10.09 (23 липня 2013)[92], 2.11 (31 грудня 2013)[93], 2.11.01 (18 лютого 2014)[94], 2.11.02 (19 лютого 2014)[95], 2.11.03 (5 травня 2014)[96], 2.11.04 (9 травня 2014)[97], 2.11.05 (21 травня 2014)[98], 2.11.06 (17 жовтня 2014)[99], 2.11.07 (9 грудня 2014)[100], 2.12 (27 лютого 2016)[101], 2.12.01 (18 березня 2016)[102], 2.12.02 (6 липня 2016)[103], 2.13.01 (2 травня 2017)[104], 2.14 (7 листопада 2018)[105], 2.14.01 (23 грудня 2018)[106], 2.15.03 (18 липня 2020)[107], 2.15.04 (20 серпня 2020)[108], 2.15.05 (28 серпня 2020)[109], 2.16.01 (21 грудня 2022)[110] і 2.16 (21 грудня 2022)[111]
Репозиторій github.com/netwide-assembler/nasm
Операційна система крос-платформова програма
Мова програмування C[112]
Ліцензія 2-clause BSD Licensed[113]
Вебсайт nasm.us

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

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

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

NASM успішно конкурує зі стандартним в Linux і багатьох інших UNIX-системах асемблером gas[115]. Вважається, що якість документації у 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. а б в г https://www.nasm.us/pub/nasm/releasebuilds/?C=M;O=D
  2. а б Announcing NASM 2.15 — 2020.
  3. а б https://repo.or.cz/nasm.git/tag/03231c40a59533ec28f593f5a549688239a3c637
  4. Release 2.11.08 — 2015.
  5. Index of /pub/nasm/releasebuilds/2.13
  6. Release 2.13 — 2017.
  7. http://repo.or.cz/nasm.git/commit/fe2f6de2ee85959747a4e4a99ea43a38509cc3b2
  8. Release 2.13.02 — 2017.
  9. http://repo.or.cz/nasm.git/tag/refs/tags/nasm-2.13.03
  10. Release 2.13.03 — 2018.
  11. https://repo.or.cz/nasm.git/tag/a73b8be6f0f9e307e3c6131011a30f2fd5b00877
  12. https://github.com/netwide-assembler/nasm/releases/tag/nasm-2.14.02
  13. https://repo.or.cz/nasm.git/tag/6d78c07e6b0d1602ab096eec29628bfa7afb639c
  14. https://github.com/netwide-assembler/nasm/releases/tag/nasm-2.15.01
  15. https://nasm.us/doc/nasmdocc.html
  16. https://github.com/netwide-assembler/nasm/releases/tag/nasm-2.15.02
  17. Release 0.91 — 2002.
  18. Release 0.93 — 2002.
  19. Release 0.94 — 2002.
  20. Release 0.95 — 2002.
  21. Release 0.96 — 2002.
  22. Release 0.97 — 2002.
  23. Release 0.98e — 2002.
  24. Release 0.98 — 2002.
  25. Release 0.98.03 — 2002.
  26. Release 0.98.08 — 2002.
  27. Release 0.98.09 — 2002.
  28. Release 0.98.11 — 2002.
  29. Release 0.98.12 — 2002.
  30. Release 0.98.14 — 2002.
  31. Release 0.98.15 — 2002.
  32. Release 0.98.16 — 2002.
  33. Release 0.98.17 — 2002.
  34. Release 0.98.18 — 2002.
  35. Release 0.98.19 — 2002.
  36. Release 0.98.20 — 2002.
  37. Release 0.98.21 — 2002.
  38. Release 0.98.22 — 2002.
  39. Release 0.98.23 — 2002.
  40. Release 0.98.24 — 2002.
  41. Release 0.98.25 — 2002.
  42. Release 0.98.26 — 2002.
  43. Release 0.98.30 — 2002.
  44. Release 0.98.31 — 2002.
  45. Release 0.98.32 — 2002.
  46. Release 0.98.33 — 2002.
  47. Release 0.98.34 — 2002.
  48. Release 0.98.35 — 2002.
  49. Release 0.98.36 — 2003.
  50. Release 0.98.37 — 2003.
  51. Release 0.98.38 — 2003.
  52. Release 0.98.39 — 2005.
  53. Release 0.99.01 — 2007.
  54. Release 0.99.02 — 2007.
  55. Release 0.99.03 — 2007.
  56. Release 0.99.04 — 2007.
  57. Release 0.99.05 — 2007.
  58. Release 0.99.06 — 2007.
  59. Release 2.00 — 2007.
  60. Release 2.01 — 2008.
  61. Release 2.02 — 2008.
  62. Release 2.03 — 2008.
  63. Release 2.03.01 — 2008.
  64. Release 2.04 — 2008.
  65. Release 2.05 — 2008.
  66. Release 2.05.01 — 2008.
  67. Release 2.06 — 2009.
  68. Release 2.07 — 2009.
  69. Release 2.08 — 2010.
  70. Release 2.08.01 — 2010.
  71. Release 2.08.02 — 2010.
  72. Release 2.09 — 2010.
  73. Release 2.09.01 — 2010.
  74. Release 2.09.02 — 2010.
  75. Release 2.09.03 — 2010.
  76. Release 2.09.04 — 2010.
  77. Release 2.09.05 — 2011.
  78. Release 2.09.06 — 2011.
  79. Release 2.09.07 — 2011.
  80. Release 2.09.08 — 2011.
  81. Release 2.09.09 — 2011.
  82. Release 2.09.10 — 2011.
  83. Release 2.10 — 2012.
  84. Release 2.10.01 — 2012.
  85. Release 2.10.02 — 2012.
  86. Release 2.10.03 — 2012.
  87. Release 2.10.04 — 2012.
  88. Release 2.10.05 — 2012.
  89. Release 2.10.06 — 2012.
  90. Release 2.10.07 — 2013.
  91. Release 2.10.08 — 2013.
  92. Release 2.10.09 — 2013.
  93. Release 2.11 — 2013.
  94. Release 2.11.01 — 2014.
  95. Release 2.11.02 — 2014.
  96. Release 2.11.03 — 2014.
  97. Release 2.11.04 — 2014.
  98. Release 2.11.05 — 2014.
  99. Release 2.11.06 — 2014.
  100. Release 2.11.07 — 2014.
  101. Release 2.12 — 2016.
  102. Release 2.12.01 — 2016.
  103. Release 2.12.02 — 2016.
  104. Release 2.13.01 — 2017.
  105. Release 2.14 — 2018.
  106. Release 2.14.01 — 2018.
  107. Release 2.15.03 — 2020.
  108. Release 2.15.04 — 2020.
  109. Release 2.15.05 — 2020.
  110. https://www.nasm.us/pub/nasm/releasebuilds/2.16.01/
  111. Release 2.16 — 2022.
  112. The nasm Open Source Project on Open Hub: Languages Page — 2006.
  113. http://www.nasm.us/
  114. 1.1 What Is NASM?. The Netwide Assembler: NASM. Офіційний сайт. Архів оригіналу за 18 лютого 2012. Процитовано 14 липня 2010. «NASM, is an 80x86 and x86-64 assembler» 
  115. Ассемблеры для Linux: Сравнение GAS и NASM [Архівовано 16 серпня 2011 у Wayback Machine.](рос.)