Ассемблер

Как написать 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, начните с готового рабочего шаблона и меняйте только строку. Когда программа запускается, уже можно разбирать системные вызовы, регистры и секции. Если начать с теории, новичок часто застревает еще до первого вывода

Что почитать дальше по ассемблеру

Если нужен общий маршрут по теме, откройте рубрику ассемблеру. Для соседних задач пригодятся эти разборы:

Как проверить результат на практике

Для ассемблера важно сначала понять, под какую среду написан пример: DOSBox/TASM, Linux x64/NASM, Visual Studio/MASM или микроконтроллер. Один и тот же смысл может записываться разным синтаксисом, поэтому не переносите команды между средами вслепую. Создайте отдельную папку для примера, сохраните файл с расширением .asm, выполните сборку именно тем инструментом, который указан в уроке, и сравните вывод или состояние регистров с ожидаемым результатом

Если пример не собирается, читайте первую ошибку ассемблера: обычно она указывает на строку, неизвестную инструкцию, неверную метку, неправильную секцию или конфликт синтаксиса. Исправляйте одну ошибку за раз. В ассемблере это особенно важно, потому что маленькая опечатка в метке, регистре или размере операнда может полностью изменить поведение программы

Подписаться
Уведомить о
guest
0 комментариев
Старые
Новые Популярные

Настройки cookie

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x