Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

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]

См. Также [ править ]

  • язык ассемблера
  • Сравнение ассемблеров

Ссылки [ править ]

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

Дальнейшее чтение [ править ]

  • Джефф Дантеманн (2000). Язык ассемблера шаг за шагом . Дж. Уайли и сыновья. ISBN 0-471-37523-3.

Внешние ссылки [ править ]

  • Официальный сайт
  • Netwide Assembler на SourceForge.net
  • Специальное издание для Win32 и BeOS.
  • Сравнение GAS и NASM в IBM
  • «Сетевой ассемблер» . Свободный код .: конвертер между исходным форматом ассемблеров NASM и GAS