Ассемблер
Как написать Hello World на ассемблере
Чтобы написать Hello World на ассемблере, сначала выберите среду: Linux x86-64 и NASM, Windows и MASM, FASM или учебный DOSBox/TASM. Универсального кода, который одинаково работает везде, нет. Ассемблер зависит от процессора, операционной системы и способа вывода текста
Самый понятный вариант: Linux x86-64 и NASM
Пример:
section .data
msg db "Hello, world!", 10
len equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, len
syscall
mov rax, 60
xor rdi, rdi
syscall
Сборка:
nasm -f elf64 hello.asm -o hello.o
ld hello.o -o hello
./hello
Если все собрано правильно, в терминале появится строка:
Hello, world!
Что здесь происходит
В секции .data лежит строка:
msg db "Hello, world!", 10
len equ $ - msg
10 — перевод строки. len считает длину автоматически
В секции .text лежит код. Первый syscall вызывает Linux write: номер вызова кладется в rax, дескриптор stdout — в rdi, адрес строки — в rsi, длина — в rdx
Второй syscall завершает программу через exit
Почему Windows-код будет другим
В Windows нельзя просто взять Linux syscall из примера выше. Обычно используют WinAPI, MASM и другой способ линковки. Поэтому для Windows лучше брать пример именно под MASM или FASM/WinAPI, а не копировать Linux-код
Если вы используете FASM
FASM часто позволяет собрать исполняемый файл проще, но код и директивы будут другими. Для новичка важна мысль: выбирайте пример под свой инструмент. Если пример написан под NASM, не вставляйте его без изменений в FASM или MASM
Если нужен только первый запуск
Для первого знакомства можно использовать онлайн-среду или готовый шаблон. Но все равно проверьте, какой синтаксис выбран внутри: NASM, GAS, MASM или другой. Ошибка новичка — скопировать правильный код в неправильный ассемблер
Частые ошибки
Забывают длину строки
Системный вызов должен знать, сколько байт выводить
Путают 32-bit и 64-bit
В 64-битном Linux используются rax, rdi, rsi, rdx. В 32-битных примерах регистры и вызовы другие
Запускают .asm как программу
Файл .asm нужно собрать и слинковать
Копируют Linux-пример в Windows
Для Windows нужен другой способ вывода
Как лучше использовать пример
Если вы хотите именно написать Hello World, начните с готового рабочего шаблона и меняйте только строку. Когда программа запускается, уже можно разбирать системные вызовы, регистры и секции. Если начать с теории, новичок часто застревает еще до первого вывода
Что почитать дальше по ассемблеру
Если нужен общий маршрут по теме, откройте рубрику ассемблеру. Для соседних задач пригодятся эти разборы:
- Как написать в Linux программу на ассемблере x64: Hello World
- Hello World на ассемблере: зачем он сложнее, чем в C++
- Как написать игру на ассемблере
- CMP в ассемблере
Как проверить результат на практике
Для ассемблера важно сначала понять, под какую среду написан пример: DOSBox/TASM, Linux x64/NASM, Visual Studio/MASM или микроконтроллер. Один и тот же смысл может записываться разным синтаксисом, поэтому не переносите команды между средами вслепую. Создайте отдельную папку для примера, сохраните файл с расширением .asm, выполните сборку именно тем инструментом, который указан в уроке, и сравните вывод или состояние регистров с ожидаемым результатом
Если пример не собирается, читайте первую ошибку ассемблера: обычно она указывает на строку, неизвестную инструкцию, неверную метку, неправильную секцию или конфликт синтаксиса. Исправляйте одну ошибку за раз. В ассемблере это особенно важно, потому что маленькая опечатка в метке, регистре или размере операнда может полностью изменить поведение программы