Найти в Дзене
Old Programmer

Ассемблер для Linux. Для начала Hello, world! (книга)

Приветствую всех на моем канале Old Programmer. Продолжаем публиковать материалы из книги об ассемблере GAS. Все разделы моего канала здесь. Параграф 1.5. Пишем первую программу Hello, world! Ну вот настало время, когда нужно и можно написать программу«Hello, world!». Это не сложно ведь у нас имеется шаблон программы. И мы просто должны его правильно заполнить. Но это еще не все мы должны знать как вывести информацию на консоль. Как уже понятно из предыдущего параграфа одним из инструментов, который широко используется при программировании на ассемблере в операционной системе Linux являются системные вызовы. Мы вызываем функцию ядра, которая выполняет то или иное системное действие. В предыдущем параграфе мы вызывали функцию, которая заканчивает выполнение текущей программы (процесса). И как легко догадаться мы должны теперь использовать системный вызов, который выводит строку текста на консоль. В дальнейшем мы дадим список системных вызовов операционной системы Linux, а пока будем зн

Приветствую всех на моем канале Old Programmer. Продолжаем публиковать материалы из книги об ассемблере GAS.

Все разделы моего канала здесь.

  • Книга "Ассемблер для Linux"
  • Список разделов канала Old Programmer, канала о программировании и программистах

Параграф 1.5.

Пишем первую программу Hello, world!

Ну вот настало время, когда нужно и можно написать программу«Hello, world!». Это не сложно ведь у нас имеется шаблон программы. И мы просто должны его правильно заполнить. Но это еще не все мы должны знать как вывести информацию на консоль. Как уже понятно из предыдущего параграфа одним из инструментов, который широко используется при программировании на ассемблере в операционной системе Linux являются системные вызовы. Мы вызываем функцию ядра, которая выполняет то или иное системное действие. В предыдущем параграфе мы вызывали функцию, которая заканчивает выполнение текущей программы (процесса). И как легко догадаться мы должны теперь использовать системный вызов, который выводит строку текста на консоль. В дальнейшем мы дадим список системных вызовов операционной системы Linux, а пока будем знакомить с ними последовательно, по мере их поступления. В данном параграфе это системный вызов с номером 1 — вывод на консоль.

Как и говорили, мы возьмем программу из листинга 3 и дополним ее. Мы дополним ее еще одним системным вызовом. Кроме этого добавим в программу еще одну секцию для хранения там данных, а точнее строки, которую будем выводить. Эта программа представлена в листинге 4.

Давайте подробно разберем программу из листинга 4, с учетом того, что уже было объяснено для листинга 3.

1. Как мы видим у нас появился еще один системный вызов с номером 1 (число, помещаемое в регистр rax). Но у этого системного вызова есть еще и другие параметры, которые прокомментированы в программе. rdi— стандартный поток вывода, rsi— адрес (метка) начала выводимой строки, rdx— длина строки в байтах.

2. В программе имеются две секции: .data — для данных (глобальных переменных), .text— для программного кода. В большинстве случаев нам будет вполне хватать именно двух секций.

3. В программе имеются две метки. С одной, глобальной меткой _start мы уже знакомы. Метка msg указывает на начало строки. Для нас смысл обеих меток равнозначен — обе указывают на некоторый адрес.

4. Давайте посмотрим еще на один важный элемент. Это len. Это не команда процессора. Ее можно назвать макропеременной или переменной времени трансляции. Ее значение определяется до того, как кодируются команда процессора. Точка в ассемблере GAS принимает значение текущего адреса, поэтому . - msgэто просто длина строки. Конечно команду процессора mov $len, %rdx можно заменить другой: mov $n, %rdx, где nколичество байтов в строке. Но с использованием переменной len мы реализовали более общий подход. Можно брать строки разной длины и не считать, сколько там на самом деле байтов. Подчеркнем лишний раз, что считать нужно количество байтов, при кодировке UTF-8, которую мы используем, а это может быть проблематично.

5. Обратим внимание еще на один элемент программы, точнее выводимой на консоль строки. Это символ '\n'. Конечно, вы с ним знакомы из языка C. Это символ перевода строки. Для вывода на консоль с помощью системного вызова с номером 1 этот символ работает ровно также.

Трансляции программы производится уже известным на способом:

as --64 l4.s -o l4.o
ld -s l4.o -o l4

--> Глава 1. Параграф 1.6. <--Глава 1. Параграф 1.4.

Подписываемся на мой канал Old Programmer и пишем свои комментарии.

Программа l4.s
Программа l4.s