Ассемблер — язык программирования низкого уровня¶
Ассемблер — это символьный язык программирования низкого уровня, в котором инструкции программы записываются в виде мнемонических кодов, соответствующих машинным командам процессора. Программа на ассемблере (ассемблерный исходный код) преобразуется в объектный код с помощью программы-ассемблировщика (также называемой ассемблером). Ассемблер является одним из немногих языков, имеющих практически 1:1 соответствие между инструкциями исходного текста и машинными командами исполняемого файла.
¶История
Термин «ассемблер» происходит от английского слова assemble — «собирать». Первые ассемблеры появились в конце 1940-х — начале 1950-х годов одновременно с развитием электронных вычислительных машин. Изначально программы для ЭВМ записывались в виде потока машинных кодов (чисел) вручную или на перфокартах. Работа с такими программами была крайне трудоёмкой и подверженной ошибкам, поэтому возникла идея использовать символьные обозначения для команд.
Одним из ранних примеров является ассемблер для машины UNIVAC I (1951). Значительный вклад в развитие ассемблерного языка внесли специалисты IBM — в частности, для системы IBM System/360 в 1960-х годах был создан ассемблер, ставший стандартом для целого семейства машин.
С развитием языков высокого уровня (Fortran, C и других) ассемблер не исчез, а занял нишу инструмента для задач, требующих точного контроля над аппаратными ресурсами.
¶Принцип работы
Программа-ассемблировщик читает текстовый файл с исходным кодом и преобразует его в объектный модуль (обычно в формате, содержащем машинный код и таблицу символов). Далее объектный модуль передаётся компоновщику (линковщику), который разрешает внешние ссылки и формирует исполняемый файл.
Типичный ассемблерный код содержит:
- Мнемоники команд — текстовые обозначения машинных инструкций (например,
MOV,ADD,JMPдля архитектуры x86); - Операнды — регистры, адреса памяти, константы;
- Директивы ассемблера — инструкции для самого ассемблировщика (выделение памяти, определение констант, управление секциями);
- Метки — имена точек входа для команд перехода.
Пример простой программы на ассемблере x86 (NASM):
``asm section .data msg db "Hello", 10 section .text global _start _start: mov eax, 4 mov ebx, 1 mov ecx, msg mov edx, 6 int 0x80 mov eax, 1 xor ebx, ebx int 0x80 ``
¶Классификация
Ассемблеры различаются по нескольким признакам:
| Признак | Виды |
|---|---|
| Целевая архитектура | x86, x86-64, ARM, MIPS, RISC-V и др. |
| Синтаксис | Intel, AT&T (для x86) |
| Количество проходов | одноходовые (one-pass), многоходовые (multi-pass) |
| Реализация | макроассемблеры (с поддержкой макрокоманд), простые |
В России и странах СНГ широкое распространение получил ассемблер для процессоров семейства x86, в частности в образовательных целях и при изучении устройства компьютера.
¶Применение
Ассемблер находит применение в ряде областей:
- Драйверы устройств и системное программирование — работа с регистрами, прерываниями, управление памятью;
- Встраиваемые системы — особенно на микроконтроллерах с ограниченными ресурсами;
- Критичные к производительности участки кода — оптимизированные под конкретный процессор подпрограммы;
- Реверс-инжиниринг и анализ вредоносного ПО — изучение скомпилированных программ;
- Криптография — реализации алгоритмов, устойчивые к атакам по сторонним каналам;
- Образование — изучение устройства процессора и принципов работы компьютера.
¶Преимущества и недостатки
К достоинствам ассемблера относятся:
- Полный контроль над генерируемым машинным кодом;
- Возможность достижения максимальной производительности;
- Минимальный размер исполняемых файлов;
- Доступ ко всем ресурсам процессора.
Недостатки:
- Низкая переносимость — код пишется под конкретную архитектуру (и часто под конкретную версию процессора);
- Низкая производительность труда программиста;
- Высокая вероятность ошибок;
- Сложность отладки и сопровождения;
- Необходимость ручной оптимизации того, что компиляторы языков высокого уровня выполняют автоматически.
¶Основные ассемблиры
| Ассемблер | Архитектура | Особенности |
|---|---|---|
| NASM | x86, x86-64 | Свободный, распространённый, синтаксис Intel |
| FASM | x86, x86-64 | Самоассемблирующийся, компактный |
| GNU Assembler (GAS) | множество | Часть GCC, синтаксис AT&T |
| MASM | x86 | Microsoft Macro Assembler, исторический |
| YASM | x86, x86-64 | Совместим с NASM |
¶Источники
- Таненбаум Э. «Архитектура компьютера»
- Иванов С. В. «Ассемблер. Полный курс»
- Документация NASM (nasm.us)
- IBM System/360 Principles of Operation
