О разделе
Длинные листинги (от ~15 строк) вынесены в каталог code.spirzen.ru и подгружаются в статьях через ExternalCodeEmbed — так HTML энциклопедии не раздувается, а код остаётся с подсветкой, вкладками и сериями "шаг 1…N". Короткие фрагменты (одна строка, пара выражений) по-прежнему прямо в markdown. Диаграммы mermaid и интерактив — на месте или в play.spirzen.ru.
Материалы про язык ассемблера (мнемоники, директивы, ABI) и про ассемблеры как программы (nasm, gas, ml64), которые переводят исходный текст в объектный код. Примеры в разделе в основном для x86/x86-64; синтаксис листингов — Intel (NASM), если не указано иное.
Сначала: Что такое код и как он работает — общая база — код, блок кода, компиляция и интерпретация, исходный, байт- и машинный код; в этом разделе — синтаксис и особенности языка.
Язык, ассемблер и дизассемблер
В учебниках и разговорной речи одно слово "ассемблер" обозначает три разные вещи. В этом разделе их разводят явно.
| Термин | Что это | Пример |
|---|---|---|
| Язык ассемблера | Текстовое представление команд процессора, удобное для человека | mov rax, 1, метки, section .data |
| Ассемблер (программа) | Транслятор: исходник .asm / .s → объектный файл .o | NASM, GAS, MASM |
| Дизассемблер | Обратный перевод: байты исполняемого файла → листинг мнемоник | objdump -d, Ghidra, IDA |
★ Язык ассемблера — низкоуровневый императивный язык: программа задаёт последовательность действий процессора. Он привязан к архитектуре (набор команд, регистры, размер слова). Программа, собранная под x86-64, на ARM без переписывания и пересборки не запустится.
★ Ассемблер (от англ. assembler — "сборщик") читает исходный текст, подставляет адреса меток, раскрывает макросы и директивы и выдаёт машинный код — чаще в виде объектного модуля, а не готового .exe. Исполняемый файл получают линковкой одного или нескольких .o с библиотеками. Подробнее о цепочке — в Компиляторы и интерпретаторы и в Основах.
На этапе мнемоник (без макросов) перевод обычно однозначен: одна строка с командой процессора → одна машинная инструкция. Макросы, %define, условная сборка и директивы вроде db / equ обрабатывает сам ассемблер при сборке; процессор их не выполняет. См. Макросы и условная сборка.
Дизассемблирование — операция, обратная ассемблированию: из бинарника восстанавливают текст мнемоник для анализа, отладки и исследования без исходников. В энциклопедии — Чтение ELF и листинга и раздел Дизассемблирование.
Современные ассемблеры (NASM, GAS, MASM, FASM) — как правило макроассемблеры: поверх базового языка работает препроцессор макросов, условной трансляции и подключения файлов (%include). Набор директив зависит от конкретного транслятора, а не только от процессора.
В главе Алгоритмы, языки и программирование ассемблер упоминается в таблице уровней языков.
Углублённый маршрут — здесь: от истории и основ через ISA и Intel/AT&T до первой программы и справочника.
Рекомендуемый порядок
- История ассемблерных языков — контекст и современные ниши.
- Основы ассемблера — синтаксис, мнемоники, регистры, стек.
- Система команд и Intel/AT&T — ISA, CISC/RISC, сравнение диалектов.
- Архитектура ассемблерных программ — память, ОС, системные вызовы.
- Типы данных и регистры — байты, endianness, указатели без "типов" в языке.
- Управляющие конструкции — флаги, переходы, циклы,
CALL/RET. - Команды и подпрограммы — ABI, фрейм стека, возврат значений.
- Первая программа — установка NASM/SASM, сборка, Hello World.
- Процедуры и прерывания — стек вызовов, IDT, исключения.
- Длинная целочисленная арифметика —
ADC/SBB, числа шире регистра. - SETcc и CMOV — условные операции без лишних прыжков.
- Макросы NASM —
%macro,%include, условная сборка. - Несколько модулей и линковка —
global/extern, несколько.o. - Взаимодействие с C — вызовы между asm и C, выравнивание стека.
- Чтение ELF и листинга —
objdump, символы, разбор бинарника. - Строковые инструкции и таблицы —
REP,MOVSB,SCASB, lookup table. - Float и SIMD — SSE2, XMM, кратко x87 и AVX.
- Windows x64 и WinAPI — ABI Microsoft, консоль, файлы, PE.
- Справочник — шпаргалка после прохождения курса, не с нуля.
Как читать раздел без перегруза
Если тема кажется "слишком низкоуровневой", используйте простой ритм:
- На каждой статье закрепляйте 1-2 идеи запуском маленького примера.
- Не перескакивайте между Linux и Windows в одном дне: сначала один ABI, потом сравнение.
- После нового термина сразу открывайте связанную статью из блока
relatedили "В подборках". - Раз в 2-3 шага возвращайтесь в справочник и отмечайте, что уже стало понятным без подсказок.
Так материал накапливается слоем за слоем, а не превращается в набор разрозненных команд.
Перед копированием кода
У каждого листинга смотрите подпись — архитектура (32/64 бит), ОС (Linux / Windows / DOS), точка входа (_start + syscall или WinAPI). Смешивать номера системных вызовов Linux i386 (int 0x80, eax = 4) и x86-64 (syscall, rax = 1) нельзя — это разные контракты.
Зачем этот раздел
Подборка по Ассемблер в энциклопедии: синтаксис, первая программа и смежные темы. Выберите один язык для старта, пройдите маршрут до первой рабочей программы — затем переходите к следующему языку или стеку.
С чего начать
| Шаг | Материал | Зачем |
|---|---|---|
| 1 | Первая программа | Запуск и синтаксис |
Частые ошибки при старте
| Ошибка | Что делать |
|---|---|
| Прыжки между языками | Закройте одну "первую программу", потом сравнивайте |
| Код без запуска | Выполните пример локально |
| Сразу большой фреймворк | Сначала база раздела, потом REST/UI |
| Смешение ABI (Linux/Windows, 32/64) | Сверяйте ОС, разрядность и таблицу аргументов перед запуском |
| Копирование листинга без проверки секций | Проверяйте .text, .data, точку входа и формат линковки |
Что попробовать
- Шаг 1 из таблицы.
- Три непонятных термина — найдите статьи в оглавлении раздела.
- Другой язык — только после своей рабочей первой программы.
История ассемблерных языков
Полный отказ от высокоуровневых языков нецелесообразен. Поэтому большинство компиляторов поддерживают встроенный ассемблер — механизм вставки ассемблерных инструкций непосредственно в код на C/C++.
Макросы и условная сборка
%macro, %define и %if в NASM — шаблоны инструкций без дублирования исходного текста.
Несколько модулей и линковка
Разделение программы на .asm-файлы, global и extern, сборка объектников и линковка в ELF.
Взаимодействие с C и C++
Вызов ассемблерных функций из C и наоборот — System V AMD64 ABI, выравнивание стека, сборка.
Чтение исполняемого файла и листинга
Секции ELF, символы, objdump и сопоставление дизассемблирования с исходным NASM-кодом.
Строковые инструкции и таблицы поиска
REP, MOVS, SCAS, STOS, флаг DF и доступ к данным по индексу через таблицу.
Числа с плавающей точкой и SIMD
SSE2 для float и double, регистры XMM, выравнивание; кратко про стек x87 и AVX.
Windows x64, WinAPI и отличия от Linux
Microsoft x64 calling convention, shadow space, вывод в консоль и файлы через API вместо syscall.
Система команд (ISA) и синтаксис Intel/AT&T
ISA процессора, CISC и RISC, диалекты asm для x86 и сравнение Intel-синтаксиса с AT&T на примерах NASM и GAS.
Основы ассемблера
Основы ассемблера - синтаксис Intel/AT&T, базовые инструкции и принципы низкоуровневого программирования.
Архитектура ассемблерных программ
Архитектура ассемблерных программ - взаимодействие с ОС, вызовы библиотек и организация низкоуровневого кода.
Типы данных и регистры
Типизация, набор правил определения типа данных значений языка.
Управляющие конструкции и команды процессора
Управляющие конструкции и команды процессора в ассемблере - регистр команд, переходы и управление потоком исполнения.
Команды и подпрограммы
Команды и подпрограммы в ассемблере - передача параметров, соглашения вызовов и работа со стеком.
Процедуры и прерывания
Процедуры и прерывания в ассемблере - структура подпрограмм, вызовы, возвраты и работа с аппаратными сигналами.
Первая программа на ассемблере
Гайд по установке и настройке с написанием первой программы и её запуском.
Справочник по ассемблеру
Справочник-шпаргалка по ассемблеру — типы, синтаксис, стандартная библиотека, типовые паттерны. Не заменяет пошаговое обучение. Учебный курс — раздел.
Длинная целочисленная арифметика
Сложение, вычитание и сдвиги чисел шире регистра через ADC, SBB и массивы слов в little-endian.
SETcc, CMOV и ветвления без прыжков
Условная установка байта и условное перемещение в регистр — когда использовать вместо Jcc.
Ассемблер — о разделе
Язык ассемблера, программы-трансляторы (NASM, GAS), макроассемблер, дизассемблирование и маршрут от основ до x86-64.
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Системное программирование — Rust — о разделе, Си — о разделе, C++ — о разделе, Системное программирование на C++, Оптимизация размера и производительности приложений, Выполнение кода — о разделе.
Бэкенд и серверная разработка — Visual Basic — о разделе, Си — о разделе, Pascal — о разделе, Haskell — о разделе, Lisp — о разделе, Scala — о разделе.