1. Архитектура процессора и установка инструментария NASM [metanit.com](https://metanit.com/assembler/nasm)
Архитектура процессора и установка инструментария NASM metanit.com
Архитектура Intel x86-64
Программирование на ассемблере требует понимания того, как устроено «железо». В отличие от языков высокого уровня (Python, Java, C++), где детали скрыты за абстракциями, ассемблер работает напрямую с ресурсами процессора. Современные компьютеры, будь то серверы, ноутбуки или десктопы, преимущественно построены на архитектуре фон Неймана.
Эта архитектура состоит из трех ключевых компонентов:
Все эти компоненты общаются через системную шину, которая передает адреса, данные и управляющие сигналы. Когда вы пишете код на ассемблере, вы управляете именно процессором, заставляя его перемещать данные между регистрами, памятью и портами ввода-вывода.
Современным стандартом для персональных компьютеров является архитектура Intel x86-64. Это 64-битное расширение классической 32-битной архитектуры x86. Она поддерживает обратную совместимость, что позволяет запускать старые программы на новом оборудовании.
Регистры процессора
Регистры — это сверхбыстрая память, находящаяся внутри самого процессора. Это «рабочий стол» процессора: прежде чем выполнить операцию (сложение, сравнение, логическое И), данные обычно нужно поместить в регистры.
В архитектуре x86-64 доступно 16 регистров общего назначения (General Purpose Registers — GPR). Каждый из них имеет размер 64 бита.
Основные 64-битные регистры
* RAX (Accumulator): Часто используется для арифметики и возврата значений из функций. * RBX (Base): Базовый регистр, часто используется как указатель на данные. * RCX (Counter): Счетчик, используется в циклах. * RDX (Data): Используется в арифметике и вводе-выводе. * RSP (Stack Pointer): Указывает на вершину стека (важнейший регистр для управления памятью). * RBP (Base Pointer): Указывает на базу кадра стека (используется при вызове функций). * RSI (Source Index): Индекс источника (для операций копирования). * RDI (Destination Index): Индекс назначения (для операций копирования). * R8 — R15: Дополнительные регистры, добавленные в 64-битной архитектуре.
Доступ к частям регистров
Одной из ключевых особенностей x86 является возможность обращаться к частям одного и того же регистра. Это наследие эволюции от 8-битных процессоров к 64-битным.
Рассмотрим на примере регистра RAX (64 бита): * RAX: Полный 64-битный регистр. * EAX: Младшие 32 бита регистра RAX. * AX: Младшие 16 бит регистра RAX (или младшие 16 бит EAX). * AH: Старшие 8 бит регистра AX. * AL: Младшие 8 бит регистра AX.
Это правило работает для регистров A, B, C, D. Например, для счетчика: RCX -> ECX -> CX -> CH / CL. Для новых регистров (R8-R15) суффиксы другие: R8 (64 бита), R8D (32 бита), R8W (16 бит), R8B (8 бит).
Изменение младшей части регистра (например, AL) меняет и значение всего регистра RAX. Однако запись в 32-битную часть (EAX) на 64-битных процессорах обычно обнуляет старшую половину RAX.
Единицы информации
В ассемблере вы постоянно работаете с битами и байтами.
где — один байт, минимально адресуемая единица памяти, а — восемь бит (нулей или единиц), составляющих этот байт.
Разрядность процессора определяет, с какими числами он может работать за одну операцию и сколько памяти может адресовать. 64-битный процессор теоретически может адресовать:
где — это 18 446 744 073 709 551 616 уникальных адресов, что значительно превышает объемы существующей оперативной памяти.
Установка инструментария NASM
Для превращения исходного кода (текста) в машинный код нам нужен компилятор. Мы будем использовать NASM (Netwide Assembler). Это популярный, бесплатный и кроссплатформенный инструмент.
Важно понимать цепочку создания программы:
.asm в объектный файл (.obj или .o). Это машинный код, но еще не готовая программа (нет адресов системных библиотек)..exe или без расширения в Linux/macOS).Установка на Windows
win64 и скачайте ZIP-архив (например, nasm-2.16.01-win64.zip). Использование инсталлятора не обязательно.C:\NASM.nasm.exe (например, C:\NASM).
* Сохраните изменения (ОК -> ОК).Чтобы проверить установку, откройте командную строку (cmd) и введите:
Если вы увидите версию (например, NASM version 2.16.01), значит, все настроено верно.
Установка на macOS
На macOS проще всего использовать пакетный менеджер Homebrew.
После установки проверьте версию командой nasm -v.
Также для компоновки (создания запускаемых файлов) вам понадобятся инструменты разработчика Xcode. Если они не установлены, система предложит их установить при первой попытке компиляции, или вы можете вызвать установку вручную:
Установка на Linux
В большинстве дистрибутивов Linux NASM доступен в стандартных репозиториях.
Для Ubuntu/Debian:
Для Fedora/Red Hat:
Для компоновки в Linux обычно используется ld (часть пакета binutils) или gcc, которые часто уже предустановлены.
Итоги
* Процессор взаимодействует с памятью и устройствами через регистры и шину данных.
* Регистры — это сверхбыстрая память внутри ЦП. В x86-64 основные регистры имеют размер 64 бита (начинаются на R, например RAX).
* Регистры имеют вложенную структуру: к младшим частям 64-битного регистра можно обращаться как к 32-битным (EAX), 16-битным (AX) и 8-битным (AL) регистрам.
* NASM — это ассемблер, который переводит код в объектный файл. Для получения исполняемой программы необходим этап компоновки (linking).
* Для работы необходимо добавить путь к NASM в переменные среды (Path), чтобы вызывать его из командной строки.