Расширенный ассемблер: NASM

Перевод: AsmOs group, © 2001
Оригинал: asmdev.narod.ru

Данное руководство описывает NASM, расширенный ассемблер, предназначенный для написания программ процессоров серии Intel x86, способный в то же время работать на разных платформах.

Глава 1. Введение

 

1.1. Что такое NASM?
  1.1.1. Зачем еще один ассемблер?
1.1.2. Условия лицензирования
  1.2. Контакты
1.3. Инсталляция
  1.3.1. Инсталляция NASM под MS-DOS или Windows
1.3.2. Инсталляция NASM под Unix

Глава 2. Запуск NASM

 

2.1. Синтаксис командной строки NASM
  2.1.1. Ключ -o. Указание имени выходного файла
2.1.2. Ключ -f. Указание формата выходного файла
2.1.3. Ключ -l. Генерация файла-листинга
2.1.4. Ключ -E. Перенаправление ошибок в файл
2.1.5. Ключ -s. Перенаправление ошибок в stdout
2.1.6. Ключ -i. Каталоги поиска включаемых файлов
2.1.7. Ключ -p. Предварительно включаемые файлы
2.1.8. Ключ -d. Предопределенные макросы
2.1.9. Ключ -u. Отмена определения макроса
2.1.10. Ключ -e. Только препроцессирование
2.1.11. Ключ -a. Отключение препроцессора
2.1.12. Ключ -w. Разрешение/Запрещение предупреждений при ассемблировании
2.1.13. Переменная окружения NASM
  2.2. Пользователям MASM: Отличия
  2.2.1. NASM чувствителен к регистру символов
2.2.2. NASM требует квадратные скобки для ссылок на память
2.2.3. NASM не хранит типы переменных
2.2.4. NASM не поддерживает ASSUME
2.2.5. NASM не поддерживает модели памяти
2.2.6. Различия в обработке чисел с плавающей точкой
2.2.7. Прочие различия

Глава 3. Язык NASM

  3.1. Обзор ассемблерной строки NASM
3.2. Псевдо-инструкции
  3.2.1. DB и его друзья: Объявление инициализированных данных
3.2.2. RESB и его друзья: Объявление не инициализированных данных
3.2.3. INCBIN: Включение внешних бинарных файлов
3.2.4. EQU: Определение констант
3.2.5. TIMES: Повторение инструкций или данных
  3.3. Эффективные адреса
3.4. Константы
  3.4.1. Числовые константы
3.4.2. Символьные константы
3.4.3. Строковые константы
3.4.4. Константы с плавающей точкой
  3.5. Выражения
  3.5.1. |: Побитовый оператор ИЛИ
3.5.2. ^: Побитовый оператор ИСКЛЮЧАЮЩЕЕ ИЛИ
3.5.3. &: Побитовый оператор И
3.5.4. << и >>: Операторы сдвига бит
3.5.5. + и -: Операторы сложения и вычитания
3.5.6. *, /, //, % и %%: Умножение и деление
3.5.7. Унарные операторы: +, -, ~ и SEG
  3.6. SEG и WRT
3.7. Критические выражения
3.8. Локальные метки

Глава 4. Препроцессор NASM

  4.1. Однострочные макросы
  4.1.1. Обычный способ: %define
4.1.2. Однострочные макросы раннего связывания: %xdefine
4.1.3. Отмена определения макроса: %undef
4.1.4. Переменные препроцессора: %assign
  4.2. Многострочные макросы: %macro
  4.2.1. Перегрузка многострочных макросов
4.2.2. Локальные метки в макросах
4.2.3. Поглощающие параметры макросов
4.2.4. Параметры макросов по умолчанию
4.2.5. %0: Счетчик параметров
4.2.6. %rotate: "Вращение" параметров макросов
4.2.7. Объединение параметров макросов
4.2.8. Коды условий в качестве параметров макросов
4.2.9. Подавление развертывания макросов в листинге
  4.3. Условное ассемблирование
  4.3.1. %ifdef: Проверка присутствия однострочного макроса
4.3.2. %ifctx: Проверка контекстного стека
4.3.3. %if: Проверка произвольных числовых выражений
4.3.4. %ifidn и %ifidni: Проверка на идентичность текста
4.3.5. %ifid, %ifnum, %ifstr: Проверка типов символов
4.3.6. %error: Сообщения об ошибках, определяемые пользователем
  4.4. Циклы препроцессора: %rep
4.5. Подключение других файлов
4.6. Контекстный стек
  4.6.1. %push и %pop: Создание и удаление контекста
4.6.2. Контектно-локальные метки
4.6.3. Контекстно-локальные однострочные макросы
4.6.4. %repl: Переименование контекста
4.6.5. Пример использования контекстного стека: Блок IF
  4.7. Стандартные макросы
  4.7.1. __NASM_MAJOR__ и __NASM_MINOR__: Версия NASM
