Россия и Беларусь начали и продолжают войну против народа Украины!

Ассемблер. Базовый синтаксис

  Евгений Павлов  | 

  Обновл. 29 Янв 2023  | 

 78851

 ǀ   19 

Программы на языке ассемблере могут быть разделены на три секции: data, bss, text.

Секция data используется для объявления инициализированных данных или констант. Данные в этой секции НЕ могут быть изменены во время выполнения программы. Вы можете хранить константные значения и названия файлов в этой секции. Синтаксис объявления:

Секция bss используется для объявления переменных. Синтаксис объявления:

Секция text используется для хранения кода программы. Данная секция должна начинаться с объявления global_start, которое сообщает ядру, откуда нужно начинать выполнение программы. Синтаксис объявления:

Комментарии

Комментарии в ассемблере должны начинаться с точки с запятой (;). Они могут содержать любой печатный символ, включая пробел. Комментарий может находиться как на отдельной строке:

Так и на строке со стейтментом:

Стейтменты


В ассемблере есть три вида стейтментов:

   Выполняемые инструкции (или просто «инструкции») — сообщают процессору, что нужно делать. Каждая инструкция хранит в себе код операции (или «опкод») и генерирует одну инструкцию на машинном языке.

   Директивы ассемблера — сообщают программе об аспектах компиляции. Они не генерируют инструкции на машинном языке.

   Макросы — являются простым механизмом вставки кода.

В ассемблере на одну строку приходится один стейтмент, который должен соответствовать следующему формату:

Базовая инструкция состоит из названия инструкции (mnemonic) и операндов (они же «параметры»). Вот примеры типичных стейтментов ассемблера:

Первая программа

Следующая программа на языке ассемблера выведет строку Hello, world! на экран:

Результат выполнения программы:

Hello, world!

Сборка программ


Убедитесь, что у вас установлен NASM. Запишите вашу программу в текстовом редакторе и сохраните её как hello.asm. Затем:

   откройте терминал;

   убедитесь, что вы находитесь в той же директории, в которой вы сохранили hello.asm;

   чтобы собрать программу, введите команду nasm -f elf hello.asm;

   если не было ошибок, то создастся объектный файл вашей программы под названием hello.o;

   чтобы ваш объектный файл прошел линкинг и создался исполняемый файл под названием hello, введите команду ld -m elf_i386 -s -o hello hello.o;

   запустите программу командой ./hello.

Если всё прошло успешно, то вам выведется Hello, world!.

Если у вас нет возможности скомпилировать программу, например, у вас нет Linux и вы пока не хотите на него переходить, то можете использовать одну из следующих онлайн-IDE:

   TutorialsPoint

   JDoodle

Примечание: Запоминать две вышеприведенные команды для сборки программы на ассемблере для некоторых может быть несколько затруднительно, поэтому вы можете написать скрипт для сборки программ на ассемблере. Для этого создайте файл под названием Makefile со следующим содержимым:

Для сборки hello.asm выполните следующие действия:

   откройте терминал;

   убедитесь, что вы находитесь в той же директории, в которой вы сохранили hello.asm и Makefile;

   введите команду make source=hello.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (90 оценок, среднее: 4,77 из 5)
Загрузка...

Комментариев: 19

  1. Михаил:

    Код для автоматизации процесса сборки через CMake

  2. Михаил:

    Эм полчаса дебажил, оказывается вместо спейсов нужен таб на строчках и символ — в исходнике отличается от консольного, вот рабочий вариант

    all:

    1. Дмитрий:

      Хех, спасибо! Да, символы дефиса в примере не валидный для консоли, просто скопипастить в Makefile не получится. Тоже не сразу сообразил.

  3. John Meow:

    Я использую вот такой скрипт:
    https://gist.github.com/MinerChAI/62c60442d4bb904bb87e0ca5fa1b9473
    Его удобнее использовать, т.к. не надо указывать source и как аргумент он получает полное имя файла, таким образом можно компилить файлы с другими расширениями (можно даже просто точку в конце имени файла написать) + работает автодополнение

  4. Archost:

    Для тех, кому нужно автоматизировать процесс сборки и запуска с помощью bash-скрипта:
    создайте скрипт > touch Makefile
    отредактируйте его с помощью vim > vim Makefile
    впишите туда это:

    #!/bin/bash
    fileasm=$(ls *.asm)
    nasm -f elf $fileasm
    file=${fileasm//.asm/}
    fileo=$(ls *.o)
    ld -m elf_i386 -s -o $file $fileo
    rm $fileo
    ./$file

    ой, а как отсюда выйти? ХДХДХД
    сохраните и выйдите нажав esc и введя :wq
    выдайте права на исполнение > sudo chmod +x Makefile
    А теперь просто запустите его > ./Makefile
    Он создаст исполняемый файл и запустит его, а ненужный файл object удалит. При обновлении самого кода на асме, скрипт перезапишет и запустит новую версию, без косяков и лишних файлов. ТОЛЬКО работает он, если в текущей директории нет других файлов с расширением .asm

    1. John Meow:

      А почему Makefile? Тут же не make используется

  5. Дрон:

    "чтобы ваш объектный файл прошёл линкинг и создался исполняемый файл под названием hello, введите команду ld -m elf_i386 -s -o hello hello.o;"

    "username@PC:~/Документи/1$ ld -m elf_i386 -s -o hello.s hello.o
    bash: ld: команду не обнаружено"

    стопорнулся на даном моменте.
    что может быть не так.
    (работаю с debian)

    1. Alexx:

      Вам нужно установить пакет lld:

      P.S. Я понимаю, что комментарий оставлен слишком поздно, но может быть ещё кто-нибудь столкнётся с этой проблемой

  6. Александр:

    После команды:

    Возникает ошибка:

    ld: warning: cannot find entry symbol _start; not setting start address

    Исполняемый файл создается, но не запускается

    1. Тимур:

      У меня тоже самое было, я поставил пробел в строке
      global_start таким образом: global _start и заработало т. к. оказалось, что это не одна команда, а определение _start как глобальной…(переменной?)

  7. Euripus:

    Мне в Makefile нужно было заменить nasm –f elf $(source) на nasm –f elf $(source).asm чтобы make заработал, возможно стоит исправить

  8. somebox:

    Под macOS эту программу еще нужно постараться собрать.

  9. 41RAT:

    Спасибо за ваши уроки)) Вы — супер, не скажете пожалуйста интервал выхода уроков по ассемблеру?

    1. Avatar photo Юрий:

      Пожалуйста) Как получится, ничего гарантировать не могу)

  10. Егор:

    В самом начале Вы написали, что данные в секции data не могут быть изменены. Это неверно. В качестве проверки в исходнике hello.asm после 4-й и до 9-й строки можно написать:

    И тогда вместо Hello, World! программа выведет Aello, World!

  11. Roman:

    Я бы еще на вашем месте уточнил бы что за команды используются и что они делают, потому что например новичок, к примеру, может int начать ассоциировать с типом данных integer, а не с прерыванием interrupt. И тоже самое с регистрами и что это вообще такое, потому что почему именно тот или иной регистр используем не понятно.

    1. Avatar photo Юрий:

      Всё постепенно, а не сразу. Будем объяснять в следующих уроках)

  12. Roman:

    Отлично написано, продолжайте в том же духе, новичкам будет проще разобраться, нежели если начнут читать того же Зубкова.

    1. Avatar photo Юрий:

      Будем продолжать 🙂

Добавить комментарий для Euripus Отменить ответ

Ваш E-mail не будет опубликован. Обязательные поля помечены *