Перейти к основному содержимому

О разделе

Длинные листинги (от ~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 → объектный файл .oNASM, 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 до первой программы и справочника.


Рекомендуемый порядок

  1. История ассемблерных языков — контекст и современные ниши.
  2. Основы ассемблера — синтаксис, мнемоники, регистры, стек.
  3. Система команд и Intel/AT&T — ISA, CISC/RISC, сравнение диалектов.
  4. Архитектура ассемблерных программ — память, ОС, системные вызовы.
  5. Типы данных и регистры — байты, endianness, указатели без "типов" в языке.
  6. Управляющие конструкции — флаги, переходы, циклы, CALL/RET.
  7. Команды и подпрограммы — ABI, фрейм стека, возврат значений.
  8. Первая программа — установка NASM/SASM, сборка, Hello World.
  9. Процедуры и прерывания — стек вызовов, IDT, исключения.
  10. Длинная целочисленная арифметикаADC/SBB, числа шире регистра.
  11. SETcc и CMOV — условные операции без лишних прыжков.
  12. Макросы NASM%macro, %include, условная сборка.
  13. Несколько модулей и линковкаglobal/extern, несколько .o.
  14. Взаимодействие с C — вызовы между asm и C, выравнивание стека.
  15. Чтение ELF и листингаobjdump, символы, разбор бинарника.
  16. Строковые инструкции и таблицыREP, MOVSB, SCASB, lookup table.
  17. Float и SIMD — SSE2, XMM, кратко x87 и AVX.
  18. Windows x64 и WinAPI — ABI Microsoft, консоль, файлы, PE.
  19. Справочник — шпаргалка после прохождения курса, не с нуля.

Как читать раздел без перегруза

Если тема кажется "слишком низкоуровневой", используйте простой ритм:

  1. На каждой статье закрепляйте 1-2 идеи запуском маленького примера.
  2. Не перескакивайте между Linux и Windows в одном дне: сначала один ABI, потом сравнение.
  3. После нового термина сразу открывайте связанную статью из блока related или "В подборках".
  4. Раз в 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. Шаг 1 из таблицы.
  2. Три непонятных термина — найдите статьи в оглавлении раздела.
  3. Другой язык — только после своей рабочей первой программы.


В подборках

Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:

Системное программированиеRust — о разделе, Си — о разделе, C++ — о разделе, Системное программирование на C++, Оптимизация размера и производительности приложений, Выполнение кода — о разделе.

Бэкенд и серверная разработкаVisual Basic — о разделе, Си — о разделе, Pascal — о разделе, Haskell — о разделе, Lisp — о разделе, Scala — о разделе.