4.7.2. __FILE__ и __LINE__: Имя файла и номер строки
4.7.3. STRUC и ENDSTRUC: Объявление структурных типов данных
4.7.4. ISTRUC, AT и IEND: Объявление экземпляров структур
4.7.5. ALIGN и ALIGNB: Выравнивание данных

Глава 5. Директивы ассемблера

  5.1. BITS: Указание разрядности выполняемого кода
5.2. SECTION или SEGMENT: Изменение и описание секций
  5.2.1. Макрос __SECT__
  5.3. ABSOLUTE: Определение абсолютных меток
5.4. EXTERN: Импорт символов из других модулей
5.5. GLOBAL: Экспорт символов в другие модули
5.6. COMMON: Определение общих данных

Глава 6. Выходные форматы

  6.1. bin: Плоский бинарный формат
  6.1.1. ORG: Начало бинарного файла
6.1.2. bin-расширение директивы SECTION
  6.2. obj: Объектные файлы OMF Microsoft
  6.2.1. obj-расширения директивы SEGMENT
6.2.2. GROUP: Определение групп сегментов
6.2.3. UPPERCASE: Отключение чувствительности к регистру
6.2.4. IMPORT: Импортирование символов из DLL
6.2.5. EXPORT: Экспортирование символов в DLL
6.2.6. ..start: Определение точки входа в программу
6.2.7. obj-расширения директивы EXTERN
6.2.8. obj-расширения директивы COMMON
  6.3. win32: Объектные файлы Win32 Майкрософт
  6.3.1. win32-расширения директивы SECTION
  6.4. coff: Общий формат объектных файлов
6.5. elf: Объектные файлы ELF Линукс
  6.5.1. elf-расширения директивы SECTION
6.5.2. Позиционно-независимый код: Специальные символы формата elf и WRT
6.5.3. elf-расширения директивы GLOBAL
6.5.4. elf-расширение директивы COMMON
  6.6. aout: Объектные файлы a.out Линукс
6.7. aoutb: Объектные файлы a.out NetBSD/FreeBSD/OpenBSD
6.8. as86: Объектные файлы as86 Линукс
6.9. rdf: Перемещаемые динамические объектные файлы
  6.9.1. Требование библиотеки: Директива LIBRARY
  6.10. dbg: Формат для отладки

Глава 7. Написание 16-битного кода (DOS, Windows 3/3.1)

  7.1. Получение .EXE файлов
  7.1.1. Использование формата obj для получения .EXE файлов
7.1.2. Использование формата bin для получения .EXE файлов
  7.2. Получение .COM файлов
  7.2.1. Использование формата bin для получения .COM файлов
7.2.2. Использование формата obj для получения .COM файлов
  7.3. Получение .SYS файлов
7.4. Взаимодействие с 16-битными C-программами
  7.4.1. Внешние символьные имена
7.4.2. Модели памяти
7.4.3. Определения и вызовы функций
7.4.4. Доступ к элементам данных
7.4.5. c16.mac: Макросы для 16-битного C-интерфейса
  7.5. Взаимодействие с программами Borland Pascal
  7.5.1. Соглашение о вызовах в Pascal
7.5.2. Ограничение имен сегментов в Borland Pascal
7.5.3. Использование c16.mac с Pascal-программами

Глава 8. Написание 32-битного кода (Unix, Win32, DJGPP)

  8.1. Интерфейс с 32-ух битными программами на Си
  8.1.1. Внешние символьные имена
8.1.2. Определение и вызов функций
8.1.3. Доступ к переменным
8.1.4. c32.mac: Вспомогательные макросы для 32-ух битного интерфейса с Си
  8.2. Написание разделяемых библиотек для NetBSD/FreeBSD/OpenBSD и Linux/ELF
  8.2.1. Получение адреса ГТС
8.2.2. Нахождение ваших локальных переменных
8.2.3. Нахождение внешних и общих переменных
8.2.4. Экспортирование имен в библиотеку пользователя
8.2.5. Вызов процедур вне библиотеки
8.2.6. Создание библиотечного файла

Глава 9. Смешивание16- и 32-битного кода

  9.1. Переходы между сегментами смешанной разрядности
9.2. Адресация между сегментами различной разрядности
9.3. Другие инструкции смешанного размера

Глава 10. Разрешение проблем

  10.1. Общие проблемы
  10.1.1. Генерация NASM неэффективного кода
10.1.2. Мои "JUMPы" вне диапазона
10.1.3. ORG не работает
10.1.4. TIMES не работает
  10.2. Дефекты (Ошибки)

Указатель