NASM

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
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]
Операційна система крос-платформова програма
Мова програмування C[112]
Ліцензія 2-clause BSD Licensed[113]
Репозиторій github.com/netwide-assembler/nasm
Вебсайт nasm.us

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

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.](рос.)