next up previous contents index
Next: Отладчик GDB Up: Средства программирования в ОС Previous: Основные группы системных функций   Contents   Index

Ассемблеры gas и nasm

Использование языка ассемблера в Linux происходит гораздо реже, чем, например, в DOS. Драйверы устройств в Linux гораздо чаще пишутся на языке C, а затем обрабатываются оптимизирующим компилятором, например, GCC. Однако, если Вам непременно требуется ассемблер, возможность его использования присутствует.

Основная причина, по которой используется ассемблер в Linux - это написание очень небольших по размеру программ, которые не зависят от системных библиотек. Такие программы особенно нужны для встраиваемых систем, где объемы запоминающих устройств обычно невелики.

GAS - это сокращение от GNU Assembler. Поскольку GAS был разработан для поддержки 32-битных компиляторов Unix, он использует стандартный синтаксис AT&T, который несколько отличается от обычного ассемблера DOS. Основные отличия синтаксиса GAS от синтаксиса Intel:

Индексация выполняется с помощью заключения индексного регистра в скобки, например, in testb $0x80,17(%ebp) (проверить установку старшего бита в байте по смещению 17 от ячейки, указанной %ebp).

Примечание: Существует несколько программ, которые могут помочь Вам преобразовать исходный код для ассемблеров AT&T и Intel; некоторые из них способны на преобразование в двух направлениях.

Ассемблер NASM разрабатывается в рамках The Netwide Assembler project, и представляет собой мощный ассемблер на базе i386, написанный на C, который построен по модульному принципу и обеспечивает поддержку практически вссех известных синтаксисов и форматов объектных файлов.

Используется синтаксис Intel. Поддерживается обработка макроопределений.

Среди поддерживаемых форматов объектных файлов есть bin, aout, coff, elf, as86, obj (DOS), win32, rdf (собственный формат). Кроме того, NASM поставляется с дизассемблером NDISASM.

Как и для GAS, для NASM существует несколько программ для проебразования синтаксиса.

В качестве примера здесь приводятся две программы на ассемблере. Программы написаны с учетом того, что Linux является 32-битной системой, работает в защищенном режиме, имеет плоскую модель памяти, и использует для исполняемых файлов формат ELF.

Программа обычно делится на разделы: .text - для программного кода (только для чтения), .data - для записи данных (чтение-запись), .bss - для неинициализируемых данных (чтение-запись); могут также присутствовать и другие стандартные разделы, а также разделы, определенные пользователем. В программе должен присутствовать как минимум раздел .text.

Пример для NASM (hello.asm) section .data ; описание раздела msg db "Hello, world!",0xa ; выводимая строка len equ $ - msg ; длина строки section .text ; описание раздела ; нам нужно передать точку входа компоновщику или global _start ; загрузчику ELF. Обычно они распознают _start по умолчанию. ; Используйте ld -e foo, чтобы переопределить ее. _start: ; записываем строку в стандартный вывод mov edx,len ; третий аргумент: длина строки mov ecx,msg ; второй аргумент: указатель на строку mov ebx,1 ; первый аргумент: дескриптор файла (stdout) mov eax,4 ; номер системного вызова (sys_write) int 0x80 ; обращение к ядру ; и выходим mov ebx,0 ; первый аргумент: код возврата mov eax,1 ; номер системного вызова (sys_exit) int 0x80 ; обращение к ядру

Пример для GAS (hello.S) .data # описание раздела msg: .string "Hello, world!\n" # выводимая строка len = . - msg # длина строки .text # описание раздела # нам нужно передать точку входа компоновщику или global _start # загрузчику ELF. Обычно они распознают _start по умолчанию. # Используйте ld -e foo, чтобы переопределить ее. _start: # записываем строку в стандартный вывод movl $len,%edx # третий аргумент: длина строки movl $msg,%ecx # второй аргумент: указатель на строку movl $1,%ebx # первый аргумент: дескриптор файла (stdout) movl $4,%eax # номер системного вызова (sys_write) int $0x80 # обращение к ядру # и выходим movl $0,%ebx # первый аргумент: код возврата movl $1,%eax # номер системного вызова (sys_exit) int $0x80 # обращение к ядру

Основные опции ассемблера GAS:

--defsym sym=value

Определяет символом sym величину value перед разбором входного файла. value должно быть целой константой. Как и в C, префикс 0x определяет шестнадцатиричное число, а префикс 0 - восьмеричное.

--help

Выводит список опций командной строки.

-I dir

Добавить каталог dir в список поиска для директив `.include'.

-o objfile

Имя объектного файла для вывода из `as'.

-R

Распознавать вложенные в код разделы данных.

--no-warn

Опускать сообщения о предупреждениях.

--fatal-warnings

Рассматривать предупреждения как ошибки.

Основные опции ассемблера NASM:
-h

Вывод информации об опциях и поддерживаемых форматах выходных файлов nasm.

-a

Ассемблировать файл без предварительного препроцессинга.

-e

Выполнить препроцессинг входного файла и вывести результат в stdout (или указанный файл-приемник), но без ассемблирования.

-M

Вывести в stdout зависимости в стиле make-файла.

-E filename

Перенаправлять сообщения об ошибках в файл filename. Опция предназначена для операционных систем, в которых stderr нельзя перенаправить.

-f format

Определить формат выходного файла. Форматы включают в себя bin для плоских двоичных файлов, и aout или elf для создания объектных фалов типа Linux a.out и ELF, соответственно.

-o outfile

Определить точное имя выходного файла, переопределив имя по умолчанию.

-l listfile

Перенаправить листинг ассемблера в указанный файл, в котором с правой стороны будет выведен исходный текст (а также текст включаемых файлов и расширенные макросы), а с левой стороны - сгенерированный код в шестнадцатиричном формате.

-s

Выводить сообщения об ошибках в файл стандартного вывода.

-w[+-]foo

Подключить или отключить некоторые классы предупреждающих сообщений, например, -w+orphan-labels или -w-macro-params, чтобы, соответственно, разрешить сообщения о метках в пустой строке или отключить сообщения о неверном количестве параметров в вызовах макросов.

-I directory

Добавить каталог в путь поиска включаемых файлов.


next up previous contents index
Next: Отладчик GDB Up: Средства программирования в ОС Previous: Основные группы системных функций   Contents   Index
Alex Otwagin 2002-12-16