Лаба. Лабораторные работы (47). Лабораторная работа Основы интерфейса командной строки ос gnu linux Цель работы Приобретение практических навыков общения с операционной системой на уровне командной строки (вход и выход,
Скачать 109.84 Kb.
|
GLOBAL start
Для объявления инициированных данных в секции .data используются директивы DB, DW, DD, DQ и DT, которые резервируют память и указывают, какие значения должны храниться в этой памяти: - db (define byte) — определяет переменную размером в 1 байт; - dw (define word) — определяет переменную размеров в 2 байта (слово); - DD (define double word) — определяет переменную размером в 4 байта (двойное слово); - DQ (define quad word) — определяет переменную размером в 8 байт (учетверённое слово); - DT (define ten bytes) — определяет переменную размером в 10 байт. Директивы используются для объявления простых переменных и для объявления массивов. Для определения строк принято использовать директиву DB в связи с особенностями хранения данных в оперативной памяти. Синтаксис директив определения данных следующий: <имя> DB <операнд> [, <операнд>] [, <операнд>] Примеры:
Для объявления неинициированных данных в секции .bss используются директивы resb, resw, resd и другие, которые сообщают ассемблеру, что необходимо зарезервировать заданное количество ячеек памяти. Примеры их использования приведены в табл. 3.2. Таблица 3.2 Директивы для объявления неинициированных данных
3.2.4. Элементы программирования Описание инструкции mov. Инструкция языка ассемблера mov предназначена для дублирования данных источника в приёмнике. В общем виде эта инструкция записывается в виде mov dst,src Здесь dst — приёмник, src — источник. Переслать значение из одной ячейки памяти в другую нельзя, для этого необходимо использовать две инструкции mov: mov eax, x mov y, eax В табл. 3.3 приведены варианты использования mov с разными операндами: Таблица 3.3 Варианты использования mov с разными операндами
Описание инструкции int. Инструкция языка ассемблера int предназначена для вызова прерывания с указанным номером. В общем виде она записывается в виде int n Здесь n — номер прерывания, принадлежащий диапазону 0-255. При программировании в Linux с использованием вызовов ядра (sys_calls) n = 80h (принято задавать в шестнадцатеричной системе счисления). После вызова инструкции int 80h выполняется системный вызов какой- либо функции ядра Linux. При этом происходит передача управления ядру операционной системы. Чтобы узнать, какую именно системную функцию нужно выполнить, ядро извлекает номер системного вызова из регистра eax. Поэтому перед вызовом прерывания необходимо поместить в этот регистр нужный номер, например, выполнить mov eax, 3 для системного вызова номер 3. Многим системным функциям требуется передавать какие-либо параметры. По принятым в ОС Linux правилам эти параметры помещаются в порядке следования в остальные регистры процессора: ebx, ecx, edx и т. д. Если системная функция должна вернуть значение, то она помещает его в регистр eax. Системные вызовы для обеспечения диалога с пользователем. Простейший диалог с пользователем требует наличия двух функций — вывода текста на экран и ввода текста с клавиатуры. Простейший способ вывести строку на экран — использовать системный вызов write, который аналогичен функции write из языка Си и предназначен для записи данных в файл. Этот системный вызов имеет номер 4, поэтому перед вызовом инструкции int необходимо поместить значение 4 в регистр eax. Первым аргументом write, помещаемым в регистр ebx, задаётся дескриптор файла. Для вывода на экран в качестве дескриптора файла нужно указать 1 (это означает «стандартный вывод», т. е. вывод на экран). Вторым аргументом задаётся адрес выводимой строки (помещаем его в регистр ecx, например, инструкцией mov ecx, hello). Строка может иметь любую длину. Последним аргументом (т.е. в регистре edx) должна задаваться максимальная длина выводимой строки (посмотрите, как это делалось в программе из предыдущей работы). Для ввода строки с клавиатуры можно использовать аналогичный системный вызов read. Этот системный вызов имеет номер 3. Подробная информация о нём, предоставляемая командой man 2 read, показывает, что его аргументы — такие же, как у вызова write, только для «чтения» с клавиатуры используется файловый дескриптор 0 (стандартный ввод), а не 1 (стандартный вывод), как было при выводе на экран. Возвращаемое через регистр eax значение функции read — количество прочитанных с клавиатуры символов. Например, следующая программа ждёт ввода строки и введённую строку сохраняет в область памяти, помеченную меткой buf1: ; ; Программа ввода строки с клавиатуры ;
3.3. Порядок выполнения работы 1. Создайте в своём домашнем каталоге новый подкаталог с именем lab03a и файл asdfg.asm: cd mkdir lab03a touch asdfg.asm 2. Пользуясь информацией, приведённой в теоретической части, напишите программу, работающую по следующему алгоритму: (a) вывести приглашение типа «Введите строку:»; (b) ввести строку с клавиатуры; (c) вывести введённую строку на экран. 3. Получите исполняемый файл и проверьте его работу. На приглашение ввести строку введите свою фамилию. 4. Создайте в своём домашнем каталоге новый подкаталог lab03b и скопируйте в него созданный файл с текстом программы. 5. Скопируйте файл asdfg.asm в lab03-1.asm. 6. Оттранслируйте полученный текст программы в объектный файл по схеме lab03-1.asm^ q.o и asdfg.asm ^ w.o. 7. Создайте для make файл с явными правилами получения исполняемых файлов двух написанных программ. Проверьте работу make. 3.4. Содержание отчёта Отчёт должен включать: 1) титульный лист; 2) формулировку цели работы; 3) описание процесса выполнения задания. Для каждого действия, производимого в командной строке, в отчёт следует включить: - краткое описание действия; - вводимую команду или команды; - результаты выполнения команд и программ (снимок экрана); 4) листинги программ; 5) выводы, согласованные с целью работы. 6) ответы на контрольные вопросы. 3.5. Контрольные вопросы 1. Каково назначение утилиты make? 2. Где задаются правила поведения make? 3. Какое расширение у Makefile? 4. Какова структура программы на языке ассемблера NASM? 5. Для описания каких данных используются секции bss и data на языке ассемблера NASM? 6. Для чего используются компоненты db, dw, dd, dq и dt языка ассемблера NASM? 7. Какое произойдёт действие при выполнении инструкции mov eax, esi? 8. Для чего используется инструкция int 80h? При ответах на вопросы используйте сведения из [1—3]. Список литературы 1. Расширенный ассемблер: NASM. — 2001. — URL:https : / / www . opennet.ru/docs/RUS/nasm/. 2. Столяров А. Программирование на языке ассемблера NASM для ОС Unix. — 2-е изд. — М. : МАКС Пресс, 2011. 3. Куляс О. Л., Никитин К. А. Курс программирования на ASSEMBLER. — М. : Солон-Пресс, 2017. |