В этой статье слишком много ссылок на первоисточники . ( Февраль 2012 г. ) ( Узнайте, как и когда удалить этот шаблон сообщения ) |
Автор (ы) оригинала | Саймон Тэтхам , Джулиан Холл |
---|---|
Разработчики) | Х. Питер Анвин и др. |
Начальная версия | Октябрь 1996 г . |
Стабильный выпуск | 2.15.05 / 28 августа 2020 г . |
Репозиторий | |
Написано в | Сборка , C [1] |
Операционная система | Unix-подобный , Windows , OS / 2 , MS-DOS |
Доступно в | английский |
Тип | ассемблер x86 |
Лицензия | BSD, 2 предложения |
Веб-сайт | www |
Netwide Assembler ( NASM ) является ассемблер и дизассемблер для Intel x86 архитектуры. Его можно использовать для написания 16-битных , 32-битных ( IA-32 ) и 64-битных ( x86-64 ) программ. NASM считается одним из самых популярных ассемблеров для Linux . [2]
Первоначально NASM был написан Саймоном Татхамом при содействии Джулиана Холла. По состоянию на 2016 год [Обновить]его обслуживает небольшая группа под руководством Х. Питера Анвина . [3] Это программное обеспечение с открытым исходным кодом, выпущенное на условиях упрощенной (2 пункта) лицензии BSD . [4]
Особенности [ править ]
NASM может выводить несколько двоичных форматов, в том числе COFF , OMF, a.out , исполняемый и связываемый формат (ELF), Mach-O и двоичный файл (.bin, двоичный образ диска, используемый для компиляции операционных систем ), хотя позиционно-независимый код поддерживается только для объектных файлов ELF . NASM также имеет собственный двоичный формат RDOFF. [5]
Разнообразие выходных форматов позволяет перенацеливать программы практически на любую операционную систему (ОС) x86. Кроме того , NASM может создавать плоские бинарные файлы , используемые для записи загрузчиков , память только для чтения (ROM) изображений, а также в различных аспектах развития ОС. [5] NASM может работать на платформах, отличных от x86, в качестве кросс-ассемблера , таких как PowerPC и SPARC , хотя он не может генерировать программы, которые можно использовать на этих машинах.
NASM использует вариант синтаксиса сборки Intel вместо синтаксиса AT&T . [6] Он также избегает таких функций, как автоматическая генерация переопределений сегментов (и соответствующей директивы ASSUME), используемых MASM и совместимыми ассемблерами. [5]
Примеры собранных программ для различных операционных систем [ править ]
Это "Привет, мир!" программа для операционной системы DOS .
раздел .text org 0x100 mov ah , 0x9 mov dx , hello int 0x21mov ax , 0x4c00 int 0x21section .data hello: db 'Привет, мир!' , 13 , 10 , '$'
Эквивалентная программа для Linux :
global _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 ; выход(...)section .data msg: db "Hello, world!" , 10 .LEN: фас $ - тзд
Пример аналогичной программы для Microsoft Windows :
global _main extern _MessageBoxA @ 16 extern _ExitProcess @ 4код раздела use32 cl ass = 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 вызов _MessageBoxA @ 16нажать dword 0 ; UINT uExitCode call _ExitProcess @ 4раздел data use32 cl ass = data banner: db 'Hello, world!' , 0 title: db 'Hello' , 0
Ниже представлена 64-битная программа для Apple OS X, которая вводит нажатие клавиши и отображает его на экране.
global _startраздел .dataquery_string: дБ "Введите символ:" query_string_len: EQU $ - query_string out_string: децибел "Вы ввели:" out_string_len: EQU $ - out_stringраздел .bssin_char: resw 4раздел .text_Начало:мы Rax , 0x2000004 ; поместите код системного вызова записи в регистр rax mov rdi , 1 ; указать ядру использовать stdout mov rsi , query_string ; rsi - это то место, где ядро ожидает найти адрес сообщения mov rdx , query_string_len ; а rdx - это то место, где ядро ожидает найти длину системного вызова сообщения; прочитать в символьные мах бараков , 0x2000003 ; читать системный вызов mov rdi , 0 ; stdin mov rsi , in_char ; адрес для хранения, заявленный в секции .bss mov rdx , 2 ; получить 2 байта из буфера ядра (один для возврата каретки) системный вызов; показать пользователю выходных мов RAX , 0x2000004 ; написать системный вызов mov rdi , 1 ; STDOUT мы риши , out_string мы RDX , out_string_len системный вызовмы Rax , 0x2000004 ; написать системный вызов mov rdi , 1 ; стандартный вывод мов рша , in_char мы RDX , 2 ; второй байт должен применить возврат каретки, ожидаемый в системном вызове строки; Выход системного вызова мы Rax , 0x2000001 ; Выход системного вызова исключающего RDI , RDI системного вызов
Ссылка [ править ]
NASM в основном выводит объектные файлы , которые, как правило, не являются исполняемыми сами по себе. Единственным исключением являются плоские двоичные файлы (например, .COM ) [5], которые по своей сути ограничены в современном использовании. Чтобы преобразовать объектные файлы в исполняемые программы, необходимо использовать соответствующий компоновщик , например, утилиту «LINK» Visual Studio для Windows или ld для Unix-подобных систем.
Развитие [ править ]
Первый выпуск, версия 0.90, был выпущен в октябре 1996 года. [4]
28 ноября 2007 года была выпущена версия 2.00, в которой добавлена поддержка расширений x86-64 . [3] Разрабатываемые версии не загружаются на SourceForge.net ; вместо этого они регистрируются в GitHub с бинарными снимками, доступными на веб-странице проекта.
Также доступна поисковая машина для документации NASM. [7]
В июле 2009 года, начиная с версии 2.07, NASM был выпущен под упрощенной (2 пункта) лицензией BSD. Ранее, поскольку NASM был лицензирован по LGPL , это привело к разработке Yasm, полностью переписав NASM в соответствии с Новой лицензией BSD . Yasm предлагал поддержку x86-64 раньше, чем NASM. Также добавлена поддержка синтаксиса GNU Assembler .
RDOFF [ править ]
Разработан | Джулиан Холл |
---|---|
Тип формата | Формат объектного файла |
Контейнер для | Код объекта |
Формат перемещаемого динамического объектного файла (RDOFF) используется разработчиками для проверки целостности возможностей вывода объектного файла NASM. Он во многом основан на внутренней структуре NASM [8], состоящей по существу из заголовка, содержащего сериализацию вызовов функций выходного драйвера, за которым следует массив секций, содержащих исполняемый код или данные. Инструменты для использования формата, включая компоновщик и загрузчик, включены в дистрибутив NASM.
До выпуска версии 0.90 в октябре 1996 года NASM поддерживал вывод только исполняемых файлов в плоском формате (например, файлов DOS COM ). В версии 0.90 Саймон Тэтхэм добавил поддержку интерфейса вывода объектного файла, а для файлов DOS .OBJ - только 16-битный код. [9]
Таким образом, у NASM не было 32-битного объектного формата. Чтобы устранить этот недостаток и в качестве упражнения по изучению интерфейса объектного файла, разработчик Джулиан Холл собрал первую версию RDOFF, которая была выпущена в версии NASM 0.91. [9]
Начиная с этой первоначальной версии, было одно крупное обновление формата RDOFF, которое добавило индикатор длины записи для каждой записи заголовка [10], позволяя программам пропускать записи, формат которых они не распознают, и поддерживать несколько сегментов; RDOFF1 поддерживает только три сегмента: текст , данные и bss (содержащий неинициализированные данные). [8]
См. Также [ править ]
- язык ассемблера
- Сравнение ассемблеров
Ссылки [ править ]
- ^ https://github.com/netwide-assembler/nasm
- ↑ Рам Нараян. «Ассемблеры Linux: сравнение GAS и NASM» . Архивировано из оригинала 3 октября 2013 года
два из наиболее популярных монтажников для Linux, GNU Assembler (GAS) и Netwide Assembler (NASM)
- ^ a b «Сетевой ассемблер» . Проверено 27 июня 2008 года .
- ^ a b «История версий NASM» . Дата обращения 3 августа 2019 .
- ^ a b c d "Руководство NASM" . Архивировано из оригинального 23 февраля 2009 года . Проверено 15 августа 2009 года .
- ^ Рэндалл Хайд . «NASM: Netwide Assembler» . Архивировано из оригинального 12 сентября 2010 года . Проверено 27 июня 2008 года .
- ^ "NASM Doc Search Engine" . Архивировано из оригинала 23 января 2010 года . Проверено 14 сентября 2009 года .
- ^ a b "Руководство NASM, глава 6" . Проверено 27 июня 2008 года .
- ^ а б "NASM CVS" . 8 июня 2008 . Проверено 27 июня 2008 года .
- ^ "V1-V2.txt" . 4 декабря 2002 . Проверено 27 июня 2008 года .
Дальнейшее чтение [ править ]
- Джефф Дантеманн (2000). Язык ассемблера шаг за шагом . Дж. Уайли и сыновья. ISBN 0-471-37523-3.
Внешние ссылки [ править ]
- Официальный сайт
- Netwide Assembler на SourceForge.net
- Специальное издание для Win32 и BeOS.
- Сравнение GAS и NASM в IBM
- «Сетевой ассемблер» . Свободный код .: конвертер между исходным форматом ассемблеров NASM и GAS