Как установить nasm в ubuntu
This guide for standard support releases of Ubuntu, Debian, and Linux Mint and will provide a local, non-system installation of FFmpeg with several external libraries.
You may also refer to the Generic Compilation Guide for additional information about compiling software.
Recent static builds are also available for lazy people or those who are unable to compile. The static builds do not support non-free libraries.
Note: FFmpeg is part of the Ubuntu packages and can be installed via apt-get install ffmpeg . You may still wish to compile if you want the latest version, experience a bug, or want to customize your build, and it will not interfere with the ffmpeg package in the repository.
This guide is designed to be non-intrusive and will create several directories in your home directory:
- ffmpeg_sources – Where the source files will be downloaded. This can be deleted if desired when finished with the guide.
- ffmpeg_build – Where the files will be built and libraries installed. This can be deleted if desired when finished with the guide.
- bin – Where the resulting binaries ( ffmpeg , ffplay , ffprobe , x264 , x265 ) will be installed.
You can easily undo any of this as shown in Reverting Changes Made by This Guide.
These are packages required for compiling, but you can remove them when you are done if you prefer:
On Ubuntu 20.04 you may also need this command: ( note)
Note: Server users can omit the ffplay and x11grab dependencies: libsdl2-dev libva-dev libvdpau-dev libxcb1-dev libxcb-shm0-dev libxcb-xfixes0-dev .
In your home directory make a new directory to put all of the source code and binaries into:
This guide assumes that you want to install some of the most common third-party libraries. Each section provides you with the commands needed to install that library.
For each section, copy-paste the entire code-block into your shell.
If you do not require certain features, you may skip the relevant section (if it is not required) and then remove the appropriate ./configure option in FFmpeg. For example, if libvpx is not needed, skip that section and then remove --enable-libvpx from the Install FFmpeg section.
Tip: To significantly speed up the compilation process on systems with multiple cores, you can use the -j option with each make command to set the number of compilation jobs allowed to run simultaneously, such as make -j4 . To set this to the number of available logical CPU cores, use make -j$(nproc) . The -j option also works with the ninja build system used to compile some of the libraries in this guide. Using all cores may cause your machine to become slow or unresponsive.
An assembler used by some libraries.
If your repository provides nasm version ≥ 2.13 then you can install that instead of compiling:
Otherwise you can compile:
libx264
H.264 video encoder. See the H.264 Encoding Guide for more information and usage examples.
Requires ffmpeg to be configured with --enable-gpl --enable-libx264 .
If your repository provides libx264-dev version ≥ 118 then you can install that instead of compiling:
Otherwise you can compile:
libx265
H.265/HEVC video encoder. See the H.265 Encoding Guide for more information and usage examples.
Requires ffmpeg to be configured with --enable-gpl --enable-libx265 .
If your repository provides libx265-dev version ≥ 68 then you can install that instead of compiling:
Otherwise you can compile:
libvpx
VP8/VP9 video encoder/decoder. See the VP9 Video Encoding Guide for more information and usage examples.
Requires ffmpeg to be configured with --enable-libvpx .
If your repository provides libvpx-dev version ≥ 1.4.0 then you can install that instead of compiling:
Otherwise you can compile:
libfdk-aac
AAC audio encoder. See the AAC Audio Encoding Guide for more information and usage examples.
Requires ffmpeg to be configured with --enable-libfdk-aac (and --enable-nonfree if you also included --enable-gpl ).
If your repository provides libfdk-aac-dev then you can install that instead of compiling:
Otherwise you can compile:
libopus
Opus audio decoder and encoder.
Requires ffmpeg to be configured with --enable-libopus .
If your repository provides libopus-dev version ≥ 1.1 then you can install that instead of compiling:
Otherwise you can compile:
libaom
AV1 video encoder/decoder:
Warning: libaom does not yet appear to have a stable API, so compilation of libavcodec/libaomenc.c may occasionally fail. Just wait a day or two for us to catch up with these annoying changes, re-download ffmpeg-snapshot.tar.bz2 , and try again. Or skip libaom altogether.
libsvtav1
AV1 video encoder/decoder. Only the encoder is supported by FFmpeg, so building of the decoder is disabled.
Requires ffmpeg to be configured with --enable-libsvtav1 .
libdav1d
AV1 decoder, much faster than the one provided by libaom.
Requires ffmpeg to be configured with --enable-libdav1d .
If your repository provides libdav1d-dev , you can install that instead of compiling:
Otherwise you'll need can build from source. Users whose distributions don't provide a recent enough version of meson (0.49.0 or newer) will need to install a more up-to-date version. This is easily done via the Python Package Index:
NASM version 2.14 or newer is required for AVX-512 support. See the NASM section for how to install/build. Alternatively, disable AVX-512 in Meson setup with -Denable_avx512=false .
libvmaf
Library for calculating the VMAF video quality metric. Requires ffmpeg to be configured with --enable-libvmaf . Currently an issue in libvmaf also requires FFmpeg to be built with --ld="g++" for a static build to succeed.
FFmpeg
Now re-login or run the following command for your current shell session to recognize the new ffmpeg location:
Compilation and installation are now complete and ffmpeg (also ffplay , ffprobe , lame , x264 , & x265 ) should now be ready to use. The rest of this guide shows how to update or remove FFmpeg.
Usage
You can now open a terminal, enter the ffmpeg command, and it should execute your new ffmpeg .
If you need multiple users on the same system to have access to your new ffmpeg , and not just the user that compiled it, then move or copy the ffmpeg binary from
/bin to /usr/local/bin .
Documentation
If you want to run man ffmpeg to have local access to the documentation:
You may have to log out and then log in for man ffmpeg to work.
HTML formatted documentation is available in
You can also refer to the online FFmpeg documentation, but remember that it is regenerated daily and is meant to be used with the most current ffmpeg (meaning an old build may not be compatible with the online docs).
Development of FFmpeg is active and an occasional update can give you new features and bug fixes. First you need to delete (or move) the old files:
Now can just follow the guide from the beginning.
Remove the build and source files as well as the binaries:
You may also remove packages that have been installed from this guide:
Why install to
- Avoids installing files into any system directories.
- Avoids interfering with the package management system.
- Avoids conflicts with the ffmpeg package from the repository.
- Super simple to uninstall.
- Does not necessarily require sudo or root: useful for shared server users as long as they have the required dependencies available.
/bin is already in the vanilla Ubuntu PATH (see
Why are the commands in this guide so complicated?
It is to make compiling easy and convenient for the user. This guide:
- Confines everything to the user's home directory (see the previous FAQ question above).
- Is intended to be usable on all currently supported versions of Debian and Ubuntu.
- Allows the user to choose if they want to compile certain libraries (latest and greatest) or to simply install the version from their repository (fast and easy but older).
This results in some various additional commands and configurations instead of the typical and simple ./configure , make , make install .
make[1]: Nothing to be done for 'all'/'install'
This is message from libvpx that occasionally makes users think something went wrong. You can ignore this message. It just means make is finished doing its work.
В данной статье я хочу рассмотреть вопросы, которые могут возникнуть у человека, приступившего к изучению ассемблера, связанные с установкой различных трансляторов и трансляцией программ под Windows и Linux, а также указать ссылки на ресурсы и книги, посвященные изучению данной темы.
Используется для создания драйверов под Windows.
По ссылке переходим на сайт и скачиваем пакет (masm32v11r.zip). После инсталляции программы на диске создается папка с нашим пакетом C:\masm32. Создадим программу prog11.asm, которая ничего не делает.
Произведём ассемблирование (трансляцию) файла prog11.asm, используя ассемблер с сайта masm32.
Ключ /coff используется здесь для трансляции 32-битных программ.
Линковка производится командой link /subsystem:windows prog11.obj (link /subsystem:console prog11.obj)
Как сказано в Википедии
MASM — один из немногих инструментов разработки Microsoft, для которых не было отдельных 16- и 32-битных версий.
Кстати, вот ссылка на личный сайт Владислава Пирогова, автора книги “Ассемблер для Windows”.
MASM с сайта Microsoft
Открываем этот файл архиватором (например 7zip). Внутри видим файл setup.exe, извлекаем его, открываем архиватором. Внутри видим два файла vc_masm.msi,vc_masm1.cab. Извлекаем файл vc_masm1.cab, открываем архиватором. Внутри видим файл FL_ml_exe_____X86.3643236F_FC70_11D3_A536_0090278A1BB8. Переименовываем его в файл fl_ml.exe, далее, произведём ассемблирование файла prog11.asm, используя ассемблер fl_ml.exe.
MASM в Visual Studio
Также MASM можно найти в папке с Visual Studio (у меня VS 10) вот здесь: C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\ml.exe.
Для того, чтобы запустить на 32- или 64-разрядной системе и создавать программы, работающие как под 32-, так и под 64-разрядной Windows, подходит MASM32 (ml.exe, fl_ml.exe). Для того, чтобы работать на 32- и 64-разрядных системах и создавать программы, работающие под 64-разрядной Windows, но неработающие под 32-разрядной нужен ассемблер ml64.exe. Лежит в папке C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\amd64 и вот здесь — C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\x86_amd64.
Программный пакет компании Borland, предназначенный для разработки программ на языке ассемблера для архитектуры x86. В настоящее время Borland прекратила распространение своего ассемблера.
Выполним ассемблирование (трансляцию) файла abel32.asm.
Корректность работы программы можно проверить, произведя линковку (tlink.exe) объектного файла и запустив полученный файл в отладчике.
Как было сказано выше, MASM можно использовать для работы с 16-битными программами. Выполним ассемблирование (трансляцию) программы abel32.asm с помощью ассемблера MASM:
Ключ /coff здесь не используется.
Линковка производится файлом link16.exe
В статье Криса Касперски «Сравнение ассемблерных трансляторов» написано, что «FASM — неординарный и весьма самобытный, но увы, игрушечный ассемблер. Пригоден для мелких задач типа „hello, world“, вирусов, демок и прочих произведений хакерского творчества.»
Скачаем FASM с официального сайта. Инсталлятора нет, просто извлекаем программу. Откроем fasm editor — C:\fasm\fasmw.exe. В папке C:\fasm\EXAMPLES\HELLO есть файл HELLO.asm.
Откроем файл HELLO.asm из fasmw.exe. Изменим строку include 'win32ax.inc' на строку include 'c:\fasm\INCLUDE\WIN32AX.INC'. Запускаем из меню Run → Run.
Вот ссылки на ресурсы, посвященные FASM:
FASM в Linux
Для того, использовать FASM в Linux (у меня Ubuntu), скачаем соответствующий дистрибутив (fasm-1.71.60.tgz), распакуем его, в папке у нас будет бинарный файл fasm, копируем этот файл в /usr/local/bin для того, чтобы можно было запускать его из консоли, как любую другую команду.Выполним ассемблирование программы hello.asm из папки fasm/examples/elfexe/hello.asm.
Корректность работы программы можно проверить в отладчике.
Nasm успешно конкурирует со стандартным в Linux- и многих других UNIX-системах ассемблером Gas.
Nasm в Linux можно установить его с помощью менеджера пакетов или из командной строки: в дистрибутиве Debian (Ubuntu) командой apt-get install nasm, в дистрибутивах Fedora, CentOS, RedHat командой yum install nasm.
Выполним ассемблирование и линковку и запустим файл hello.asm.
Для 64bit необходимо использовать команду nasm -f elf64 hello.asm
NASM для Windows
NASM для Windows можно установить, скачав соответствующий дистрибутив с соответствующего сайта.
Ссылки на ресурсы, посвященные Nasm:
Стандартный ассемблер практически во всех разновидностях UNIX, в том числе Linux и BSD. Свободная версия этого ассемблера называется GAS (GNU assembler). Позволяет транслировать программы с помощью компилятора GCC.
Из учебников удалось найти только книгу на английском «Programming from the ground up». На русском удалось найти только одну главу из книги С. Зубкова «Assembler для DOS, Windows и UNIX».
Возьмем пример программы, которая ничего не делает, с сайта. Создадим программу gas.s
Выполним ассемблирование (трансляцию), линковку и запуск программы:
Если в данной программе изменить _start на main, то можно выполнить ассемблирование (трансляцию) и линковку компилятором gcc.
Выполним ассемблирование (трансляцию), линковку и запуск программы:
Выводы: если вы изучаете программирование под Windows, то вы можете остановить свой выбор на Masm; Tasm больше не поддерживается, но для обучения по старым классическим учебникам подойдёт.
Под Linux Gas подойдет тем, кто использует GCC, а тем, кому не нравится синтаксис Gas, подойдёт Nasm.
Как видно из примера, различия видны как в синтаксисе команд, так и в синтаксисе директив ассемблера и комментариях.
В последних версиях GAS появилась возможность использования синтаксиса Intel для команд, но синтаксис директив и комментариев остается традиционным. Включение синтаксиса Intel осуществляется директивой .intel_syntax с параметром noprefix. При этом программа, приведенная выше изменится следующим образом:
Другим широко распространенным компилятором ассемблера для Linux является Netwide Assembler (NASM, вызываемый командой nasm). NASM использует синтаксис Intel. Кроме того, синтаксис директив ассемблера NASM частично совпадает с синтаксисом MASM. Пример приведенной выше программы для ассемблера NASM выглядит следующим образом:
section .data
msg db "Hello, world!\n"
len equ $-msg ; символу len присваевается длина строки
section .text
global _start ; точка входа в программу
_start:
mov eax, 4 ; системный вызов № 4 — sys_write
mov ebx, 1 ; поток № 1 — stdout
mov ecx, msg ; указатель на выводимую строку
mov edx, len ; длина строки
int 80h ; вызов ядра
mov eax, 1 ; системный вызов № 1 — sys_exit
xor ebx, ebx ; выход с кодом 0
int 80h ; вызов ядра
Кроме перечисленных ассемблеров в среде Linux можно использовать ассемблеры FASM и YASM. Оба поддерживают синтаксис Intel, но FASM имеет свой синтаксис директив, а YASM синтаксически полностью аналогичен NASM и отличается от него только типом пользовательской лицензии. В дальнейшем изложении материала все примеры будут даваться применительно к синтаксису, используемому NASM. Желающим использовать GAS можно порекомендовать статью о сравнении этих двух ассемблеров. Кроме того, при использовании в GAS директивы .intel_syntax noprefix различия между ними будут не столь значительными. Тексты программ, подготовленные для NASM, как правило, без проблем компилируются и YASM.
Структура программы
Программы в Linux состоят из секций, каждая из которых имеет свое назначение [6]. Секция .text содержит код программы. Секции .data и .bss содержат данные. Причем первая содержит инициализированные данные, а вторая — не инициализированные. Секция .data всегда включается при компиляции в исполняемый файл, а .bss в исполняемый файл не включается и создается только при загрузке процесса в оперативную память. Начало секции объявляется директивой SECTION имя_секции. Вместо директивы SECTION можно использовать директиву SEGMENT. Для указания конца секции директив не существует — секция автоматически заканчивается при
объявлении новой секции или в конце программы. Порядок следования секций в программе не имеет значения. В программе обязательно должна быть объявлена метка с именем _start – это точка входа в программу. Кроме того, метка точки входа должна быть объявлена как глобальный идентификатор директивой GLOBAL _start. Так как имя точки входа предопределено, то необходимость в директиве конца программы END отпадает: в NASM данная директива не поддерживается.
При создании многомодульных программ все метки (идентификаторы переменных и функций), которые предполагается использовать в других модулях, необходимо объявить как глобальные с помощью директивы GLOBAL. Наоборот, все идентификаторы, реализованные в других модулях и объявленные там, как глобальные, необходимо объявить как внешние директивой EXTERN. Функция сложения двух чисел sum, рассмотренная в предыдущей лабораторной работе, в NASM будет выглядеть так:
SECTION .text
global sum
sum:
push ebp
mov ebp, esp
mov eax, [ebp+8]
add eax, [ebp+12]
pop ebp
ret
Использование библиотечных функций
В программах на ассемблере можно использовать функции библиотеки Си. Для использования функции ее надо предварительно объявить директивой EXTERN. Например, для того. чтобы использовать функцию printf необходимо предварительно указать выполнить следующую директиву:
EXTERN printf
Программу hello можно модифицировать так, чтобы она использовала для вывода информации не функцию API Linux, а функцию printf библиотеки Си. Код программы, назовем ее hello-c, будет выглядеть так:
SECTION .data
msg db "Hello, world!",0
fmt db "%s",0Ah
SECTION .text
GLOBAL _start ; точка входа в программу
EXTERN printf ; внешняя функция библиотеки Си
_start:
push msg ; второй параметр - указатель на строку
push fmt ; первый параметр - указатель на формат
22
call printf ; вызов функции
add esp, 4*2 ; очистка стека от параметров
mov eax, 1 ; системный вызов № 1 — sys_exit
xor ebx, ebx ; выход с кодом 0
int 80h ; вызов ядра
Компиляция программ, использующих библиотечные функции ничем не отличается от компиляции программ, использующих только функции API. Различия появляются только на этапе компоновки. Особенности компоновки будут рассмотрены далее.
Раздел данных используется для объявления инициализированных данных или констант. Эти данные не изменяются во время выполнения. Можно объявить различные постоянные значения, имена файлов,размер буфера и т. д. в этом разделе.
Синтаксис для объявления раздела данных:
Раздел bss используется для объявления переменных. Синтаксис для объявления раздела bss:
Текстовый раздел
Текстовый раздел используется для хранения фактического кода. Этот раздел должен начинаться с объявления global_start, которое сообщает ядру, где начинается выполнение программы.
Синтаксис для объявления текстового раздела:
Комментарий на языке ассемблера начинается с точки с запятой (. Он может содержать любые печатные символы, включая пробел. Он может появиться на линии сам по себе, как .
Заявления На Языке Ассемблера
- Исполняемые инструкции или инструкции
- Директивы ассемблера или псевдо-операции
- Макросы
Директивы ассемблера или псевдо-opstell ассемблера о различных аспектах процесса сборки. Они не являются исполняемыми и не генерируют инструкции машинного языка.
Макросы-это в основном механизм подстановки текста.
Синтаксис операторов языка ассемблера
Операторы языка ассемблера вводятся по одному оператору на строку. Каждое заявление имеет следующий формат:
Поля в квадратных скобках являются необязательными. Базовая инструкция состоит из двух частей, первая из которых-это имя инструкции (или мнемоника), которая должна быть выполнена, а вторая-операнды или параметры команды.
Ниже приведены некоторые примеры типичных операторов assembly language:
Программа Hello World в ASM
Следующий код языка ассемблера отображает строку "Hello World" на экране −
Компиляция и связывание программы сборки в NASM
- Введите приведенный выше код с помощью текстового редактора и сохраните его как hello.asm.
- Убедитесь, что вы находитесь в том же каталоге, где сохранен hello.asm.
- Чтобы собрать программу, введите nasm - f ELF hello.asm
- Если есть какая-либо ошибка, вы будете оповещены об этом на данном этапе. В противном случае объектный файл программы с именем Hello.o будет создан.
- Чтобы связать объектный файл и создать исполняемый файл с именем hello, введите ld-m elf_i386-s-o hello hello.о
- Выполните программу, введя ./hello
Хотелось бы сказать сразу для критиков, это перевод!
Также скажу, что у меня есть ноутбук 2003 года на базе Pentium M, соответственно, всё описанное в этой статье будет в ближайшие дни продемонстрировано, со скринами и прочими интересными и нужными вещами.
За сим я откланяюсь, ждите практики на моём древнем ноуте, желаю хорошего дня.
P.S. я прикрепил опрос, по поводу практики на моём примере
dieZel
Собственно там было много годных советов, ели кому интересно Тыц
Автор молорик.. Асм в толпе учить веселее.
centr
Well-known member
Конечно не знаю асм, но думаю если тупо скопипастить код и попытаться запустить, то результат будет нулевым. Конечно не знаю асм, но думаю если тупо скопипастить код и попытаться запустить, то результат будет нулевым.Не.. 6 утра.. чет я засиделся.. над остыть немного.. потом по тестю.
centr
Well-known member
Гугл транслэйт конечно рулит, однако он переводит всё и даже то, что переводить не нужно(он же не знает что переводить.).
Введите приведенный выше код с помощью текстового редактора и сохраните его как hello.asm
Почему гугл транслэйт?
Да потому что если писать самому, то вероятнее всего будет написано:
Поместите приведённый выше код в текстовый редактор.
С телефона не так удобно писать.
dieZel
Гугл транслэйт конечно рулит, однако он переводит всё и даже то, что переводить не нужно(он же не знает что переводить.).
Введите приведенный выше код с помощью текстового редактора и сохраните его как hello.asm
Почему гугл транслэйт?
Да потому что если писать самому, то вероятнее всего будет написано:
Поместите приведённый выше код в текстовый редактор.
С телефона не так удобно писать.
Ну вопервых не гугл, а яндекс, а вовторых я этот перевод правлю и делаю читаемым
Конечно не знаю асм, но думаю если тупо скопипастить код и попытаться запустить, то результат будет нулевым. Я же писал, на днях сделаю практику на своём примереВ таком случае гуль будет удачнее. Не понятно какой тебе от этого кайф.. Заниматься сложными переводами матана про Ассемблер без погружения в Ассемблер 0_________о Скажем для меня, как для новичка это просто возможность подсмотреть некие приколюшечки и не более. Я как лопатил русскоязычных авторов, желательно понимающих о чем они пишут, так и буду. За твои труды конечно лукас. Бат, ай донт андестенд юа )
Отвечая на вопрос Центра.. приём Центр приём.. ыыы
Вобщем нахрапом в НАСМ в прыжке с двух ног сразу, войти. . . не получилось, увы. но мне это пока не о чём не говорит.. может у меня что то настроено через одно место 0____________о Разбираться лениво, подожду практическую работу от ТС.
Аааа я просто не увидел лол.
ну 6 утра было, мне простительно.. Цетр просто протролил ахах
Читайте также: