Сетевой ассемблер - Netwide Assembler

Сетевой ассемблер
Логотип NASM
Оригинальный автор (ы)Саймон Татхам, Джулиан Холл
Разработчики)Х. Питер Анвин, и другие.
изначальный выпускОктябрь 1996; 24 года назад (1996-10)
Стабильный выпуск
2.15.03 / 18 июля 2020; 4 месяца назад (2020-07-18)
Репозиторий Отредактируйте это в Викиданных
Операционная системаUnix-подобный, Windows, OS / 2, MS-DOS
Доступно ванглийский
Типx86 ассемблер
ЛицензияBSD, 2 предложения
Интернет сайтwww.nasm.нас

В Сетевой ассемблер (NASM) является ассемблер и дизассемблер для Intel x86 архитектура. Его можно использовать для записи 16 бит, 32-битный (IA-32 ) и 64-битный (x86-64 ) программы. NASM считается одним из самых популярных ассемблеров для Linux.[1]

NASM был первоначально написан Саймон Татхам с помощью Джулиана Холла. По состоянию на 2016 год, он поддерживается небольшой командой во главе с Х. Питер Анвин.[2] это программное обеспечение с открытым исходным кодом выпущен на условиях упрощенной (2-х п.) Лицензия BSD.[3]

особенности

NASM может выводить несколько двоичных форматов, включая COFF, OMF, а. выход, Исполняемый и связываемый формат (ELF), Мачо и бинарный файл (.bin, двоичный образ диска, используемый для компиляции операционные системы ), хотя позиционно-независимый код поддерживается только для ELF объектные файлы. NASM также имеет собственный двоичный формат RDOFF.[4]

Разнообразие выходных форматов позволяет перенацеливание программы практически для любой операционной системы (ОС) x86. Также NASM может создавать плоские двоичные файлы, можно писать загрузчики, только для чтения памяти (ROM) образы и в различных аспектах разработки ОС.[4] NASM может работать на платформах, отличных от x86, в качестве кросс-ассемблер, такие как PowerPC и SPARC, хотя он не может создавать программы, которые можно использовать на этих машинах.

NASM использует вариант Синтаксис сборки Intel вместо того AT&T синтаксис.[5] Он также позволяет избежать таких функций, как автоматическое создание сегмент переопределяет (и соответствующую директиву ASSUME), используемую МАСМ и совместимые ассемблеры.[4]

Примеры программ для различных операционных систем

Это "Привет мир!" программа для ДОС Операционная система.

раздел .текстorg 0x100	mov	ах, 0x9	mov	dx, Здравствуйте	int	0x21	mov	топор, 0x4c00	int	0x21раздел .данныеЗдравствуйте:	db 'Привет мир!', 13, 10, '$'

Эквивалентная программа для Linux:

Глобальный _Начнитераздел .текст_Начните:	mov	eax, 4 ; записывать	mov	ebx, 1 ; стандартный вывод	mov	ecx, сообщение	mov	edx, msg.len	int	0x80   ; написать (stdout, msg, strlen (msg));	xor	eax, msg.len ; инвертировать возвращаемое значение из write ()	xchg eax, ebx ; значение для exit ()	mov	eax, 1 ; выход	int	0x80   ; выход(...)раздел .данныесообщение:	db	"Привет мир!", 10.len:	равно	$ - сообщение

Пример аналогичной программы для Майкрософт Виндоус:

Глобальный _основнойвнешний _MessageBoxA @ 16внешний _ExitProcess @ 4раздел код использовать32 clжопа=код_основной:	От себя	dword 0      ; UINT uType = MB_OK	От себя	dword заглавие  ; LPCSTR lpCaption	От себя	dword знамя ; LPCSTR lpText	От себя	dword 0      ; HWND hWnd = NULL	вызов	_MessageBoxA @ 16	От себя	dword 0      ; UINT uExitCode	вызов	_ExitProcess @ 4раздел данные использовать32 clжопа=данные	баннер:	db 'Привет мир!', 0	заглавие:	db 'Здравствуйте', 0

Ниже представлена ​​64-битная программа для Apple. OS X который вводит нажатие клавиши и показывает его на экране

