Открыть сервисСервис

Ассемблер — язык программирования низкого уровня

Ассемблер — это символьный язык программирования низкого уровня, в котором инструкции программы записываются в виде мнемонических кодов, соответствующих машинным командам процессора. Программа на ассемблере (ассемблерный исходный код) преобразуется в объектный код с помощью программы-ассемблировщика (также называемой ассемблером). Ассемблер является одним из немногих языков, имеющих практически 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, в частности в образовательных целях и при изучении устройства компьютера.

Применение

Ассемблер находит применение в ряде областей:

  • Драйверы устройств и системное программирование — работа с регистрами, прерываниями, управление памятью;
  • Встраиваемые системы — особенно на микроконтроллерах с ограниченными ресурсами;
  • Критичные к производительности участки кода — оптимизированные под конкретный процессор подпрограммы;
  • Реверс-инжиниринг и анализ вредоносного ПО — изучение скомпилированных программ;
  • Криптография — реализации алгоритмов, устойчивые к атакам по сторонним каналам;
  • Образование — изучение устройства процессора и принципов работы компьютера.

Преимущества и недостатки

К достоинствам ассемблера относятся:

  • Полный контроль над генерируемым машинным кодом;
  • Возможность достижения максимальной производительности;
  • Минимальный размер исполняемых файлов;
  • Доступ ко всем ресурсам процессора.

Недостатки:

  • Низкая переносимость — код пишется под конкретную архитектуру (и часто под конкретную версию процессора);
  • Низкая производительность труда программиста;
  • Высокая вероятность ошибок;
  • Сложность отладки и сопровождения;
  • Необходимость ручной оптимизации того, что компиляторы языков высокого уровня выполняют автоматически.

Основные ассемблиры

АссемблерАрхитектураОсобенности
NASMx86, x86-64Свободный, распространённый, синтаксис Intel
FASMx86, x86-64Самоассемблирующийся, компактный
GNU Assembler (GAS)множествоЧасть GCC, синтаксис AT&T
MASMx86Microsoft Macro Assembler, исторический
YASMx86, x86-64Совместим с NASM

Источники

  • Таненбаум Э. «Архитектура компьютера»
  • Иванов С. В. «Ассемблер. Полный курс»
  • Документация NASM (nasm.us)
  • IBM System/360 Principles of Operation
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru