Лаба. Лабораторные работы (47). Лабораторная работа Основы интерфейса командной строки ос gnu linux Цель работы Приобретение практических навыков общения с операционной системой на уровне командной строки (вход и выход,
Скачать 109.84 Kb.
|
; Выход с кодом возврата $0$ (без ошибок) ; Вызов ядра В отличие от многих современных высокоуровневых языков программирования, в ассемблерной программе каждая команда располагается на отдельной строке. Размещение нескольких команд на одной строке недопустимо. Синтаксис ассемблера NASM является чувствительным к регистру, т. е. есть разница между большими и малыми буквами. 2.2.2.2. Процесс создания и обработки программы на языке ассемблера Из-за специфики программирования, а также по традиции для создания программ на языке ассемблера обычно пользуются утилитами командной строки (хотя поддержка ассемблера есть в некоторых универсальных интегрированных средах). В процессе создания ассемблерной программы можно выделить четыре шага: 1. Набор текста программы в текстовом редакторе и сохранение её в отдельном файле. Каждый файл имеет свой тип (или расширение), который определяет назначение файла. Файлы с исходным текстом программ на языке ассемблера имеют тип asm. 2. Трансляция — преобразование с помощью транслятора, например nasm, текста программы в машинный код, называемый объектным. На данном этапе также может быть получен листинг программы, содержащий кроме текста программы различную дополнительную информацию, созданную транслятором. Тип объектного файла — o, файла листинга — lst. 3. Компоновка или линковка — этап обработки объектного кода компоновщиком (ld), который принимает на вход объектные файлы и собирает по ним исполняемый файл. Исполняемый файл обычно не имеет расширения. Кроме того, можно получить файл карты загрузки программы в ОЗУ, имеющий расширение map. 4. Запуск программы. Конечной целью является работоспособный исполняемый файл. Ошибки на предыдущих этапах могут привести к некорректной работе программы, поэтому может присутствовать этап отладки программы при помощи специальной программы — отладчика. При нахождении ошибки необходимо провести коррекцию программы, начиная с первого шага. 2.2.3. Транслятор NASM NASM превращает текст программы в объектный код. Например, для компиляции приведённого выше текста программы «Hello World» необходимо написать: nasm -f elf64 hello.asm Если текст программы набран без ошибок, то транслятор преобразует текст программы из файла hello.asm в объектный код, который запишется в файл hello.o. Таким образом, имена всех файлов получаются из имени входного файла и расширения по умолчанию. При наличии ошибок объектный файл не создаётся, а после запуска транслятора появятся сообщения об ошибках или предупреждения. NASM не запускают без параметров. Ключ -f указывает транслятору, что требуется создать бинарные файлы в формате ELF. Следует отметить, что формат elf64 позволяет создавать исполняемый код, работающий под 64битными версиями Linux. Для 32-битных версий ОС указываем в качестве формата просто elf. NASM всегда создаёт выходные файлы в текущем каталоге. 2.2.3.1. Расширенный синтаксис командной строки NASM Полный вариант командной строки nasm выглядит следующим образом: nasm [-@ косвенный_файл_настроек] [-o объектный_файл] [-f ^ формат_объектного_файла] [-1 листинг] [параметры...] ^ [--] исходный_файл Для более подробной информации см. man nasm. Для получения списка форматов объектного файла см. nasm -hf. Приведём пример. Команда nasm -f elf64 -g -l main.lst main.asm скомпилирует исходный файл main.asm в main.o, при этом формат выходного файла будет elf64, и в него будут включены символы для отладки (опция -g), кроме того, будет создан файл листинга main.lst. 2.2.3.2. Компоновщик LD Чтобы получить исполняемую программу, объектный файл необходимо передать на обработку компоновщику: ld -o hello hello.o Ключ -o с последующим значением задаёт в данном случае имя создаваемого исполняемого файла. В общем виде компоновщик ld имеет следующий формат командной строки: ld [параметры] объектные_файлы... Например, команда ld -Map main.map -o main main.o создаст исполняемый файл main из объектного файла main.o, при этом создавая карту памяти в файл main.map. Формат командной строки LD можно увидеть, набрав ld --help. Для получения более подробной информации см. man ld. Компоновщик ld не предполагает по умолчанию расширений для файлов, но принято использовать следующие расширения: - о для объектных файлов; - без расширения для исполняемых файлов; - map для файлов схемы программы; - lib для библиотек. Если имя выполняемого файла не определено, оно будет образовано из имени первого объектного файла. 2.2.3.3. Запуск исполняемого файла Запустить на выполнение созданный исполняемый файл, находящийся в текущем каталоге, можно, набрав в командной строке: ./hello 2.3. Порядок выполнения работы 1. Создайте в своём домашнем каталоге новый подкаталог с именем lab02 и файл lab2.asm: cd mkdir lab02 touch lab2.asm С помощью редактора mcedit введите в файл lab2.asm текст программы hello.asm из п. 2.2.2.1, пользуясь правилами оформления ассемблерных программ (не копируйте текст программы из файла pdf, так как некоторые символы могут скопироваться некорректно и программа не будет корректно транслироваться). 2. Оттранслируйте полученный текст программы в объектный файл. 3. Выполните компоновку объектного файла и запустите получившийся исполняемый файл. 4. Измените в тексте программы выводимую на экран строку с Hello world! на свою фамилию. Повторите пункты 2 и 3. 2.4. Содержание отчёта Отчёт должен включать: 1) титульный лист; 2) формулировку цели работы; 3) описание процесса выполнения задания. Для каждого действия, производимого в командной строке, в отчёт следует включить: - краткое описание действия; - вводимую команду или команды; - результаты выполнения команд и программ (снимок экрана); 4) выводы, согласованные с целью работы. 5) ответы на контрольные вопросы. 2.5. Контрольные вопросы 1. Какие основные отличия ассемблерных программ от программ на языках высокого уровня? 2. В чём состоит отличие инструкции от директивы на языке ассемблера? 3. Перечислите основные правила оформления программ на языке ассемблера. 4. Каковы этапы получения исполняемого файла? 5. Каково назначение этапа трансляции? 6. Каково назначение этапа компоновки? 7. Какие файлы могут создаваться при трансляции программы, какие из них создаются по умолчанию? 8. Каковы форматы файлов для nasm и ld? Список литературы 1. Расширенный ассемблер: NASM. — 2001. — URL:https : / / www . opennet.ru/docs/RUS/nasm/. 2. Столяров А. Программирование на языке ассемблера NASM для ОС Unix. — 2-е изд. — М. : МАКС Пресс, 2011. 3. Новожилов О. П. Архитектура ЭВМ и систем. — М. : Юрайт, 2016. 4. The NASM documentation. — 2017. — URL: https://www.nasm.us/ docs.php. 5. Куляс О. Л., Никитин К. А. Курс программирования на ASSEMBLER. — М. : Солон-Пресс, 2017. 6. Колдаев В. Д., Лупин С. А. Архитектура ЭВМ. — М. : Форум, 2018. ЛАБОРАТОРНАЯ РАБОТА № 3. ТРАНСЛЯЦИЯ ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕРА. СИСТЕМНЫЕ ВЫЗОВЫ В ОС GNU LINUX 3.1. Цель работы Приобретение практических навыков по разработке небольших командных файлов. Освоение инструкций языка ассемблера mov и int. 3.2. Предварительные сведения 3.2.1. Трансляция и компоновка программ с помощью make Программа make — это утилита, предназначенная для автоматизации действий по преобразованию файлов. В частности, с её помощью можно автоматизировать трансляцию и компоновку программ, написанных на ассемблере. Как вы уже знаете из предыдущей лабораторной работы, чтобы преобразовать файл с исходным кодом на ассемблере (main.asm) в исполняемый файл (main), следует выполнить следующие две команды: nasm -f elf64 -g -l main.lst main.asm ld -Map main.map -o main main.o В результате будет создан исполняемый файл main, а также объектный файл main.o, файл листинга main.lst и карта памяти main.map. Все дополнительные файлы можно удалить также из командной строк, используя команду rm: rm main main.o main.lst main.map В процессе разработки программного кода подобные команды вам придётся выполнять многократно. Кроме того, если программа будет состоять не из одного исходного файла, а из нескольких, то для каждого из них также придётся выполнять подобные команды. Поэтому удобно автоматизировать данные действия. Для этого и служит утилита make. Вызов утилиты make происходит из командной строки посредством ввода одноимённой команды и нажатия клавиши Enter. Утилита make попытается найти в текущей директории файл с именем Makefile и выполнить правила преобразования, записанные в нём. Если Makefile с инструкциями отсутствует, то утилита завершит своё выполнения и выведет сообщение об ошибке. Makefile представляет собой текстовый файл, который может содержать: - комментарии; - правила; - макроопределения. Создадим Makefile для автоматизации трансляции и линковки NASM программы. Для этого откроем текстовый редактор и наберём следующий тест (обратите внимание на наличие табуляции): build: main.asm nasm -f elf64 -g -l main.lst main.asm ld -Map main.map -o main main.o clean: rm -f main main.o main.lst main.map # здесь могут быть дополнительные команды В примере созданы два правила с именами («целями») build и clean. Первое из них (build) выполняет трансляцию и сборку программы main.asm, а второе (clean) удаляет все созданные предыдущим правилом файлы. Таким образом, если набрать в командной строке make build, то будет создан исполняемый файл из main.asm. Если набрать make clean, то проект будет очищен, т.е. будут удалены все файлы, создаваемые nasm и ld. Обратите внимание, что после цели build через двоеточие написано имя файла main.asm. Это указывает на то, что для выполнения цели build необходимо наличие файла main.asm в текущей директории. Это логично, так как без файла с исходным кодом создать программу не получится. Также обратите внимание, что команды в правилах (в отличие от целей) начинаются с отступа, который обязательно должен создаваться символом табуляции (клавиша Tab), а не пробелами. В редакторе mcedit для создания табуляции нужно в меню (вызывается клавишей F9 ) выбрать Настройка^ ^Общая и убрать галочку в пункте «Симулировать неполную табуляцию» (или при редактировании Makefile использовать для создания отступа клавишу Tab дважды).
3.2.2. Основы работы с Midnight Commander Midnight Commander (или просто mc) — это программа, которая позволяет просматривать структуру каталогов и выполнять основные операции по управлению файловой системой, т.е. mc является файловым менеджером. Для активации оболочки Midnight Commander достаточно ввести в командной строке mc и нажать клавишу Enter. Midnight Commander позволяет сделать работу с файлами более удобной и наглядной, хотя для работы с файлами и управления файловой системой могут быть использованы такие команды операционной системы, как pwd, ls, cd, mv, mkdir, rmdir, cp, rm, cat, more и т. д. В Midnight Commander используются функциональные клавиши F1 — F10, к которым привязаны часто выполняемые операции Таблица 3.1 Функциональные клавиши Midnight Commander Команда меню Дерево каталогов отображает структуру каталогов файловой системы. Меню Команда^Поиск файла или комбинация клавиш Alt + ? или Esc + ? позволяют вызвать интерфейс для поиска файлов, текста в файлах и т.п. Поскольку вопросительный знак в английской раскладке находится на одной кнопке с символом / , то для вызова поиска следует нажимать комбинацию Alt + Shift + / . Диалоговое окно «Поиск файла» позволяет найти на диске файл с заданным именем. После выбора этой команды запрашивается имя искомого файла и имя каталога, с которого необходимо начинать поиск. Графическая кнопка Дерево позволяет выбрать начальный каталог поиска из дерева каталогов. Поле «Содержание» (Contents) позволяет задать регулярное выражение для поиска по правилам команды egrep. Нажатие графической кнопки Дальше запускает процедуру поиска. Во время поиска его можно приостановить графической кнопкой Остановить и продолжить по кнопке Продолжить. С помощью клавиш Т и J- можно просматривать список найденных файлов. Графическая кнопка Перейти используется для перехода в каталог, в котором находится подсвеченный файл, а кнопка Повтор служит для задания параметров нового поиска. Для выхода из режима поиска предназначена графическая кнопка Выход. Следующие комбинации клавиш облегчают работу с Midnight Commander: - Ctrl + u (или через меню Команда^Переставить панели ) меняет местами содержимое правой и левой панелей; - Ctrl + o (или через меню Команда^Ътключить панели) скрывает или возвращает панели Midnight Commander, за которыми доступен для работы командный интерпретатор оболочки и выводимая туда информация. - Ctrl-x] Qd (или через меню Команда^Сравнить каталоги ) позволяет сравнить содержимое каталогов, отображаемых на левой и правой панелях. Меню Команда ^История команд (аналог команды history) выводит список ранее выполнявшихся команд. Подсвеченную строку из истории можно скопировать в командную строку оболочки (перемещение подсветки — клавишами Т и t , копирование — по клавише Enter). Меню Команда^Редактировать файл расширений позволяет редактировать файл mc.ext, в котором задаются правила связи определённых расширений файлов с инструментами их запуска или обработки (просмотра, редактирования или выполнения). Запуск выбранной программы осуществляется после выбора файла и нажатия клавиши Enter. Меню Команда^Редактировать файл меню предназначено для редактирования пользовательского меню (настройка клавиши F2 ). Дополнительную информацию о Midnight Commander можно получить по команде man mc. 3.2.3. Структура программы на языке ассемблера NASM Программа на языке ассемблера NASM, как правило, состоит из трёх секций: секция кода программы, секция инициированных (известных во время компиляции) данных и секция неинициализированных данных (тех, под которые во время компиляции только отводится память, а значение присваивается в ходе выполнения программы). В NASM эти секции определяются с помощью директивы SECTION. Традиционно секция кода называется .text, секция инициированных данных — .data, а секция неинициализированных данных — .bss. Таким образом, общая структура программы имеет следующий вид:
|