Глобальный _Начнитераздел .данные	Строка запроса:		db	«Введите символ:»	query_string_len:	равно	$ - Строка запроса	out_string:			db	"Вы ввели:"	out_string_len:		равно	$ - out_stringраздел .bss	in_char:			resw 4раздел .текст_Начните:	mov	rax, 0x2000004	 	; поместите код системного вызова записи в регистр rax	mov	rdi, 1				; скажите ядру использовать stdout	mov	RSI, Строка запроса	; rsi - это то место, где ядро ​​ожидает найти адрес сообщения	mov	rdx, query_string_len	; а rdx - это то место, где ядро ​​ожидает найти длину сообщения 	системный вызов	; читать в персонаже	mov	rax, 0x2000003		; читать системный вызов	mov	rdi, 0				; стандартный ввод	mov	RSI, in_char		; адрес для хранения, заявленный в разделе .bss	mov	rdx, 2				; получить 2 байта из буфера ядра (один для возврата каретки)	системный вызов	; показать пользователю вывод	mov	rax, 0x2000004		; написать системный вызов	mov	rdi, 1				; стандартный вывод	mov	RSI, out_string	mov	rdx, out_string_len	системный вызов	mov	rax, 0x2000004		; написать системный вызов	mov	rdi, 1				; стандартный вывод	mov	RSI, in_char	mov	rdx, 2				; второй байт - применить возврат каретки, ожидаемый в строке	системный вызов	; выйти из системного вызова	mov	rax, 0x2000001		; выйти из системного вызова	xor     rdi, rdi	системный вызов

Связывание

NASM в основном выводит объектные файлы, которые, как правило, не исполняются сами по себе. Единственное исключение - плоские двоичные файлы (например, .COM )[4] которые по своей сути ограничены в современном использовании. Чтобы преобразовать объектные файлы в исполняемые программы, соответствующий компоновщик должны использоваться, например Visual Studio Утилита "LINK" для Windows или ld для Unix-подобных систем.

Развитие

Первый выпуск, версия 0.90, был выпущен в октябре 1996 года.[3]

28 ноября 2007 года была выпущена версия 2.00, в которой добавлена ​​поддержка x86-64 расширения.[2] Версии для разработки не загружаются в SourceForge.net; вместо этого они регистрируются в GitHub с бинарными снимками, доступными на веб-странице проекта.

Также доступна поисковая машина для документации NASM.[6]

В июле 2009 года, начиная с версии 2.07, NASM был выпущен под упрощенной (2 пункта) лицензией BSD. Раньше, поскольку NASM имел лицензию на LGPL, это привело к разработке Yasm, полной переписи NASM под Новая лицензия BSD. Yasm предлагал поддержку x86-64 раньше, чем NASM. Также добавлена ​​поддержка Ассемблер GNU синтаксис.

RDOFF

RDOFF
РазработанДжулиан Холл
Тип форматаФормат объектного файла
Контейнер дляКод объекта

Формат перемещаемого динамического объектного файла (RDOFF) используется разработчиками для проверки целостности возможностей вывода объектного файла NASM. Он во многом основан на внутренней структуре NASM,[7] по существу состоящий из заголовка, содержащего сериализация вызовов функций выходного драйвера, за которыми следует массив разделов, содержащих исполняемый код или данные. Инструменты для использования формата, включая компоновщик и загрузчик, включены в дистрибутив NASM.

До выпуска версии 0.90 в октябре 1996 года NASM поддерживал вывод только исполняемых файлов в плоском формате (например, ДОС COM файлы ). В версии 0.90 Саймон Татхам добавлена ​​поддержка интерфейса вывода объектного файла и файлов DOS .OBJ только для 16-битного кода.[8]

Таким образом, у NASM не было 32-битного объектного формата. Чтобы устранить этот недостаток и в качестве упражнения по изучению интерфейса объектных файлов, разработчик Джулиан Холл собрал первую версию RDOFF, которая была выпущена в версии NASM 0.91.[8]

Начиная с этой первоначальной версии, было одно крупное обновление формата RDOFF, которое добавило индикатор длины записи для каждой записи заголовка,[9] разрешение программам пропускать записи, формат которых они не распознают, и поддержка нескольких сегментов; RDOFF1 поддерживает только три сегмента: текст, данные и bss (содержащие неинициализированные данные).[7]

Смотрите также

использованная литература

  1. ^ Рам Нараян. «Ассемблеры Linux: сравнение GAS и NASM». Архивировано из оригинал 3 октября 2013 г. два самых популярных ассемблера для Linux, GNU Assembler (GAS) и Netwide Assembler (NASM)
  2. ^ а б "Сетевой ассемблер". Получено 27 июн 2008.
  3. ^ а б «История версий NASM». Получено 3 августа 2019.
  4. ^ а б c d «Руководство NASM». Архивировано из оригинал 23 февраля 2009 г.. Получено 15 августа 2009.
  5. ^ Рэндалл Хайд. «NASM: Сетевой ассемблер». Архивировано из оригинал 12 сентября 2010 г.. Получено 27 июн 2008.
  6. ^ "NASM Doc Search Engine". Архивировано из оригинал 23 января 2010 г.. Получено 14 сентября 2009.
  7. ^ а б "Руководство NASM, глава 6". Получено 27 июн 2008.
  8. ^ а б «НАСМ CVS». 8 июня 2008 г.. Получено 27 июн 2008.
  9. ^ "V1-V2.txt". 4 декабря 2002 г.. Получено 27 июн 2008.

дальнейшее чтение

внешние ссылки