Главная страница

Лаба. Лабораторные работы (47). Лабораторная работа Основы интерфейса командной строки ос gnu linux Цель работы Приобретение практических навыков общения с операционной системой на уровне командной строки (вход и выход,


Скачать 109.84 Kb.
НазваниеЛабораторная работа Основы интерфейса командной строки ос gnu linux Цель работы Приобретение практических навыков общения с операционной системой на уровне командной строки (вход и выход,
АнкорЛаба
Дата04.11.2022
Размер109.84 Kb.
Формат файлаdocx
Имя файлаЛабораторные работы (47).docx
ТипЛабораторная работа
#770244
страница4 из 4
1   2   3   4

GLOBAL start

_start:

...

; Точка входа в программу

; Текст программы

mov eax,1

mov ebx,0

int 80h

; Системный вызов для выхода (sys_exit) ; Выход с кодом возврата 0 (без ошибок) ; Вызов ядра

Для объявления инициированных данных в секции .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 <операнд> [, <операнд>] [, <операнд>]

Примеры:

a db 10011001b

определяем переменную a размером 1 байт с начальным значением, заданным в двоичной системе счисления (на двоичную систему счисления указывает также буква b binary в конце числа)

b db '!'

определяем переменную b в 1 байт, инициализируемую символом ’!’

c db "Hello"

определяем строку из 5 байт

d dd -345d

определяем переменную d размером 4 байта с начальным значением, заданным в десятичной системе счисления (на десятичную систему указывает буква d decimal в конце числа)

h dd 0f1ah

определяем переменную h размером 4 байта с началь­ным значением, заданным в шестнадцатеричной системе счисления (h — hexadecimal)

Для объявления неинициированных данных в секции .bss используются директивы resb, resw, resd и другие, которые сообщают ассемблеру, что необходимо зарезервировать заданное количество ячеек памяти. Приме­ры их использования приведены в табл. 3.2.


Таблица 3.2

Директивы для объявления неинициированных данных

Директива

Назначение директивы

Аргумент

Назначение аргумента

resb

Резервирование заданного числа однобайтовых ячеек

string resb 20

По адресу с меткой string будет рас­положен массив из 20 однобайтовых ячеек (хранение строки символов)

resw

Резервирование заданного числа двухбайтовых ячеек (слов)

count resw 256

По адресу с меткой count будет рас­положен массив из 256 двухбайтовых слов

resd

Резервирование заданного числа четырёхбайтовых ячеек (двойных слов)

x resd 1

По адресу с меткой x будет расположе­но одно двойное слово (т.е. 4 байта для хранения боль­шого числа)

3.2.4. Элементы программирования

Описание инструкции mov. Инструкция языка ассемблера mov предна­значена для дублирования данных источника в приёмнике. В общем виде эта инструкция записывается в виде mov dst,src

Здесь dst — приёмник, src — источник.

Переслать значение из одной ячейки памяти в другую нельзя, для этого необходимо использовать две инструкции mov: mov eax, x

mov

y, eax

В табл. 3.3 приведены варианты использования mov с разными операнда­ми:

Таблица 3.3 Варианты использования mov с разными операндами

Пример

Пояснение

mov eax,403045h

mov cx,[eax]

mov eax,ebx

mov x,0

mov al,1000h

mov eax,cx

пишет в eax значение 403045

помещает в регистр cx значение (размера word) из

памяти, указанной в eax (403045)

пересылает значение регистра ebx в регистр e ax

записывает в переменную x значение 0

ошибка — попытка записать 2-байтное число в 1-

байтный регистр

ошибка — размеры операндов не совпадают

Описание инструкции 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: ;

; Программа ввода строки с клавиатуры

;

SECTION

buf1:

.bss

RESB 80

; Секция не инициированных данных

; Буфер размером 80 байт

SECTION

.text

; Код программы

GLOBAL _

start

; Начало программы

_start:




mov

eax, 3

; Системный вызов для чтения (sys_read)

mov

ebx, 0

; Дескриптор файла

mov

ecx, buf1

; 0 - стандартный ввод

; Адрес буфера под вводимую строку

mov

edx, 80

; Длина вводимой строки

int

80h

; Вызов ядра

mov

eax,1

; Системный вызов для выхода (sys_exit)

mov

ebx,0

; Выход с кодом возврата 0 (без ошибок)

int

80h

; Вызов ядра

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.
1   2   3   4


написать администратору сайта