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

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

  Обновл. 29 Сен 2019  | 

 14188

 ǀ   15 

Программы на ассемблере могут быть разделены на три секции:

   Секция 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 (21 оценок, среднее: 4,62 из 5)
Загрузка...

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

  1. Аватар John Meow:

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

  2. Аватар 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 используется

  3. Аватар Дрон:

    "чтобы ваш объектный файл прошёл линкинг и создался исполняемый файл под названием 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)

  4. Аватар Александр:

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

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

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

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

    1. Аватар Тимур:

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

  5. Аватар Euripus:

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

  6. Аватар somebox:

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

  7. Аватар 41RAT:

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

    1. Юрий Юрий:

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

  8. Аватар Егор:

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

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

  9. Аватар Roman:

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

    1. Юрий Юрий:

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

  10. Аватар Roman:

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

    1. Юрий Юрий:

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

Добавить комментарий

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