Netwide Assembler

редактировать
Assembler для архитектуры Intel x86

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

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

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

Содержание
  • 1 Функции
  • 2 Примеры программ для различных операционных систем
  • 3 Связывание
  • 4 Разработка
  • 5 RDOFF
  • 6 См. Также
  • 7 Ссылки
  • 8 Дополнительная литература
  • 9 Внешние ссылки
Возможности

NASM может выводить несколько бинарных форматов, включая COFF, OMF, a.out, Executable and Linkable Format (ELF), Mach-O и двоичный файл (.bin, двоичный образ диска, используемый для компиляции операционных систем ), хотя позиционно-независимый код поддерживается только для объектных файлов ELF . NASM также имеет свой собственный двоичный формат под названием RDOFF.

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

NASM использует вариант синтаксиса сборки Intel вместо синтаксиса ATT. Он также позволяет избежать таких функций, как автоматическое создание переопределений сегмента (и соответствующей директивы ASSUME), используемых MASM и совместимыми ассемблерами.

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

Это «Привет, мир!» программа для операционной системы 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, '$'

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

глобальный раздел _start.text _start: mov eax, 4; напишите mov ebx, 1; stdout mov ecx, msg mov edx, msg.len int 0x80; написать (stdout, msg, strlen (msg)); xor eax, msg.len; инвертировать возвращаемое значение из write () xchg eax, ebx; значение для exit () mov eax, 1; выход из int 0x80; exit (...) section.data msg: db "Hello, world!", 10.len: equ $ - msg

Пример аналогичной программы для Microsoft Windows :

global _main extern _MessageBoxA @ 16 extern _ExitProcess @ 4 код раздела use32 class = code _main: 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

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

global _start section.data query_string: db "Введите символ:" query_string_len: equ $ - query_string out_string: db "У вас есть input:" out_string_len: equ $ - out_string section.bss in_char: раздел resw 4.text _start: mov rax, 0x2000004; поместить код системного вызова записи в регистр rax mov rdi, 1; указать ядру использовать stdout mov rsi, query_string; rsi - это то место, где ядро ​​ожидает найти адрес сообщения mov rdx, query_string_len; а rdx - это то место, где ядро ​​ожидает найти длину системного вызова сообщения; читать в символе mov rax, 0x2000003; читать системный вызов mov rdi, 0; stdin mov rsi, in_char; адрес для хранения, заявленный в секции.bss mov rdx, 2; получить 2 байта из буфера ядра (один для возврата каретки) системный вызов; показать пользователю вывод mov rax, 0x2000004; написать системный вызов mov rdi, 1; stdout mov rsi, out_string mov rdx, out_string_len системный вызов mov rax, 0x2000004; написать системный вызов mov rdi, 1; stdout mov rsi, in_char mov rdx, 2; второй байт должен применить возврат каретки, ожидаемый в системном вызове строки; выйти из системного вызова mov rax, 0x2000001; exit системный вызов xor rdi, rdi syscall
Связывание

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

Разработка

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

28 ноября 2007 года была выпущена версия 2.00, добавляющая поддержку x86- 64 добавочных номера. Разрабатываемые версии не загружаются на SourceForge.net ; вместо этого они регистрируются в GitHub с бинарными снимками, доступными на веб-странице проекта.

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

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

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

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

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

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

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

См. Также
  • Портал бесплатного программного обеспечения с открытым исходным кодом
Ссылки
Дополнительная литература
Внешние ссылки
Последняя правка сделана 2021-05-31 04:54:16
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте