Ассемблер для linux nasm

Ассемблер для linux nasm

This is the project webpage for the Netwide Assembler (NASM), an asssembler for the x86 CPU architecture portable to nearly every modern platform, and with code generation for many platforms old and new.

License

As of version 2.07, NASM is now under the Simplified (2-clause) BSD license. The details of the license are available in the documentation.

Latest version

Stable 2.16.01 History
RC 2.16.02rc1 History
Builds List
Snapshots Latest, List

For users of RPM-based Linux distributions (e.g. Fedora, Red Hat, SUSE, . ), you can download the official NASM builds using dnf or yum by installing nasm.repo in your /etc/yum/yum.repos.d directory.

Infrastructure Change

On July 1, 2020, the official NASM git repository moved to github.

The previous repository on repo.or.cz is no longer maintained.

Development Team

NASM was originally developed by Simon Tatham and Julian Hall, and is now maintained by a team led by H. Peter Anvin.

  • H. Peter Anvin
  • Cyrill Gorcunov
  • Chang Seok Bae
  • Jim Kukunas
  • Frank B. Kotler

. with support from many others, and we are always looking for more developers.

Your reports aren’t going to /dev/null

We’re looking for your comments, suggestions and, of course, bug-reports. Report any suspicious behavior you encounter to help us improve the NASM for everyone!

Please post your messages to the mailing list, or file a bug report.

Don’t worry if your report is not immediately addressed, even within the first few days, as this is usual for us. Your report will, however, be recorded and dealt with, of course, as time permits.

©1996-2015 The NASM development team

Источник

Assembler Linux

image


В Linux традиционно используется компилятор ассемблера GNU Assembler (GAS, вызываемый командой as), входящий в состав пакета GCC. Этот компилятор является кроссплатформенным, т. е. может компилировать программы, написанные на различных языках ассемблера для разных процессоров. Однако GAS использует синтаксис AT&T, а не Intel, поэтому его использование программистами, привыкшими к синтаксису Intel, вызывает некоторый дискомфорт.
Например программа, выводящая на экран сообщение «Hello, world!» (далее будем называть ее hello) выглядит следующим образом:

.section .data
msg:
.ascii «Hello, world!\n»
len = . — msg # символу len присваевается длина строки
.section .text
.global _start # точка входа в программу
_start:
movl $4, %eax # системный вызов № 4 — sys_write
movl $1, %ebx # поток № 1 — stdout
movl $msg, %ecx # указатель на выводимую строку
movl $len, %edx # длина строки
int $0x80 # вызов ядра
movl $1, %eax # системный вызов № 1 — sys_exit
xorl %ebx, %ebx # выход с кодом 0
int $0x80 # вызов ядра

Читайте также:  Linux узнать порт arduino

Как видно из примера, различия видны как в синтаксисе команд, так и в синтаксисе директив ассемблера и комментариях.
В последних версиях GAS появилась возможность использования синтаксиса Intel для команд, но синтаксис директив и комментариев остается традиционным. Включение синтаксиса Intel осуществляется директивой .intel_syntax с параметром noprefix. При этом программа, приведенная выше изменится следующим образом:

.intel_syntax noprefix
.section .data
msg:
.ascii «Hello, world!\n»
len = . — msg # символу len присваевается длина строки
.section .text
.global _start # точка входа в программу
_start:
mov eax, 4 # системный вызов № 4 — sys_write
mov ebx, 1 # поток № 1 — stdout
mov ecx, OFFSET FLAT:msg # указатель на выводимую строку
# OFFSET FLAT означает использовать тот адрес,
# который msg будет иметь во время загрузки
mov edx, len # длина строки
int 0x80 # вызов ядра
mov eax, 1 # системный вызов № 1 — sys_exit
xor ebx, ebx # выход с кодом 0
int 0x80 # вызов ядра

Другим широко распространенным компилятором ассемблера для 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 будет выглядеть так:

Читайте также:  Linux mint amd radeon driver

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. Различия появляются только на этапе компоновки. Особенности компоновки будут рассмотрены далее.

Отличия NASM от MASM
  • NASM чувствителен к регистру символов
  • NASM требует квадратные скобки для ссылок на память
  • NASM не хранит типы переменных
  • NASM не поддерживает ASSUME
  • NASM не поддерживает модели памяти
  • Обозначения операций в NASM совпадают с языком СИ
Компиляция и запуск

nasm -f elf hello.asm
gcc hello.o
chmod +x a.out
./a.out

Источник

How to compile assembly code with NASM: in Linux, Windows

How to compile assembly code with NASM: in Linux, Windows

Compiling an assembly program with NASM can be done on Linux or Windows, as NASM is available for both platforms. An NASM assembler will turn your low-level coding, using mnemonics, into machine language that can be understood by the processor. This article will not teach you to program with NASM, but to create an executable command for Linux and Windows from NASM source code.

Netwide Assembler (NASM) is an assembler and dissembler for the Intel x86 architecture and is commonly used to create 16-bit, 32-bit (IA-32), and 64-bit (x86-64) programs.

How to compile an assembly program with NASM for Linux?

Creating the source file

  • You can use any text editor, such as Gedit, KWrite, or XEmacs, to do so. When you save your file, give it the extension .asm.
Читайте также:  За что любят линукс

Assembling the source file

  • For this step, you will need NASM software installed on your machine.
  • If you’re running Debian or Ubuntu, simply type the command:
  • If you have another Linux distribution, you must use your distribution’s package manager (e.g. Urpmi, Yum, Emerge) or download NASM from the official site.
  • Use the following command line to assemble your source file:
  • In the example, the saved .asm file is called test.asm. This will create a file named test.o in the current directory.

N.B. This file is not executable. It is still an object file.

Creating the executable

  • Now that we have our object file, named test.o, we must create our executable.
  • Your program may begin with a procedure called _start. This means that your program has its own point of entry, without the use of the main function. However, you’ll need to use the «l» to create your executable:
  • Alternatively, your program may begin with a procedure called main. You will need to use gcc to create your executable:

Program execution

How to compile an assembly program with NASM for Windows?

  • The main function is not available under Windows and must be replaced by WinMain.
  • If your entry point is _start or main, it should be changed to _WinMain @ 16. Also, change the ret at the end of the procedure to ret 16:
section .text global _WinMain@16 _WinMain@16: mov eax, 0 ret 16

Installing the software

  • The most difficult step will be installing MinGW, which is a free development environment for Windows:
  • Start by choosing the latest version of MingGW from their website. Run the installer, but don’t update at this point. Leave all options selected by default, and wait for it to install.
  • Now you need to insert NASM in the development environment MinGW. Unpack the NASM archive. You should get a folder containing, among other things, a file named nasm.exe. Copy this file into the directory C: \ MinGW \ bin.

Creating a source file

  • Like Linux, there is no need to use a specific publisher to create a source file for NASM. You can use Notepad. But take note that it tends to add the .txt extension to files it creates. To remove any ambiguity, it is recommend that you view the extensions of your files.
  • In any event, avoid word processors, such as Word or WordPad.
  • If you wish, you can also use an editor that uses NASM syntax, such a NasmEdit IDE.
  • Make sure your save your source file with the .asm extension.

Assembling the source file

  • Open the Command window by going to Start > Run and typing cmd.exe
  • Using the command cd, go to the folder containing your source file. Once you are in this directory, assemble your source file (test.asm) with this command:
nasm -f win32 test.asm -o test.o

Creation and execution of the program

Источник

Оцените статью
Adblock
detector